@carlonicora/nestjs-neo4jsonapi 1.79.0 → 1.81.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/config/base.config.d.ts.map +1 -1
- package/dist/config/base.config.js +2 -0
- package/dist/config/base.config.js.map +1 -1
- package/dist/config/interfaces/config.ai.interface.d.ts +14 -0
- package/dist/config/interfaces/config.ai.interface.d.ts.map +1 -1
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +12 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/llm/services/audio/ffmpeg-transcode.d.ts +28 -1
- package/dist/core/llm/services/audio/ffmpeg-transcode.d.ts.map +1 -1
- package/dist/core/llm/services/audio/ffmpeg-transcode.js +27 -6
- package/dist/core/llm/services/audio/ffmpeg-transcode.js.map +1 -1
- package/dist/core/llm/services/audio.llm.service.d.ts +6 -0
- package/dist/core/llm/services/audio.llm.service.d.ts.map +1 -1
- package/dist/core/llm/services/audio.llm.service.js +43 -17
- package/dist/core/llm/services/audio.llm.service.js.map +1 -1
- package/dist/core/model-manager/index.d.ts +8 -0
- package/dist/core/model-manager/index.d.ts.map +1 -0
- package/dist/core/model-manager/index.js +26 -0
- package/dist/core/model-manager/index.js.map +1 -0
- package/dist/core/model-manager/model-loader.d.ts +22 -0
- package/dist/core/model-manager/model-loader.d.ts.map +1 -0
- package/dist/core/model-manager/model-loader.js +213 -0
- package/dist/core/model-manager/model-loader.js.map +1 -0
- package/dist/core/model-manager/model-manager.config.d.ts +81 -0
- package/dist/core/model-manager/model-manager.config.d.ts.map +1 -0
- package/dist/core/model-manager/model-manager.config.js +8 -0
- package/dist/core/model-manager/model-manager.config.js.map +1 -0
- package/dist/core/model-manager/model-manager.module.d.ts +12 -0
- package/dist/core/model-manager/model-manager.module.d.ts.map +1 -0
- package/dist/core/model-manager/model-manager.module.js +31 -0
- package/dist/core/model-manager/model-manager.module.js.map +1 -0
- package/dist/core/model-manager/model-manager.service.d.ts +65 -0
- package/dist/core/model-manager/model-manager.service.d.ts.map +1 -0
- package/dist/core/model-manager/model-manager.service.js +428 -0
- package/dist/core/model-manager/model-manager.service.js.map +1 -0
- package/dist/core/onnx-runtime/index.d.ts +5 -0
- package/dist/core/onnx-runtime/index.d.ts.map +1 -0
- package/dist/core/onnx-runtime/index.js +10 -0
- package/dist/core/onnx-runtime/index.js.map +1 -0
- package/dist/core/onnx-runtime/onnx-runtime.config.d.ts +72 -0
- package/dist/core/onnx-runtime/onnx-runtime.config.d.ts.map +1 -0
- package/dist/core/onnx-runtime/onnx-runtime.config.js +12 -0
- package/dist/core/onnx-runtime/onnx-runtime.config.js.map +1 -0
- package/dist/core/onnx-runtime/onnx-runtime.constants.d.ts +5 -0
- package/dist/core/onnx-runtime/onnx-runtime.constants.d.ts.map +1 -0
- package/dist/core/onnx-runtime/onnx-runtime.constants.js +8 -0
- package/dist/core/onnx-runtime/onnx-runtime.constants.js.map +1 -0
- package/dist/core/onnx-runtime/onnx-runtime.module.d.ts +67 -0
- package/dist/core/onnx-runtime/onnx-runtime.module.d.ts.map +1 -0
- package/dist/core/onnx-runtime/onnx-runtime.module.js +103 -0
- package/dist/core/onnx-runtime/onnx-runtime.module.js.map +1 -0
- package/dist/core/onnx-runtime/onnx-runtime.service.d.ts +58 -0
- package/dist/core/onnx-runtime/onnx-runtime.service.d.ts.map +1 -0
- package/dist/core/onnx-runtime/onnx-runtime.service.js +149 -0
- package/dist/core/onnx-runtime/onnx-runtime.service.js.map +1 -0
- package/package.json +6 -1
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Model Configuration Loader
|
|
4
|
+
*
|
|
5
|
+
* Loads and validates models.config.yaml, providing type-safe access to model configuration.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.ModelLoader = void 0;
|
|
42
|
+
exports.getModelLoader = getModelLoader;
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const yaml = __importStar(require("js-yaml"));
|
|
46
|
+
const common_1 = require("@nestjs/common");
|
|
47
|
+
const logger = new common_1.Logger("ModelLoader");
|
|
48
|
+
class ModelLoader {
|
|
49
|
+
constructor(configPath) {
|
|
50
|
+
this.config = null;
|
|
51
|
+
this.configPath = configPath || this.getDefaultConfigPath();
|
|
52
|
+
}
|
|
53
|
+
getDefaultConfigPath() {
|
|
54
|
+
const fromEnv = process.env.MODEL_CONFIG_PATH;
|
|
55
|
+
if (fromEnv) {
|
|
56
|
+
return fromEnv;
|
|
57
|
+
}
|
|
58
|
+
return path.join(process.cwd(), "config", "models.config.yaml");
|
|
59
|
+
}
|
|
60
|
+
load() {
|
|
61
|
+
if (this.config) {
|
|
62
|
+
return this.config;
|
|
63
|
+
}
|
|
64
|
+
const fullPath = path.resolve(this.configPath);
|
|
65
|
+
if (!fs.existsSync(fullPath)) {
|
|
66
|
+
throw new Error(`Model configuration file not found: ${fullPath}`);
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const fileContent = fs.readFileSync(fullPath, "utf-8");
|
|
70
|
+
const parsed = yaml.load(fileContent);
|
|
71
|
+
this.config = this.validateAndTransform(parsed);
|
|
72
|
+
logger.log(`Model configuration loaded from: ${fullPath}`);
|
|
73
|
+
logger.log(`Total models: ${this.config.registry.onnx.length} ONNX, ${this.config.registry.transformers.length} Transformers`);
|
|
74
|
+
return this.config;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (error instanceof Error && error.message.includes("not found")) {
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
throw new Error(`Failed to parse model configuration: ${error}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
validateAndTransform(parsed) {
|
|
84
|
+
const result = {
|
|
85
|
+
valid: true,
|
|
86
|
+
errors: [],
|
|
87
|
+
warnings: [],
|
|
88
|
+
};
|
|
89
|
+
// Validate top-level structure
|
|
90
|
+
if (!parsed.version) {
|
|
91
|
+
result.errors.push("Missing required field: version");
|
|
92
|
+
}
|
|
93
|
+
if (!parsed.registry) {
|
|
94
|
+
result.errors.push("Missing required field: registry");
|
|
95
|
+
}
|
|
96
|
+
if (!parsed.registry?.onnx) {
|
|
97
|
+
result.errors.push("Missing required field: registry.onnx");
|
|
98
|
+
}
|
|
99
|
+
if (!parsed.registry?.transformers) {
|
|
100
|
+
result.errors.push("Missing required field: registry.transformers");
|
|
101
|
+
}
|
|
102
|
+
// Validate ONNX models
|
|
103
|
+
const onnxModels = parsed.registry?.onnx || [];
|
|
104
|
+
onnxModels.forEach((model, index) => {
|
|
105
|
+
if (!model.name) {
|
|
106
|
+
result.errors.push(`ONNX model ${index}: Missing required field: name`);
|
|
107
|
+
}
|
|
108
|
+
if (!model.path) {
|
|
109
|
+
result.errors.push(`ONNX model ${model.name || index}: Missing required field: path`);
|
|
110
|
+
}
|
|
111
|
+
if (!model.version) {
|
|
112
|
+
result.errors.push(`ONNX model ${model.name || index}: Missing required field: version`);
|
|
113
|
+
}
|
|
114
|
+
if (!model.hash) {
|
|
115
|
+
result.errors.push(`ONNX model ${model.name || index}: Missing required field: hash`);
|
|
116
|
+
}
|
|
117
|
+
if (typeof model.priority !== "number") {
|
|
118
|
+
result.errors.push(`ONNX model ${model.name || index}: Missing required field: priority`);
|
|
119
|
+
}
|
|
120
|
+
if (typeof model.optional !== "boolean") {
|
|
121
|
+
result.errors.push(`ONNX model ${model.name || index}: Missing required field: optional`);
|
|
122
|
+
}
|
|
123
|
+
if (!model.modelId) {
|
|
124
|
+
result.errors.push(`ONNX model ${model.name || index}: Missing required field: modelId`);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
// Validate Transformers models
|
|
128
|
+
const transformersModels = parsed.registry?.transformers || [];
|
|
129
|
+
transformersModels.forEach((model, index) => {
|
|
130
|
+
if (!model.name) {
|
|
131
|
+
result.errors.push(`Transformers model ${index}: Missing required field: name`);
|
|
132
|
+
}
|
|
133
|
+
if (!model.path) {
|
|
134
|
+
result.errors.push(`Transformers model ${model.name || index}: Missing required field: path`);
|
|
135
|
+
}
|
|
136
|
+
if (!model.version) {
|
|
137
|
+
result.errors.push(`Transformers model ${model.name || index}: Missing required field: version`);
|
|
138
|
+
}
|
|
139
|
+
if (!model.components || !Array.isArray(model.components)) {
|
|
140
|
+
result.errors.push(`Transformers model ${model.name || index}: Missing required field: components`);
|
|
141
|
+
}
|
|
142
|
+
if (typeof model.priority !== "number") {
|
|
143
|
+
result.errors.push(`Transformers model ${model.name || index}: Missing required field: priority`);
|
|
144
|
+
}
|
|
145
|
+
if (typeof model.optional !== "boolean") {
|
|
146
|
+
result.errors.push(`Transformers model ${model.name || index}: Missing required field: optional`);
|
|
147
|
+
}
|
|
148
|
+
if (!model.modelId) {
|
|
149
|
+
result.errors.push(`Transformers model ${model.name || index}: Missing required field: modelId`);
|
|
150
|
+
}
|
|
151
|
+
// Validate components
|
|
152
|
+
model.components?.forEach((component, cIndex) => {
|
|
153
|
+
if (!component.name) {
|
|
154
|
+
result.errors.push(`Transformers model ${model.name || index}, component ${cIndex}: Missing required field: name`);
|
|
155
|
+
}
|
|
156
|
+
if (!component.file) {
|
|
157
|
+
result.errors.push(`Transformers model ${model.name || index}, component ${cIndex}: Missing required field: file`);
|
|
158
|
+
}
|
|
159
|
+
if (!component.hash) {
|
|
160
|
+
result.errors.push(`Transformers model ${model.name || index}, component ${cIndex}: Missing required field: hash`);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
// If errors, throw
|
|
165
|
+
if (result.errors.length > 0) {
|
|
166
|
+
const errorSummary = result.errors.join("\n - ");
|
|
167
|
+
throw new Error(`Model configuration validation failed:\n - ${errorSummary}`);
|
|
168
|
+
}
|
|
169
|
+
// Log warnings
|
|
170
|
+
if (result.warnings.length > 0) {
|
|
171
|
+
logger.warn(`Model configuration warnings:\n - ${result.warnings.join("\n - ")}`);
|
|
172
|
+
}
|
|
173
|
+
// Return typed config
|
|
174
|
+
return {
|
|
175
|
+
version: parsed.version,
|
|
176
|
+
registry: {
|
|
177
|
+
onnx: onnxModels,
|
|
178
|
+
transformers: transformersModels,
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
getConfig() {
|
|
183
|
+
if (!this.config) {
|
|
184
|
+
return this.load();
|
|
185
|
+
}
|
|
186
|
+
return this.config;
|
|
187
|
+
}
|
|
188
|
+
getOnnxModels() {
|
|
189
|
+
return this.getConfig().registry.onnx;
|
|
190
|
+
}
|
|
191
|
+
getTransformersModels() {
|
|
192
|
+
return this.getConfig().registry.transformers;
|
|
193
|
+
}
|
|
194
|
+
getOnnxModelByName(name) {
|
|
195
|
+
return this.getOnnxModels().find((m) => m.name === name);
|
|
196
|
+
}
|
|
197
|
+
getTransformersModelByName(name) {
|
|
198
|
+
return this.getTransformersModels().find((m) => m.name === name);
|
|
199
|
+
}
|
|
200
|
+
getAllModels() {
|
|
201
|
+
const config = this.getConfig();
|
|
202
|
+
return [...config.registry.onnx, ...config.registry.transformers];
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
exports.ModelLoader = ModelLoader;
|
|
206
|
+
let loaderInstance = null;
|
|
207
|
+
function getModelLoader(configPath) {
|
|
208
|
+
if (!loaderInstance) {
|
|
209
|
+
loaderInstance = new ModelLoader(configPath);
|
|
210
|
+
}
|
|
211
|
+
return loaderInstance;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=model-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-loader.js","sourceRoot":"","sources":["../../../src/core/model-manager/model-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Manager Configuration Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the structure of models.config.yaml for type-safe configuration loading.
|
|
5
|
+
*/
|
|
6
|
+
export interface ModelConfig {
|
|
7
|
+
name: string;
|
|
8
|
+
modelId: string;
|
|
9
|
+
version: string;
|
|
10
|
+
hash: string;
|
|
11
|
+
priority: number;
|
|
12
|
+
optional: boolean;
|
|
13
|
+
description?: string;
|
|
14
|
+
loadInApi?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface OnnxAdditionalFile {
|
|
17
|
+
path: string;
|
|
18
|
+
hash: string;
|
|
19
|
+
}
|
|
20
|
+
export interface OnnxModelConfig extends ModelConfig {
|
|
21
|
+
path: string;
|
|
22
|
+
additionalFiles?: OnnxAdditionalFile[];
|
|
23
|
+
}
|
|
24
|
+
export interface ModelComponent {
|
|
25
|
+
name: string;
|
|
26
|
+
file: string;
|
|
27
|
+
hash: string;
|
|
28
|
+
}
|
|
29
|
+
export interface TransformersModelConfig extends ModelConfig {
|
|
30
|
+
path: string;
|
|
31
|
+
components: ModelComponent[];
|
|
32
|
+
}
|
|
33
|
+
export type ModelConfigType = OnnxModelConfig | TransformersModelConfig;
|
|
34
|
+
export interface ModelRegistry {
|
|
35
|
+
onnx: OnnxModelConfig[];
|
|
36
|
+
transformers: TransformersModelConfig[];
|
|
37
|
+
}
|
|
38
|
+
export interface ModelsConfig {
|
|
39
|
+
version: string;
|
|
40
|
+
registry: ModelRegistry;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Validation result for configuration
|
|
44
|
+
*/
|
|
45
|
+
export interface ConfigValidationResult {
|
|
46
|
+
valid: boolean;
|
|
47
|
+
errors: string[];
|
|
48
|
+
warnings: string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Model loading status
|
|
52
|
+
*/
|
|
53
|
+
export interface ModelLoadStatus {
|
|
54
|
+
name: string;
|
|
55
|
+
framework: "onnx" | "transformers";
|
|
56
|
+
status: "pending" | "loading" | "loaded" | "failed";
|
|
57
|
+
error?: string;
|
|
58
|
+
loadTimeMs?: number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Download progress
|
|
62
|
+
*/
|
|
63
|
+
export interface DownloadProgress {
|
|
64
|
+
modelName: string;
|
|
65
|
+
component?: string;
|
|
66
|
+
percent: number;
|
|
67
|
+
downloadedBytes: number;
|
|
68
|
+
totalBytes: number;
|
|
69
|
+
speed: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Model cache metadata
|
|
73
|
+
*/
|
|
74
|
+
export interface ModelCacheMetadata {
|
|
75
|
+
name: string;
|
|
76
|
+
version: string;
|
|
77
|
+
hash: string;
|
|
78
|
+
cachedAt: number;
|
|
79
|
+
filePath: string;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=model-manager.config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-manager.config.d.ts","sourceRoot":"","sources":["../../../src/core/model-manager/model-manager.config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAwB,SAAQ,WAAW;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,uBAAuB,CAAC;AAExE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,YAAY,EAAE,uBAAuB,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;IACnC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Model Manager Configuration Types
|
|
4
|
+
*
|
|
5
|
+
* Defines the structure of models.config.yaml for type-safe configuration loading.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
//# sourceMappingURL=model-manager.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-manager.config.js","sourceRoot":"","sources":["../../../src/core/model-manager/model-manager.config.ts"],"names":[],"mappings":";AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Manager Module
|
|
3
|
+
*
|
|
4
|
+
* Provides the centralized ModelManagerService for managing all ML models.
|
|
5
|
+
* This module should be imported in the main app module.
|
|
6
|
+
*
|
|
7
|
+
* Marked as @Global() so ModelManagerService is available app-wide without
|
|
8
|
+
* explicit imports in every module.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ModelManagerModule {
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=model-manager.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-manager.module.d.ts","sourceRoot":"","sources":["../../../src/core/model-manager/model-manager.module.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,qBAKa,kBAAkB;CAAG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Model Manager Module
|
|
4
|
+
*
|
|
5
|
+
* Provides the centralized ModelManagerService for managing all ML models.
|
|
6
|
+
* This module should be imported in the main app module.
|
|
7
|
+
*
|
|
8
|
+
* Marked as @Global() so ModelManagerService is available app-wide without
|
|
9
|
+
* explicit imports in every module.
|
|
10
|
+
*/
|
|
11
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
12
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
13
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
14
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
15
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.ModelManagerModule = void 0;
|
|
19
|
+
const common_1 = require("@nestjs/common");
|
|
20
|
+
const model_manager_service_1 = require("./model-manager.service");
|
|
21
|
+
let ModelManagerModule = class ModelManagerModule {
|
|
22
|
+
};
|
|
23
|
+
exports.ModelManagerModule = ModelManagerModule;
|
|
24
|
+
exports.ModelManagerModule = ModelManagerModule = __decorate([
|
|
25
|
+
(0, common_1.Global)(),
|
|
26
|
+
(0, common_1.Module)({
|
|
27
|
+
providers: [model_manager_service_1.ModelManagerService],
|
|
28
|
+
exports: [model_manager_service_1.ModelManagerService],
|
|
29
|
+
})
|
|
30
|
+
], ModelManagerModule);
|
|
31
|
+
//# sourceMappingURL=model-manager.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-manager.module.js","sourceRoot":"","sources":["../../../src/core/model-manager/model-manager.module.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;AAEH,2CAAgD;AAChD,mEAA8D;AAOvD,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;CAAG,CAAA;AAArB,gDAAkB;6BAAlB,kBAAkB;IAL9B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,2CAAmB,CAAC;QAChC,OAAO,EAAE,CAAC,2CAAmB,CAAC;KAC/B,CAAC;GACW,kBAAkB,CAAG"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Manager Service
|
|
3
|
+
*
|
|
4
|
+
* Centralized service for managing all ML models:
|
|
5
|
+
* - Loads models.config.yaml
|
|
6
|
+
* - Downloads models on startup (runtime)
|
|
7
|
+
* - Verifies SHA256 hashes
|
|
8
|
+
* - Checks version compatibility
|
|
9
|
+
* - Caches ONNX sessions and Transformers models
|
|
10
|
+
* - Provides unified interface for model access
|
|
11
|
+
*/
|
|
12
|
+
import { OnApplicationBootstrap } from "@nestjs/common";
|
|
13
|
+
import { AppModeConfig } from "../../common/decorators/conditional-service.decorator";
|
|
14
|
+
import * as ort from "onnxruntime-node";
|
|
15
|
+
import type { ModelLoadStatus } from "./model-manager.config";
|
|
16
|
+
export declare class ModelManagerService implements OnApplicationBootstrap {
|
|
17
|
+
private readonly appModeConfig?;
|
|
18
|
+
private readonly logger;
|
|
19
|
+
private readonly config;
|
|
20
|
+
private readonly cacheDir;
|
|
21
|
+
private readonly baseUrl;
|
|
22
|
+
private readonly verifyHash;
|
|
23
|
+
private readonly strictHash;
|
|
24
|
+
private readonly autoUpdate;
|
|
25
|
+
private onnxSessions;
|
|
26
|
+
private transformersModels;
|
|
27
|
+
private loadStatus;
|
|
28
|
+
private readyPromise;
|
|
29
|
+
private readyResolver;
|
|
30
|
+
constructor(appModeConfig?: AppModeConfig);
|
|
31
|
+
/**
|
|
32
|
+
* Check if running in worker mode.
|
|
33
|
+
* Defaults to worker mode if no app mode config (tests, standalone scripts).
|
|
34
|
+
*/
|
|
35
|
+
private isWorkerMode;
|
|
36
|
+
/**
|
|
37
|
+
* Determine if a model should be loaded based on current app mode.
|
|
38
|
+
* - Worker mode: load all models
|
|
39
|
+
* - API mode: only load models marked with loadInApi: true
|
|
40
|
+
*/
|
|
41
|
+
private shouldLoadModel;
|
|
42
|
+
onApplicationBootstrap(): Promise<void>;
|
|
43
|
+
private loadModel;
|
|
44
|
+
private loadOnnxModel;
|
|
45
|
+
private loadTransformersModel;
|
|
46
|
+
private needsDownload;
|
|
47
|
+
private downloadFile;
|
|
48
|
+
private verifyFileHash;
|
|
49
|
+
private computeHash;
|
|
50
|
+
private ensureCacheDir;
|
|
51
|
+
getOnnxSession(name: string): ort.InferenceSession | null;
|
|
52
|
+
getTransformersModel(name: string, component?: string): any | null;
|
|
53
|
+
isModelLoaded(name: string, framework: "onnx" | "transformers"): boolean;
|
|
54
|
+
getLoadedModels(): {
|
|
55
|
+
onnx: string[];
|
|
56
|
+
transformers: string[];
|
|
57
|
+
};
|
|
58
|
+
getLoadStatus(): ModelLoadStatus[];
|
|
59
|
+
/**
|
|
60
|
+
* Wait for all models to be loaded.
|
|
61
|
+
* Services that depend on models should call this before accessing them.
|
|
62
|
+
*/
|
|
63
|
+
waitForReady(): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=model-manager.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-manager.service.d.ts","sourceRoot":"","sources":["../../../src/core/model-manager/model-manager.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAA8B,sBAAsB,EAAY,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EAA2B,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAI/G,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AAExC,OAAO,KAAK,EAKV,eAAe,EAChB,MAAM,wBAAwB,CAAC;AAEhC,qBACa,mBAAoB,YAAW,sBAAsB;IAsBhB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IArB/E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IAGrC,OAAO,CAAC,YAAY,CAAgD;IAGpE,OAAO,CAAC,kBAAkB,CAA4C;IAGtE,OAAO,CAAC,UAAU,CAAyB;IAG3C,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAc;gBAE8B,aAAa,CAAC,EAAE,aAAa;IAsB9F;;;OAGG;IACH,OAAO,CAAC,YAAY;IAKpB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAKjB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;YA8C/B,SAAS;YAuCT,aAAa;YAmEb,qBAAqB;YAyCrB,aAAa;YAiCb,YAAY;IAqF1B,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,cAAc;IAQtB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,gBAAgB,GAAG,IAAI;IAIzD,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI;IAWlE,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,OAAO;IAOxE,eAAe,IAAI;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE;IAO7D,aAAa,IAAI,eAAe,EAAE;IAIlC;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpC"}
|