@cherrystudio/provider-registry 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +166 -2
- package/data/models.json +22694 -0
- package/data/provider-models.json +41090 -0
- package/data/providers.json +2716 -0
- package/dist/bundled-catalog.cjs +12 -0
- package/dist/bundled-catalog.d.cts +5 -0
- package/dist/bundled-catalog.d.mts +5 -0
- package/dist/bundled-catalog.mjs +11 -0
- package/dist/bundled-models--P3b6A6o.mjs +25220 -0
- package/dist/bundled-models-uS9C7ldF.cjs +25224 -0
- package/dist/bundled-models.cjs +3 -0
- package/dist/bundled-models.d.cts +5 -0
- package/dist/bundled-models.d.mts +5 -0
- package/dist/bundled-models.mjs +2 -0
- package/dist/bundled-provider-models-CT2Ha5w2.cjs +37586 -0
- package/dist/bundled-provider-models-y-RYjBUH.mjs +37582 -0
- package/dist/bundled-provider-models.cjs +3 -0
- package/dist/bundled-provider-models.d.cts +5 -0
- package/dist/bundled-provider-models.d.mts +5 -0
- package/dist/bundled-provider-models.mjs +2 -0
- package/dist/bundled-providers-BZisTfNC.cjs +2174 -0
- package/dist/bundled-providers-BiPpU5W4.mjs +2170 -0
- package/dist/bundled-providers.cjs +3 -0
- package/dist/bundled-providers.d.cts +5 -0
- package/dist/bundled-providers.d.mts +5 -0
- package/dist/bundled-providers.mjs +2 -0
- package/dist/catalog-DElG_l-8.mjs +369 -0
- package/dist/catalog-DurdOhD0.cjs +442 -0
- package/dist/catalog-XJyrtwI9.d.cts +53 -0
- package/dist/catalog-XJyrtwI9.d.mts +53 -0
- package/dist/index.cjs +2620 -0
- package/dist/index.d.cts +3932 -0
- package/dist/index.d.mts +3932 -0
- package/dist/index.mjs +2549 -0
- package/dist/model-NFEbqWMs.mjs +665 -0
- package/dist/model-kwW2vWDI.cjs +855 -0
- package/dist/provider-D14qMZsE.mjs +431 -0
- package/dist/provider-DkSIaann.cjs +527 -0
- package/dist/provider-models-BjKC53mr.cjs +85 -0
- package/dist/provider-models-BkxD9T17.mjs +67 -0
- package/dist/provider-models-DuZBXGmP.d.cts +28692 -0
- package/dist/provider-models-DuZBXGmP.d.mts +28692 -0
- package/dist/registry-BjETdicx.d.mts +35 -0
- package/dist/registry-Di5ULW6Z.d.cts +35 -0
- package/dist/registry-loader.cjs +170 -0
- package/dist/registry-loader.d.cts +64 -0
- package/dist/registry-loader.d.mts +64 -0
- package/dist/registry-loader.mjs +156 -0
- package/package.json +146 -3
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { X as ModelConfig, c as ProviderConfig, n as ProviderModelOverride } from "./provider-models-DuZBXGmP.mjs";
|
|
2
|
+
//#region src/registry.d.ts
|
|
3
|
+
interface ModelSnapshot {
|
|
4
|
+
readonly models: {
|
|
5
|
+
readonly version: string;
|
|
6
|
+
readonly models: readonly ModelConfig[];
|
|
7
|
+
};
|
|
8
|
+
readonly providerModels: {
|
|
9
|
+
readonly version: string;
|
|
10
|
+
readonly overrides: readonly ProviderModelOverride[];
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
interface RegistryCatalog extends ModelSnapshot {
|
|
14
|
+
readonly providers: {
|
|
15
|
+
readonly version: string;
|
|
16
|
+
readonly providers: readonly ProviderConfig[];
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
interface Registry {
|
|
20
|
+
listProviders(): readonly ProviderConfig[];
|
|
21
|
+
listModels(): readonly ModelConfig[];
|
|
22
|
+
getOverridesForProvider(providerId: string): readonly ProviderModelOverride[];
|
|
23
|
+
findProvider(providerId: string): ProviderConfig | null;
|
|
24
|
+
findModel(modelId: string): ModelConfig | null;
|
|
25
|
+
findOverride(providerId: string, modelId: string): ProviderModelOverride | null;
|
|
26
|
+
}
|
|
27
|
+
/** Parse untrusted model metadata; provider routing is supplied separately by the application. */
|
|
28
|
+
declare function parseModelSnapshot(input: {
|
|
29
|
+
models: unknown;
|
|
30
|
+
providerModels: unknown;
|
|
31
|
+
}): ModelSnapshot;
|
|
32
|
+
/** Build a query view over a validated catalog. Treat the input and returned records as read-only. */
|
|
33
|
+
declare function createRegistry(catalog: RegistryCatalog): Registry;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { parseModelSnapshot as a, createRegistry as i, Registry as n, RegistryCatalog as r, ModelSnapshot as t };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { X as ModelConfig, c as ProviderConfig, n as ProviderModelOverride } from "./provider-models-DuZBXGmP.cjs";
|
|
2
|
+
//#region src/registry.d.ts
|
|
3
|
+
interface ModelSnapshot {
|
|
4
|
+
readonly models: {
|
|
5
|
+
readonly version: string;
|
|
6
|
+
readonly models: readonly ModelConfig[];
|
|
7
|
+
};
|
|
8
|
+
readonly providerModels: {
|
|
9
|
+
readonly version: string;
|
|
10
|
+
readonly overrides: readonly ProviderModelOverride[];
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
interface RegistryCatalog extends ModelSnapshot {
|
|
14
|
+
readonly providers: {
|
|
15
|
+
readonly version: string;
|
|
16
|
+
readonly providers: readonly ProviderConfig[];
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
interface Registry {
|
|
20
|
+
listProviders(): readonly ProviderConfig[];
|
|
21
|
+
listModels(): readonly ModelConfig[];
|
|
22
|
+
getOverridesForProvider(providerId: string): readonly ProviderModelOverride[];
|
|
23
|
+
findProvider(providerId: string): ProviderConfig | null;
|
|
24
|
+
findModel(modelId: string): ModelConfig | null;
|
|
25
|
+
findOverride(providerId: string, modelId: string): ProviderModelOverride | null;
|
|
26
|
+
}
|
|
27
|
+
/** Parse untrusted model metadata; provider routing is supplied separately by the application. */
|
|
28
|
+
declare function parseModelSnapshot(input: {
|
|
29
|
+
models: unknown;
|
|
30
|
+
providerModels: unknown;
|
|
31
|
+
}): ModelSnapshot;
|
|
32
|
+
/** Build a query view over a validated catalog. Treat the input and returned records as read-only. */
|
|
33
|
+
declare function createRegistry(catalog: RegistryCatalog): Registry;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { parseModelSnapshot as a, createRegistry as i, Registry as n, RegistryCatalog as r, ModelSnapshot as t };
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_model = require("./model-kwW2vWDI.cjs");
|
|
3
|
+
const require_catalog = require("./catalog-DurdOhD0.cjs");
|
|
4
|
+
const require_provider = require("./provider-DkSIaann.cjs");
|
|
5
|
+
const require_provider_models = require("./provider-models-BjKC53mr.cjs");
|
|
6
|
+
let node_fs = require("node:fs");
|
|
7
|
+
let semver = require("semver");
|
|
8
|
+
semver = require_model.__toESM(semver, 1);
|
|
9
|
+
//#region src/registry-loader.ts
|
|
10
|
+
/**
|
|
11
|
+
* Registry Loader — read, validate, cache, and query registry JSON data.
|
|
12
|
+
*
|
|
13
|
+
* Cached data auto-expires after an idle period (default 30s).
|
|
14
|
+
* Any access resets the timer. When the timer fires, all data and indexes
|
|
15
|
+
* are released — the next access triggers a fresh load from disk.
|
|
16
|
+
*/
|
|
17
|
+
/** Whether this app lies inside the manifest's explicit semantic and freshness range. */
|
|
18
|
+
function isCatalogManifestCompatible(manifest, appVersion) {
|
|
19
|
+
if (manifest.schemaVersion !== 3) return false;
|
|
20
|
+
const app = semver.default.coerce(appVersion)?.version;
|
|
21
|
+
const minimum = semver.default.coerce(manifest.minAppVersion)?.version;
|
|
22
|
+
const source = semver.default.coerce(manifest.sourceAppVersion)?.version;
|
|
23
|
+
if (!app || !minimum || !source) return false;
|
|
24
|
+
return semver.default.gte(app, minimum) && semver.default.lte(app, source);
|
|
25
|
+
}
|
|
26
|
+
function readAndParse(jsonPath, schema) {
|
|
27
|
+
try {
|
|
28
|
+
const data = JSON.parse((0, node_fs.readFileSync)(jsonPath, "utf-8"));
|
|
29
|
+
return schema.parse(data);
|
|
30
|
+
} catch (error) {
|
|
31
|
+
throw new Error(`Failed to load registry file: ${jsonPath}`, { cause: error });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function readModelRegistry(jsonPath) {
|
|
35
|
+
const registry = readAndParse(jsonPath, require_model.ModelListSchema);
|
|
36
|
+
return {
|
|
37
|
+
version: registry.version,
|
|
38
|
+
models: registry.models
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function readProviderRegistry(jsonPath) {
|
|
42
|
+
const registry = readAndParse(jsonPath, require_provider.ProviderListSchema);
|
|
43
|
+
return {
|
|
44
|
+
version: registry.version,
|
|
45
|
+
providers: registry.providers
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function readProviderModelRegistry(jsonPath) {
|
|
49
|
+
const registry = readAndParse(jsonPath, require_provider_models.ProviderModelListSchema);
|
|
50
|
+
return {
|
|
51
|
+
version: registry.version,
|
|
52
|
+
overrides: registry.overrides
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/** Default idle TTL in milliseconds (30 seconds). */
|
|
56
|
+
const DEFAULT_IDLE_TTL_MS = 3e4;
|
|
57
|
+
/**
|
|
58
|
+
* Cached registry data with pre-computed indexes and idle auto-expiry.
|
|
59
|
+
*
|
|
60
|
+
* Data is lazily loaded on first access, indexes are built once after load,
|
|
61
|
+
* and everything is released after {@link idleTtlMs} of no access.
|
|
62
|
+
*/
|
|
63
|
+
var RegistryLoader = class {
|
|
64
|
+
constructor(paths, idleTtlMs) {
|
|
65
|
+
this.paths = paths;
|
|
66
|
+
this.models = null;
|
|
67
|
+
this.providers = null;
|
|
68
|
+
this.providerModels = null;
|
|
69
|
+
this.modelsVersion = null;
|
|
70
|
+
this.providersVersion = null;
|
|
71
|
+
this.providerModelsVersion = null;
|
|
72
|
+
this.modelIndex = null;
|
|
73
|
+
this.overrideIndex = null;
|
|
74
|
+
this.idleTimer = null;
|
|
75
|
+
this.idleTtlMs = idleTtlMs ?? DEFAULT_IDLE_TTL_MS;
|
|
76
|
+
}
|
|
77
|
+
/** Reset the idle timer. Called on every public access. */
|
|
78
|
+
touch() {
|
|
79
|
+
if (this.idleTimer) clearTimeout(this.idleTimer);
|
|
80
|
+
this.idleTimer = setTimeout(() => this.invalidate(), this.idleTtlMs);
|
|
81
|
+
}
|
|
82
|
+
/** Load and cache models.json. Returns models array. */
|
|
83
|
+
loadModels() {
|
|
84
|
+
this.touch();
|
|
85
|
+
if (this.models) return this.models;
|
|
86
|
+
const data = readModelRegistry(this.paths.models);
|
|
87
|
+
this.models = data.models ?? [];
|
|
88
|
+
this.modelsVersion = data.version;
|
|
89
|
+
this.modelIndex = new require_catalog.ModelIndex(this.models);
|
|
90
|
+
return this.models;
|
|
91
|
+
}
|
|
92
|
+
/** Load and cache providers.json. Returns providers array. */
|
|
93
|
+
loadProviders() {
|
|
94
|
+
this.touch();
|
|
95
|
+
if (this.providers) return this.providers;
|
|
96
|
+
const data = readProviderRegistry(this.paths.providers);
|
|
97
|
+
this.providers = data.providers ?? [];
|
|
98
|
+
this.providersVersion = data.version;
|
|
99
|
+
return this.providers;
|
|
100
|
+
}
|
|
101
|
+
/** Load and cache provider-models.json. Returns overrides array. */
|
|
102
|
+
loadProviderModels() {
|
|
103
|
+
this.touch();
|
|
104
|
+
if (this.providerModels) return this.providerModels;
|
|
105
|
+
const data = readProviderModelRegistry(this.paths.providerModels);
|
|
106
|
+
this.providerModels = data.overrides ?? [];
|
|
107
|
+
this.providerModelsVersion = data.version;
|
|
108
|
+
this.overrideIndex = new require_catalog.ProviderModelIndex(this.providerModels);
|
|
109
|
+
return this.providerModels;
|
|
110
|
+
}
|
|
111
|
+
/** Get the models.json version string. */
|
|
112
|
+
getModelsVersion() {
|
|
113
|
+
this.loadModels();
|
|
114
|
+
return this.modelsVersion;
|
|
115
|
+
}
|
|
116
|
+
/** Get the providers.json version string. */
|
|
117
|
+
getProvidersVersion() {
|
|
118
|
+
this.loadProviders();
|
|
119
|
+
return this.providersVersion;
|
|
120
|
+
}
|
|
121
|
+
/** Get the provider-models.json version string. */
|
|
122
|
+
getProviderModelsVersion() {
|
|
123
|
+
this.loadProviderModels();
|
|
124
|
+
return this.providerModelsVersion;
|
|
125
|
+
}
|
|
126
|
+
findProvider(providerId) {
|
|
127
|
+
return this.loadProviders().find((p) => p.id === providerId) ?? null;
|
|
128
|
+
}
|
|
129
|
+
findModel(modelId) {
|
|
130
|
+
this.loadModels();
|
|
131
|
+
return this.modelIndex.findModel(modelId);
|
|
132
|
+
}
|
|
133
|
+
findOverride(providerId, modelId) {
|
|
134
|
+
this.loadProviderModels();
|
|
135
|
+
return this.overrideIndex.findOverride(providerId, modelId);
|
|
136
|
+
}
|
|
137
|
+
getOverridesForProvider(providerId) {
|
|
138
|
+
this.loadProviderModels();
|
|
139
|
+
return this.overrideIndex.getOverridesForProvider(providerId);
|
|
140
|
+
}
|
|
141
|
+
/** Release all cached data and indexes. Next access triggers a fresh load. */
|
|
142
|
+
invalidate() {
|
|
143
|
+
this.models = null;
|
|
144
|
+
this.providers = null;
|
|
145
|
+
this.providerModels = null;
|
|
146
|
+
this.modelsVersion = null;
|
|
147
|
+
this.providersVersion = null;
|
|
148
|
+
this.providerModelsVersion = null;
|
|
149
|
+
this.modelIndex = null;
|
|
150
|
+
this.overrideIndex = null;
|
|
151
|
+
if (this.idleTimer) {
|
|
152
|
+
clearTimeout(this.idleTimer);
|
|
153
|
+
this.idleTimer = null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
//#endregion
|
|
158
|
+
exports.CatalogManifestSchema = require_catalog.CatalogManifestSchema;
|
|
159
|
+
exports.ModelListSchema = require_model.ModelListSchema;
|
|
160
|
+
exports.ProviderListSchema = require_provider.ProviderListSchema;
|
|
161
|
+
exports.ProviderModelListSchema = require_provider_models.ProviderModelListSchema;
|
|
162
|
+
exports.REGISTRY_FILES = require_catalog.REGISTRY_FILES;
|
|
163
|
+
exports.REGISTRY_MIN_APP_VERSION = require_catalog.REGISTRY_MIN_APP_VERSION;
|
|
164
|
+
exports.REGISTRY_SCHEMA_VERSION = require_catalog.REGISTRY_SCHEMA_VERSION;
|
|
165
|
+
exports.REMOTE_REGISTRY_FILES = require_catalog.REMOTE_REGISTRY_FILES;
|
|
166
|
+
exports.RegistryLoader = RegistryLoader;
|
|
167
|
+
exports.isCatalogManifestCompatible = isCatalogManifestCompatible;
|
|
168
|
+
exports.readModelRegistry = readModelRegistry;
|
|
169
|
+
exports.readProviderModelRegistry = readProviderModelRegistry;
|
|
170
|
+
exports.readProviderRegistry = readProviderRegistry;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Q as ModelListSchema, X as ModelConfig, c as ProviderConfig, f as ProviderListSchema, n as ProviderModelOverride, t as ProviderModelListSchema } from "./provider-models-DuZBXGmP.cjs";
|
|
2
|
+
import { a as REGISTRY_SCHEMA_VERSION, c as RemoteRegistryFileName, i as REGISTRY_MIN_APP_VERSION, n as CatalogManifestSchema, o as REMOTE_REGISTRY_FILES, r as REGISTRY_FILES, s as RegistryFileName, t as CatalogManifest } from "./catalog-XJyrtwI9.cjs";
|
|
3
|
+
//#region src/registry-loader.d.ts
|
|
4
|
+
/** Whether this app lies inside the manifest's explicit semantic and freshness range. */
|
|
5
|
+
declare function isCatalogManifestCompatible(manifest: CatalogManifest, appVersion: string): boolean;
|
|
6
|
+
declare function readModelRegistry(jsonPath: string): {
|
|
7
|
+
version: string;
|
|
8
|
+
models: ModelConfig[];
|
|
9
|
+
};
|
|
10
|
+
declare function readProviderRegistry(jsonPath: string): {
|
|
11
|
+
version: string;
|
|
12
|
+
providers: ProviderConfig[];
|
|
13
|
+
};
|
|
14
|
+
declare function readProviderModelRegistry(jsonPath: string): {
|
|
15
|
+
version: string;
|
|
16
|
+
overrides: ProviderModelOverride[];
|
|
17
|
+
};
|
|
18
|
+
interface RegistryPaths {
|
|
19
|
+
models: string;
|
|
20
|
+
providers: string;
|
|
21
|
+
providerModels: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Cached registry data with pre-computed indexes and idle auto-expiry.
|
|
25
|
+
*
|
|
26
|
+
* Data is lazily loaded on first access, indexes are built once after load,
|
|
27
|
+
* and everything is released after {@link idleTtlMs} of no access.
|
|
28
|
+
*/
|
|
29
|
+
declare class RegistryLoader {
|
|
30
|
+
private readonly paths;
|
|
31
|
+
private models;
|
|
32
|
+
private providers;
|
|
33
|
+
private providerModels;
|
|
34
|
+
private modelsVersion;
|
|
35
|
+
private providersVersion;
|
|
36
|
+
private providerModelsVersion;
|
|
37
|
+
private modelIndex;
|
|
38
|
+
private overrideIndex;
|
|
39
|
+
private idleTimer;
|
|
40
|
+
private readonly idleTtlMs;
|
|
41
|
+
constructor(paths: RegistryPaths, idleTtlMs?: number);
|
|
42
|
+
/** Reset the idle timer. Called on every public access. */
|
|
43
|
+
private touch;
|
|
44
|
+
/** Load and cache models.json. Returns models array. */
|
|
45
|
+
loadModels(): ModelConfig[];
|
|
46
|
+
/** Load and cache providers.json. Returns providers array. */
|
|
47
|
+
loadProviders(): ProviderConfig[];
|
|
48
|
+
/** Load and cache provider-models.json. Returns overrides array. */
|
|
49
|
+
loadProviderModels(): ProviderModelOverride[];
|
|
50
|
+
/** Get the models.json version string. */
|
|
51
|
+
getModelsVersion(): string;
|
|
52
|
+
/** Get the providers.json version string. */
|
|
53
|
+
getProvidersVersion(): string;
|
|
54
|
+
/** Get the provider-models.json version string. */
|
|
55
|
+
getProviderModelsVersion(): string;
|
|
56
|
+
findProvider(providerId: string): ProviderConfig | null;
|
|
57
|
+
findModel(modelId: string): ModelConfig | null;
|
|
58
|
+
findOverride(providerId: string, modelId: string): ProviderModelOverride | null;
|
|
59
|
+
getOverridesForProvider(providerId: string): ProviderModelOverride[];
|
|
60
|
+
/** Release all cached data and indexes. Next access triggers a fresh load. */
|
|
61
|
+
invalidate(): void;
|
|
62
|
+
}
|
|
63
|
+
//#endregion
|
|
64
|
+
export { type CatalogManifest, CatalogManifestSchema, ModelListSchema, ProviderListSchema, ProviderModelListSchema, REGISTRY_FILES, REGISTRY_MIN_APP_VERSION, REGISTRY_SCHEMA_VERSION, REMOTE_REGISTRY_FILES, type RegistryFileName, RegistryLoader, RegistryPaths, type RemoteRegistryFileName, isCatalogManifestCompatible, readModelRegistry, readProviderModelRegistry, readProviderRegistry };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Q as ModelListSchema, X as ModelConfig, c as ProviderConfig, f as ProviderListSchema, n as ProviderModelOverride, t as ProviderModelListSchema } from "./provider-models-DuZBXGmP.mjs";
|
|
2
|
+
import { a as REGISTRY_SCHEMA_VERSION, c as RemoteRegistryFileName, i as REGISTRY_MIN_APP_VERSION, n as CatalogManifestSchema, o as REMOTE_REGISTRY_FILES, r as REGISTRY_FILES, s as RegistryFileName, t as CatalogManifest } from "./catalog-XJyrtwI9.mjs";
|
|
3
|
+
//#region src/registry-loader.d.ts
|
|
4
|
+
/** Whether this app lies inside the manifest's explicit semantic and freshness range. */
|
|
5
|
+
declare function isCatalogManifestCompatible(manifest: CatalogManifest, appVersion: string): boolean;
|
|
6
|
+
declare function readModelRegistry(jsonPath: string): {
|
|
7
|
+
version: string;
|
|
8
|
+
models: ModelConfig[];
|
|
9
|
+
};
|
|
10
|
+
declare function readProviderRegistry(jsonPath: string): {
|
|
11
|
+
version: string;
|
|
12
|
+
providers: ProviderConfig[];
|
|
13
|
+
};
|
|
14
|
+
declare function readProviderModelRegistry(jsonPath: string): {
|
|
15
|
+
version: string;
|
|
16
|
+
overrides: ProviderModelOverride[];
|
|
17
|
+
};
|
|
18
|
+
interface RegistryPaths {
|
|
19
|
+
models: string;
|
|
20
|
+
providers: string;
|
|
21
|
+
providerModels: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Cached registry data with pre-computed indexes and idle auto-expiry.
|
|
25
|
+
*
|
|
26
|
+
* Data is lazily loaded on first access, indexes are built once after load,
|
|
27
|
+
* and everything is released after {@link idleTtlMs} of no access.
|
|
28
|
+
*/
|
|
29
|
+
declare class RegistryLoader {
|
|
30
|
+
private readonly paths;
|
|
31
|
+
private models;
|
|
32
|
+
private providers;
|
|
33
|
+
private providerModels;
|
|
34
|
+
private modelsVersion;
|
|
35
|
+
private providersVersion;
|
|
36
|
+
private providerModelsVersion;
|
|
37
|
+
private modelIndex;
|
|
38
|
+
private overrideIndex;
|
|
39
|
+
private idleTimer;
|
|
40
|
+
private readonly idleTtlMs;
|
|
41
|
+
constructor(paths: RegistryPaths, idleTtlMs?: number);
|
|
42
|
+
/** Reset the idle timer. Called on every public access. */
|
|
43
|
+
private touch;
|
|
44
|
+
/** Load and cache models.json. Returns models array. */
|
|
45
|
+
loadModels(): ModelConfig[];
|
|
46
|
+
/** Load and cache providers.json. Returns providers array. */
|
|
47
|
+
loadProviders(): ProviderConfig[];
|
|
48
|
+
/** Load and cache provider-models.json. Returns overrides array. */
|
|
49
|
+
loadProviderModels(): ProviderModelOverride[];
|
|
50
|
+
/** Get the models.json version string. */
|
|
51
|
+
getModelsVersion(): string;
|
|
52
|
+
/** Get the providers.json version string. */
|
|
53
|
+
getProvidersVersion(): string;
|
|
54
|
+
/** Get the provider-models.json version string. */
|
|
55
|
+
getProviderModelsVersion(): string;
|
|
56
|
+
findProvider(providerId: string): ProviderConfig | null;
|
|
57
|
+
findModel(modelId: string): ModelConfig | null;
|
|
58
|
+
findOverride(providerId: string, modelId: string): ProviderModelOverride | null;
|
|
59
|
+
getOverridesForProvider(providerId: string): ProviderModelOverride[];
|
|
60
|
+
/** Release all cached data and indexes. Next access triggers a fresh load. */
|
|
61
|
+
invalidate(): void;
|
|
62
|
+
}
|
|
63
|
+
//#endregion
|
|
64
|
+
export { type CatalogManifest, CatalogManifestSchema, ModelListSchema, ProviderListSchema, ProviderModelListSchema, REGISTRY_FILES, REGISTRY_MIN_APP_VERSION, REGISTRY_SCHEMA_VERSION, REMOTE_REGISTRY_FILES, type RegistryFileName, RegistryLoader, RegistryPaths, type RemoteRegistryFileName, isCatalogManifestCompatible, readModelRegistry, readProviderModelRegistry, readProviderRegistry };
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { a as REMOTE_REGISTRY_FILES, i as REGISTRY_SCHEMA_VERSION, n as REGISTRY_FILES, o as ModelIndex, r as REGISTRY_MIN_APP_VERSION, s as ProviderModelIndex, t as CatalogManifestSchema } from "./catalog-DElG_l-8.mjs";
|
|
2
|
+
import { o as ModelListSchema } from "./model-NFEbqWMs.mjs";
|
|
3
|
+
import { i as ProviderListSchema } from "./provider-D14qMZsE.mjs";
|
|
4
|
+
import { t as ProviderModelListSchema } from "./provider-models-BkxD9T17.mjs";
|
|
5
|
+
import { readFileSync } from "node:fs";
|
|
6
|
+
import semver from "semver";
|
|
7
|
+
//#region src/registry-loader.ts
|
|
8
|
+
/**
|
|
9
|
+
* Registry Loader — read, validate, cache, and query registry JSON data.
|
|
10
|
+
*
|
|
11
|
+
* Cached data auto-expires after an idle period (default 30s).
|
|
12
|
+
* Any access resets the timer. When the timer fires, all data and indexes
|
|
13
|
+
* are released — the next access triggers a fresh load from disk.
|
|
14
|
+
*/
|
|
15
|
+
/** Whether this app lies inside the manifest's explicit semantic and freshness range. */
|
|
16
|
+
function isCatalogManifestCompatible(manifest, appVersion) {
|
|
17
|
+
if (manifest.schemaVersion !== 3) return false;
|
|
18
|
+
const app = semver.coerce(appVersion)?.version;
|
|
19
|
+
const minimum = semver.coerce(manifest.minAppVersion)?.version;
|
|
20
|
+
const source = semver.coerce(manifest.sourceAppVersion)?.version;
|
|
21
|
+
if (!app || !minimum || !source) return false;
|
|
22
|
+
return semver.gte(app, minimum) && semver.lte(app, source);
|
|
23
|
+
}
|
|
24
|
+
function readAndParse(jsonPath, schema) {
|
|
25
|
+
try {
|
|
26
|
+
const data = JSON.parse(readFileSync(jsonPath, "utf-8"));
|
|
27
|
+
return schema.parse(data);
|
|
28
|
+
} catch (error) {
|
|
29
|
+
throw new Error(`Failed to load registry file: ${jsonPath}`, { cause: error });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function readModelRegistry(jsonPath) {
|
|
33
|
+
const registry = readAndParse(jsonPath, ModelListSchema);
|
|
34
|
+
return {
|
|
35
|
+
version: registry.version,
|
|
36
|
+
models: registry.models
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function readProviderRegistry(jsonPath) {
|
|
40
|
+
const registry = readAndParse(jsonPath, ProviderListSchema);
|
|
41
|
+
return {
|
|
42
|
+
version: registry.version,
|
|
43
|
+
providers: registry.providers
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function readProviderModelRegistry(jsonPath) {
|
|
47
|
+
const registry = readAndParse(jsonPath, ProviderModelListSchema);
|
|
48
|
+
return {
|
|
49
|
+
version: registry.version,
|
|
50
|
+
overrides: registry.overrides
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** Default idle TTL in milliseconds (30 seconds). */
|
|
54
|
+
const DEFAULT_IDLE_TTL_MS = 3e4;
|
|
55
|
+
/**
|
|
56
|
+
* Cached registry data with pre-computed indexes and idle auto-expiry.
|
|
57
|
+
*
|
|
58
|
+
* Data is lazily loaded on first access, indexes are built once after load,
|
|
59
|
+
* and everything is released after {@link idleTtlMs} of no access.
|
|
60
|
+
*/
|
|
61
|
+
var RegistryLoader = class {
|
|
62
|
+
constructor(paths, idleTtlMs) {
|
|
63
|
+
this.paths = paths;
|
|
64
|
+
this.models = null;
|
|
65
|
+
this.providers = null;
|
|
66
|
+
this.providerModels = null;
|
|
67
|
+
this.modelsVersion = null;
|
|
68
|
+
this.providersVersion = null;
|
|
69
|
+
this.providerModelsVersion = null;
|
|
70
|
+
this.modelIndex = null;
|
|
71
|
+
this.overrideIndex = null;
|
|
72
|
+
this.idleTimer = null;
|
|
73
|
+
this.idleTtlMs = idleTtlMs ?? DEFAULT_IDLE_TTL_MS;
|
|
74
|
+
}
|
|
75
|
+
/** Reset the idle timer. Called on every public access. */
|
|
76
|
+
touch() {
|
|
77
|
+
if (this.idleTimer) clearTimeout(this.idleTimer);
|
|
78
|
+
this.idleTimer = setTimeout(() => this.invalidate(), this.idleTtlMs);
|
|
79
|
+
}
|
|
80
|
+
/** Load and cache models.json. Returns models array. */
|
|
81
|
+
loadModels() {
|
|
82
|
+
this.touch();
|
|
83
|
+
if (this.models) return this.models;
|
|
84
|
+
const data = readModelRegistry(this.paths.models);
|
|
85
|
+
this.models = data.models ?? [];
|
|
86
|
+
this.modelsVersion = data.version;
|
|
87
|
+
this.modelIndex = new ModelIndex(this.models);
|
|
88
|
+
return this.models;
|
|
89
|
+
}
|
|
90
|
+
/** Load and cache providers.json. Returns providers array. */
|
|
91
|
+
loadProviders() {
|
|
92
|
+
this.touch();
|
|
93
|
+
if (this.providers) return this.providers;
|
|
94
|
+
const data = readProviderRegistry(this.paths.providers);
|
|
95
|
+
this.providers = data.providers ?? [];
|
|
96
|
+
this.providersVersion = data.version;
|
|
97
|
+
return this.providers;
|
|
98
|
+
}
|
|
99
|
+
/** Load and cache provider-models.json. Returns overrides array. */
|
|
100
|
+
loadProviderModels() {
|
|
101
|
+
this.touch();
|
|
102
|
+
if (this.providerModels) return this.providerModels;
|
|
103
|
+
const data = readProviderModelRegistry(this.paths.providerModels);
|
|
104
|
+
this.providerModels = data.overrides ?? [];
|
|
105
|
+
this.providerModelsVersion = data.version;
|
|
106
|
+
this.overrideIndex = new ProviderModelIndex(this.providerModels);
|
|
107
|
+
return this.providerModels;
|
|
108
|
+
}
|
|
109
|
+
/** Get the models.json version string. */
|
|
110
|
+
getModelsVersion() {
|
|
111
|
+
this.loadModels();
|
|
112
|
+
return this.modelsVersion;
|
|
113
|
+
}
|
|
114
|
+
/** Get the providers.json version string. */
|
|
115
|
+
getProvidersVersion() {
|
|
116
|
+
this.loadProviders();
|
|
117
|
+
return this.providersVersion;
|
|
118
|
+
}
|
|
119
|
+
/** Get the provider-models.json version string. */
|
|
120
|
+
getProviderModelsVersion() {
|
|
121
|
+
this.loadProviderModels();
|
|
122
|
+
return this.providerModelsVersion;
|
|
123
|
+
}
|
|
124
|
+
findProvider(providerId) {
|
|
125
|
+
return this.loadProviders().find((p) => p.id === providerId) ?? null;
|
|
126
|
+
}
|
|
127
|
+
findModel(modelId) {
|
|
128
|
+
this.loadModels();
|
|
129
|
+
return this.modelIndex.findModel(modelId);
|
|
130
|
+
}
|
|
131
|
+
findOverride(providerId, modelId) {
|
|
132
|
+
this.loadProviderModels();
|
|
133
|
+
return this.overrideIndex.findOverride(providerId, modelId);
|
|
134
|
+
}
|
|
135
|
+
getOverridesForProvider(providerId) {
|
|
136
|
+
this.loadProviderModels();
|
|
137
|
+
return this.overrideIndex.getOverridesForProvider(providerId);
|
|
138
|
+
}
|
|
139
|
+
/** Release all cached data and indexes. Next access triggers a fresh load. */
|
|
140
|
+
invalidate() {
|
|
141
|
+
this.models = null;
|
|
142
|
+
this.providers = null;
|
|
143
|
+
this.providerModels = null;
|
|
144
|
+
this.modelsVersion = null;
|
|
145
|
+
this.providersVersion = null;
|
|
146
|
+
this.providerModelsVersion = null;
|
|
147
|
+
this.modelIndex = null;
|
|
148
|
+
this.overrideIndex = null;
|
|
149
|
+
if (this.idleTimer) {
|
|
150
|
+
clearTimeout(this.idleTimer);
|
|
151
|
+
this.idleTimer = null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
//#endregion
|
|
156
|
+
export { CatalogManifestSchema, ModelListSchema, ProviderListSchema, ProviderModelListSchema, REGISTRY_FILES, REGISTRY_MIN_APP_VERSION, REGISTRY_SCHEMA_VERSION, REMOTE_REGISTRY_FILES, RegistryLoader, isCatalogManifestCompatible, readModelRegistry, readProviderModelRegistry, readProviderRegistry };
|
package/package.json
CHANGED
|
@@ -1,6 +1,149 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cherrystudio/provider-registry",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Cross-platform AI provider and model catalogs, schemas, and lookup utilities",
|
|
5
|
+
"homepage": "https://github.com/CherryHQ/cherry-studio#readme",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/CherryHQ/cherry-studio/issues"
|
|
8
|
+
},
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"author": "Cherry Studio",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/CherryHQ/cherry-studio.git",
|
|
14
|
+
"directory": "packages/provider-registry"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist/**/*",
|
|
18
|
+
"data/**/*",
|
|
19
|
+
"LICENSE"
|
|
20
|
+
],
|
|
21
|
+
"type": "module",
|
|
22
|
+
"sideEffects": false,
|
|
23
|
+
"main": "dist/index.cjs",
|
|
24
|
+
"module": "dist/index.mjs",
|
|
25
|
+
"types": "dist/index.d.cts",
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"react-native": {
|
|
29
|
+
"types": "./dist/index.d.mts",
|
|
30
|
+
"default": "./dist/index.mjs"
|
|
31
|
+
},
|
|
32
|
+
"import": {
|
|
33
|
+
"types": "./dist/index.d.mts",
|
|
34
|
+
"default": "./dist/index.mjs"
|
|
35
|
+
},
|
|
36
|
+
"require": {
|
|
37
|
+
"types": "./dist/index.d.cts",
|
|
38
|
+
"default": "./dist/index.cjs"
|
|
39
|
+
},
|
|
40
|
+
"default": "./dist/index.mjs"
|
|
41
|
+
},
|
|
42
|
+
"./node": {
|
|
43
|
+
"import": {
|
|
44
|
+
"types": "./dist/registry-loader.d.mts",
|
|
45
|
+
"default": "./dist/registry-loader.mjs"
|
|
46
|
+
},
|
|
47
|
+
"require": {
|
|
48
|
+
"types": "./dist/registry-loader.d.cts",
|
|
49
|
+
"default": "./dist/registry-loader.cjs"
|
|
50
|
+
},
|
|
51
|
+
"default": "./dist/registry-loader.mjs"
|
|
52
|
+
},
|
|
53
|
+
"./data": {
|
|
54
|
+
"react-native": {
|
|
55
|
+
"types": "./dist/bundled-catalog.d.mts",
|
|
56
|
+
"default": "./dist/bundled-catalog.mjs"
|
|
57
|
+
},
|
|
58
|
+
"import": {
|
|
59
|
+
"types": "./dist/bundled-catalog.d.mts",
|
|
60
|
+
"default": "./dist/bundled-catalog.mjs"
|
|
61
|
+
},
|
|
62
|
+
"require": {
|
|
63
|
+
"types": "./dist/bundled-catalog.d.cts",
|
|
64
|
+
"default": "./dist/bundled-catalog.cjs"
|
|
65
|
+
},
|
|
66
|
+
"default": "./dist/bundled-catalog.mjs"
|
|
67
|
+
},
|
|
68
|
+
"./data/models": {
|
|
69
|
+
"react-native": {
|
|
70
|
+
"types": "./dist/bundled-models.d.mts",
|
|
71
|
+
"default": "./dist/bundled-models.mjs"
|
|
72
|
+
},
|
|
73
|
+
"import": {
|
|
74
|
+
"types": "./dist/bundled-models.d.mts",
|
|
75
|
+
"default": "./dist/bundled-models.mjs"
|
|
76
|
+
},
|
|
77
|
+
"require": {
|
|
78
|
+
"types": "./dist/bundled-models.d.cts",
|
|
79
|
+
"default": "./dist/bundled-models.cjs"
|
|
80
|
+
},
|
|
81
|
+
"default": "./dist/bundled-models.mjs"
|
|
82
|
+
},
|
|
83
|
+
"./data/providers": {
|
|
84
|
+
"react-native": {
|
|
85
|
+
"types": "./dist/bundled-providers.d.mts",
|
|
86
|
+
"default": "./dist/bundled-providers.mjs"
|
|
87
|
+
},
|
|
88
|
+
"import": {
|
|
89
|
+
"types": "./dist/bundled-providers.d.mts",
|
|
90
|
+
"default": "./dist/bundled-providers.mjs"
|
|
91
|
+
},
|
|
92
|
+
"require": {
|
|
93
|
+
"types": "./dist/bundled-providers.d.cts",
|
|
94
|
+
"default": "./dist/bundled-providers.cjs"
|
|
95
|
+
},
|
|
96
|
+
"default": "./dist/bundled-providers.mjs"
|
|
97
|
+
},
|
|
98
|
+
"./data/provider-models": {
|
|
99
|
+
"react-native": {
|
|
100
|
+
"types": "./dist/bundled-provider-models.d.mts",
|
|
101
|
+
"default": "./dist/bundled-provider-models.mjs"
|
|
102
|
+
},
|
|
103
|
+
"import": {
|
|
104
|
+
"types": "./dist/bundled-provider-models.d.mts",
|
|
105
|
+
"default": "./dist/bundled-provider-models.mjs"
|
|
106
|
+
},
|
|
107
|
+
"require": {
|
|
108
|
+
"types": "./dist/bundled-provider-models.d.cts",
|
|
109
|
+
"default": "./dist/bundled-provider-models.cjs"
|
|
110
|
+
},
|
|
111
|
+
"default": "./dist/bundled-provider-models.mjs"
|
|
112
|
+
},
|
|
113
|
+
"./data/models.json": "./data/models.json",
|
|
114
|
+
"./data/providers.json": "./data/providers.json",
|
|
115
|
+
"./data/provider-models.json": "./data/provider-models.json"
|
|
116
|
+
},
|
|
117
|
+
"publishConfig": {
|
|
118
|
+
"access": "public"
|
|
119
|
+
},
|
|
120
|
+
"dependencies": {
|
|
121
|
+
"semver": "^7.7.1"
|
|
122
|
+
},
|
|
123
|
+
"devDependencies": {
|
|
124
|
+
"@ai-sdk/provider-utils": "^4.0.40",
|
|
125
|
+
"@types/node": "^24.10.2",
|
|
126
|
+
"dotenv": "^17.2.3",
|
|
127
|
+
"tsdown": "^0.22.14",
|
|
128
|
+
"typescript": "npm:@typescript/typescript6@6.0.2",
|
|
129
|
+
"vitest": "^5.0.1",
|
|
130
|
+
"zod": "4.4.3"
|
|
131
|
+
},
|
|
132
|
+
"peerDependencies": {
|
|
133
|
+
"zod": "^4.4.3"
|
|
134
|
+
},
|
|
135
|
+
"scripts": {
|
|
136
|
+
"build": "tsdown",
|
|
137
|
+
"clean": "rm -rf dist",
|
|
138
|
+
"compat:baseline": "tsx scripts/createCompatibilityBaseline.ts",
|
|
139
|
+
"compat:check": "tsx scripts/checkCatalogCompatibility.ts",
|
|
140
|
+
"compat:policy": "tsx scripts/compatibilityPolicy.ts",
|
|
141
|
+
"dev": "pnpm --workspace-root exec tsc -w -p packages/provider-registry/tsconfig.json",
|
|
142
|
+
"generate": "tsx scripts/generate-catalog.ts --write && pnpm --workspace-root exec oxfmt --write packages/provider-registry/data/models.json packages/provider-registry/data/provider-models.json packages/provider-registry/data/providers.json packages/provider-registry/src/patterns/reasoning-families.gen.ts packages/provider-registry/src/patterns/server-tool-models.gen.ts packages/provider-registry/src/patterns/server-tool-constraints.gen.ts",
|
|
143
|
+
"generate:check": "tsx scripts/generate-catalog.ts --report",
|
|
144
|
+
"test": "vitest run",
|
|
145
|
+
"test:package": "pnpm typecheck && pnpm build && node scripts/check-package.mjs",
|
|
146
|
+
"test:watch": "vitest",
|
|
147
|
+
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
148
|
+
}
|
|
6
149
|
}
|