@hazeljs/ml 0.2.0-beta.37
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 +192 -0
- package/dist/decorators/index.d.ts +4 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +15 -0
- package/dist/decorators/model.decorator.d.ts +26 -0
- package/dist/decorators/model.decorator.d.ts.map +1 -0
- package/dist/decorators/model.decorator.js +48 -0
- package/dist/decorators/predict.decorator.d.ts +20 -0
- package/dist/decorators/predict.decorator.d.ts.map +1 -0
- package/dist/decorators/predict.decorator.js +40 -0
- package/dist/decorators/train.decorator.d.ts +21 -0
- package/dist/decorators/train.decorator.d.ts.map +1 -0
- package/dist/decorators/train.decorator.js +41 -0
- package/dist/evaluation/metrics.service.d.ts +30 -0
- package/dist/evaluation/metrics.service.d.ts.map +1 -0
- package/dist/evaluation/metrics.service.js +54 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/inference/batch.service.d.ts +16 -0
- package/dist/inference/batch.service.d.ts.map +1 -0
- package/dist/inference/batch.service.js +47 -0
- package/dist/inference/predictor.service.d.ts +13 -0
- package/dist/inference/predictor.service.d.ts.map +1 -0
- package/dist/inference/predictor.service.js +65 -0
- package/dist/ml-model.base.d.ts +20 -0
- package/dist/ml-model.base.d.ts.map +1 -0
- package/dist/ml-model.base.js +33 -0
- package/dist/ml.module.d.ts +27 -0
- package/dist/ml.module.d.ts.map +1 -0
- package/dist/ml.module.js +126 -0
- package/dist/ml.types.d.ts +30 -0
- package/dist/ml.types.d.ts.map +1 -0
- package/dist/ml.types.js +5 -0
- package/dist/registry/model.registry.d.ts +21 -0
- package/dist/registry/model.registry.d.ts.map +1 -0
- package/dist/registry/model.registry.js +64 -0
- package/dist/training/pipeline.service.d.ts +17 -0
- package/dist/training/pipeline.service.d.ts.map +1 -0
- package/dist/training/pipeline.service.js +49 -0
- package/dist/training/trainer.service.d.ts +13 -0
- package/dist/training/trainer.service.d.ts.map +1 -0
- package/dist/training/trainer.service.js +69 -0
- package/package.json +52 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.BatchService = void 0;
|
|
16
|
+
const core_1 = require("@hazeljs/core");
|
|
17
|
+
const predictor_service_1 = require("./predictor.service");
|
|
18
|
+
const core_2 = __importDefault(require("@hazeljs/core"));
|
|
19
|
+
/**
|
|
20
|
+
* Batch Service - Batch processing for inference
|
|
21
|
+
* Handles bulk prediction requests efficiently
|
|
22
|
+
*/
|
|
23
|
+
let BatchService = class BatchService {
|
|
24
|
+
constructor(predictorService) {
|
|
25
|
+
this.predictorService = predictorService;
|
|
26
|
+
}
|
|
27
|
+
async predictBatch(modelName, inputs, options = {}, version) {
|
|
28
|
+
const { batchSize = 32, concurrency = 4 } = options;
|
|
29
|
+
core_2.default.debug(`Batch prediction: ${inputs.length} inputs, batchSize=${batchSize}`);
|
|
30
|
+
const results = [];
|
|
31
|
+
const batches = [];
|
|
32
|
+
for (let i = 0; i < inputs.length; i += batchSize) {
|
|
33
|
+
batches.push(inputs.slice(i, i + batchSize));
|
|
34
|
+
}
|
|
35
|
+
for (let i = 0; i < batches.length; i += concurrency) {
|
|
36
|
+
const batchGroup = batches.slice(i, i + concurrency);
|
|
37
|
+
const batchResults = await Promise.all(batchGroup.flatMap((batch) => batch.map((input) => this.predictorService.predict(modelName, input, version))));
|
|
38
|
+
results.push(...batchResults);
|
|
39
|
+
}
|
|
40
|
+
return results;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
exports.BatchService = BatchService;
|
|
44
|
+
exports.BatchService = BatchService = __decorate([
|
|
45
|
+
(0, core_1.Injectable)(),
|
|
46
|
+
__metadata("design:paramtypes", [predictor_service_1.PredictorService])
|
|
47
|
+
], BatchService);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ModelRegistry } from '../registry/model.registry';
|
|
2
|
+
import { PredictionResult } from '../ml.types';
|
|
3
|
+
/**
|
|
4
|
+
* Predictor Service - Real-time prediction/inference
|
|
5
|
+
* Routes prediction requests to registered models
|
|
6
|
+
*/
|
|
7
|
+
export declare class PredictorService {
|
|
8
|
+
private readonly modelRegistry;
|
|
9
|
+
constructor(modelRegistry: ModelRegistry);
|
|
10
|
+
predict<T = unknown>(modelName: string, input: unknown, version?: string): Promise<PredictionResult<T>>;
|
|
11
|
+
discoverPredictMethod(instance: object): string | undefined;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=predictor.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"predictor.service.d.ts","sourceRoot":"","sources":["../../src/inference/predictor.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C;;;GAGG;AACH,qBACa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAEnD,OAAO,CAAC,CAAC,GAAG,OAAO,EACvB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAyB/B,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAa5D"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.PredictorService = void 0;
|
|
16
|
+
const core_1 = require("@hazeljs/core");
|
|
17
|
+
const model_registry_1 = require("../registry/model.registry");
|
|
18
|
+
const decorators_1 = require("../decorators");
|
|
19
|
+
const core_2 = __importDefault(require("@hazeljs/core"));
|
|
20
|
+
/**
|
|
21
|
+
* Predictor Service - Real-time prediction/inference
|
|
22
|
+
* Routes prediction requests to registered models
|
|
23
|
+
*/
|
|
24
|
+
let PredictorService = class PredictorService {
|
|
25
|
+
constructor(modelRegistry) {
|
|
26
|
+
this.modelRegistry = modelRegistry;
|
|
27
|
+
}
|
|
28
|
+
async predict(modelName, input, version) {
|
|
29
|
+
const model = this.modelRegistry.get(modelName, version);
|
|
30
|
+
if (!model) {
|
|
31
|
+
throw new Error(`Model not found: ${modelName}`);
|
|
32
|
+
}
|
|
33
|
+
const predictMethod = model.predictMethod;
|
|
34
|
+
if (!predictMethod) {
|
|
35
|
+
throw new Error(`Model ${modelName} has no prediction method`);
|
|
36
|
+
}
|
|
37
|
+
const instance = model.instance;
|
|
38
|
+
const predictFn = instance[predictMethod];
|
|
39
|
+
if (typeof predictFn !== 'function') {
|
|
40
|
+
throw new Error(`Prediction method ${predictMethod} not found on model`);
|
|
41
|
+
}
|
|
42
|
+
core_2.default.debug(`Running prediction for model: ${modelName}`);
|
|
43
|
+
const result = await predictFn.call(instance, input);
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
discoverPredictMethod(instance) {
|
|
47
|
+
const proto = Object.getPrototypeOf(instance);
|
|
48
|
+
for (const key of Object.getOwnPropertyNames(proto)) {
|
|
49
|
+
if (key === 'constructor')
|
|
50
|
+
continue;
|
|
51
|
+
const descriptor = Object.getOwnPropertyDescriptor(proto, key);
|
|
52
|
+
if (descriptor?.value && typeof descriptor.value === 'function') {
|
|
53
|
+
if ((0, decorators_1.getPredictMetadata)(proto, key)) {
|
|
54
|
+
return key;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
exports.PredictorService = PredictorService;
|
|
62
|
+
exports.PredictorService = PredictorService = __decorate([
|
|
63
|
+
(0, core_1.Injectable)(),
|
|
64
|
+
__metadata("design:paramtypes", [model_registry_1.ModelRegistry])
|
|
65
|
+
], PredictorService);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ModelRegistry } from './registry/model.registry';
|
|
2
|
+
import { TrainerService } from './training/trainer.service';
|
|
3
|
+
import { PredictorService } from './inference/predictor.service';
|
|
4
|
+
/**
|
|
5
|
+
* Registers an ML model instance with the registry.
|
|
6
|
+
* Call this from your model's constructor when injecting ModelRegistry.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* @Model({ name: 'sentiment', version: '1.0.0', framework: 'tensorflow' })
|
|
11
|
+
* @Injectable()
|
|
12
|
+
* class SentimentModel extends MLModelBase {
|
|
13
|
+
* constructor(registry: ModelRegistry, trainer: TrainerService, predictor: PredictorService) {
|
|
14
|
+
* super(registry, trainer, predictor);
|
|
15
|
+
* }
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare function registerMLModel(instance: object, registry: ModelRegistry, trainerService: TrainerService, predictorService: PredictorService): void;
|
|
20
|
+
//# sourceMappingURL=ml-model.base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ml-model.base.d.ts","sourceRoot":"","sources":["../src/ml-model.base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,aAAa,EACvB,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,gBAAgB,GACjC,IAAI,CAcN"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerMLModel = registerMLModel;
|
|
4
|
+
const decorators_1 = require("./decorators");
|
|
5
|
+
/**
|
|
6
|
+
* Registers an ML model instance with the registry.
|
|
7
|
+
* Call this from your model's constructor when injecting ModelRegistry.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* @Model({ name: 'sentiment', version: '1.0.0', framework: 'tensorflow' })
|
|
12
|
+
* @Injectable()
|
|
13
|
+
* class SentimentModel extends MLModelBase {
|
|
14
|
+
* constructor(registry: ModelRegistry, trainer: TrainerService, predictor: PredictorService) {
|
|
15
|
+
* super(registry, trainer, predictor);
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
function registerMLModel(instance, registry, trainerService, predictorService) {
|
|
21
|
+
const metadata = (0, decorators_1.getModelMetadata)(instance.constructor);
|
|
22
|
+
if (!metadata)
|
|
23
|
+
return;
|
|
24
|
+
const trainMethod = trainerService.discoverTrainMethod(instance);
|
|
25
|
+
const predictMethod = predictorService.discoverPredictMethod(instance);
|
|
26
|
+
const registered = {
|
|
27
|
+
metadata,
|
|
28
|
+
instance,
|
|
29
|
+
trainMethod,
|
|
30
|
+
predictMethod,
|
|
31
|
+
};
|
|
32
|
+
registry.register(registered);
|
|
33
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Type } from '@hazeljs/core';
|
|
2
|
+
export declare const ML_MODELS: unique symbol;
|
|
3
|
+
export interface MLModuleOptions {
|
|
4
|
+
models?: Type<unknown>[];
|
|
5
|
+
}
|
|
6
|
+
export declare class MLModule {
|
|
7
|
+
private static options;
|
|
8
|
+
/**
|
|
9
|
+
* Configure MLModule with models to register
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* imports: [
|
|
14
|
+
* MLModule.forRoot({
|
|
15
|
+
* models: [SentimentModel],
|
|
16
|
+
* }),
|
|
17
|
+
* ]
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
static forRoot(options?: MLModuleOptions): {
|
|
21
|
+
module: typeof MLModule;
|
|
22
|
+
providers: unknown[];
|
|
23
|
+
exports: unknown[];
|
|
24
|
+
};
|
|
25
|
+
static getOptions(): MLModuleOptions;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=ml.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ml.module.d.ts","sourceRoot":"","sources":["../src/ml.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8C,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAUtF,eAAO,MAAM,SAAS,eAA4B,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;CAC1B;AAkCD,qBAkBa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAuB;IAE7C;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,eAAoB,GAAG;QAC7C,MAAM,EAAE,OAAO,QAAQ,CAAC;QACxB,SAAS,EAAE,OAAO,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,CAAC;KACpB;IA8BD,MAAM,CAAC,UAAU,IAAI,eAAe;CAGrC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var MLModule_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.MLModule = exports.ML_MODELS = void 0;
|
|
17
|
+
const core_1 = require("@hazeljs/core");
|
|
18
|
+
const model_registry_1 = require("./registry/model.registry");
|
|
19
|
+
const trainer_service_1 = require("./training/trainer.service");
|
|
20
|
+
const pipeline_service_1 = require("./training/pipeline.service");
|
|
21
|
+
const predictor_service_1 = require("./inference/predictor.service");
|
|
22
|
+
const batch_service_1 = require("./inference/batch.service");
|
|
23
|
+
const metrics_service_1 = require("./evaluation/metrics.service");
|
|
24
|
+
const decorators_1 = require("./decorators");
|
|
25
|
+
exports.ML_MODELS = Symbol('hazel:ml:models');
|
|
26
|
+
/**
|
|
27
|
+
* Bootstrap that registers models with the registry when instantiated.
|
|
28
|
+
* Added as a provider when using MLModule.forRoot({ models: [...] }).
|
|
29
|
+
*/
|
|
30
|
+
let MLModelBootstrap = class MLModelBootstrap {
|
|
31
|
+
constructor(modelRegistry, trainerService, predictorService, modelTypes) {
|
|
32
|
+
this.modelRegistry = modelRegistry;
|
|
33
|
+
this.trainerService = trainerService;
|
|
34
|
+
this.predictorService = predictorService;
|
|
35
|
+
this.modelTypes = modelTypes;
|
|
36
|
+
const container = core_1.Container.getInstance();
|
|
37
|
+
for (const ModelClass of this.modelTypes) {
|
|
38
|
+
const metadata = (0, decorators_1.getModelMetadata)(ModelClass);
|
|
39
|
+
if (!metadata)
|
|
40
|
+
continue;
|
|
41
|
+
const instance = container.resolve(ModelClass);
|
|
42
|
+
const trainMethod = this.trainerService.discoverTrainMethod(instance);
|
|
43
|
+
const predictMethod = this.predictorService.discoverPredictMethod(instance);
|
|
44
|
+
const registered = {
|
|
45
|
+
metadata,
|
|
46
|
+
instance,
|
|
47
|
+
trainMethod,
|
|
48
|
+
predictMethod,
|
|
49
|
+
};
|
|
50
|
+
this.modelRegistry.register(registered);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
MLModelBootstrap = __decorate([
|
|
55
|
+
(0, core_1.Injectable)(),
|
|
56
|
+
__param(3, (0, core_1.Inject)(exports.ML_MODELS)),
|
|
57
|
+
__metadata("design:paramtypes", [model_registry_1.ModelRegistry,
|
|
58
|
+
trainer_service_1.TrainerService,
|
|
59
|
+
predictor_service_1.PredictorService, Array])
|
|
60
|
+
], MLModelBootstrap);
|
|
61
|
+
let MLModule = MLModule_1 = class MLModule {
|
|
62
|
+
/**
|
|
63
|
+
* Configure MLModule with models to register
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* imports: [
|
|
68
|
+
* MLModule.forRoot({
|
|
69
|
+
* models: [SentimentModel],
|
|
70
|
+
* }),
|
|
71
|
+
* ]
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
static forRoot(options = {}) {
|
|
75
|
+
MLModule_1.options = options;
|
|
76
|
+
const models = options.models || [];
|
|
77
|
+
const providers = [
|
|
78
|
+
model_registry_1.ModelRegistry,
|
|
79
|
+
trainer_service_1.TrainerService,
|
|
80
|
+
pipeline_service_1.PipelineService,
|
|
81
|
+
predictor_service_1.PredictorService,
|
|
82
|
+
batch_service_1.BatchService,
|
|
83
|
+
metrics_service_1.MetricsService,
|
|
84
|
+
...models,
|
|
85
|
+
{ provide: exports.ML_MODELS, useValue: models },
|
|
86
|
+
MLModelBootstrap,
|
|
87
|
+
];
|
|
88
|
+
return {
|
|
89
|
+
module: MLModule_1,
|
|
90
|
+
providers,
|
|
91
|
+
exports: [
|
|
92
|
+
model_registry_1.ModelRegistry,
|
|
93
|
+
trainer_service_1.TrainerService,
|
|
94
|
+
pipeline_service_1.PipelineService,
|
|
95
|
+
predictor_service_1.PredictorService,
|
|
96
|
+
batch_service_1.BatchService,
|
|
97
|
+
metrics_service_1.MetricsService,
|
|
98
|
+
],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
static getOptions() {
|
|
102
|
+
return MLModule_1.options;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
exports.MLModule = MLModule;
|
|
106
|
+
MLModule.options = {};
|
|
107
|
+
exports.MLModule = MLModule = MLModule_1 = __decorate([
|
|
108
|
+
(0, core_1.HazelModule)({
|
|
109
|
+
providers: [
|
|
110
|
+
model_registry_1.ModelRegistry,
|
|
111
|
+
trainer_service_1.TrainerService,
|
|
112
|
+
pipeline_service_1.PipelineService,
|
|
113
|
+
predictor_service_1.PredictorService,
|
|
114
|
+
batch_service_1.BatchService,
|
|
115
|
+
metrics_service_1.MetricsService,
|
|
116
|
+
],
|
|
117
|
+
exports: [
|
|
118
|
+
model_registry_1.ModelRegistry,
|
|
119
|
+
trainer_service_1.TrainerService,
|
|
120
|
+
pipeline_service_1.PipelineService,
|
|
121
|
+
predictor_service_1.PredictorService,
|
|
122
|
+
batch_service_1.BatchService,
|
|
123
|
+
metrics_service_1.MetricsService,
|
|
124
|
+
],
|
|
125
|
+
})
|
|
126
|
+
], MLModule);
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @hazeljs/ml - Type definitions for ML models and operations
|
|
3
|
+
*/
|
|
4
|
+
export type MLFramework = 'tensorflow' | 'onnx' | 'custom';
|
|
5
|
+
export interface ModelMetadata {
|
|
6
|
+
name: string;
|
|
7
|
+
version: string;
|
|
8
|
+
framework: MLFramework;
|
|
9
|
+
description?: string;
|
|
10
|
+
tags?: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface TrainingData {
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
export interface TrainingResult {
|
|
16
|
+
accuracy?: number;
|
|
17
|
+
loss?: number;
|
|
18
|
+
metrics?: Record<string, number>;
|
|
19
|
+
modelPath?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface PredictionResult<T = unknown> {
|
|
22
|
+
[key: string]: T;
|
|
23
|
+
}
|
|
24
|
+
export interface ModelVersion {
|
|
25
|
+
version: string;
|
|
26
|
+
createdAt: Date;
|
|
27
|
+
path?: string;
|
|
28
|
+
metrics?: Record<string, number>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=ml.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ml.types.d.ts","sourceRoot":"","sources":["../src/ml.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,WAAW,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IAC3C,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC"}
|
package/dist/ml.types.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ModelMetadata, ModelVersion } from '../ml.types';
|
|
2
|
+
export interface RegisteredModel {
|
|
3
|
+
metadata: ModelMetadata;
|
|
4
|
+
instance: object;
|
|
5
|
+
trainMethod?: string;
|
|
6
|
+
predictMethod?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Model Registry - Handles model versioning and storage
|
|
10
|
+
* Integrates with TensorFlow.js, ONNX Runtime for model persistence
|
|
11
|
+
*/
|
|
12
|
+
export declare class ModelRegistry {
|
|
13
|
+
private models;
|
|
14
|
+
private versions;
|
|
15
|
+
register(model: RegisteredModel): void;
|
|
16
|
+
get(name: string, version?: string): RegisteredModel | undefined;
|
|
17
|
+
list(): ModelMetadata[];
|
|
18
|
+
getVersions(name: string): ModelVersion[];
|
|
19
|
+
unregister(name: string, version: string): boolean;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=model.registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.registry.d.ts","sourceRoot":"","sources":["../../src/registry/model.registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,qBACa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA2C;IACzD,OAAO,CAAC,QAAQ,CAA0C;IAE1D,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IActC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAUhE,IAAI,IAAI,aAAa,EAAE;IAIvB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE;IAIzC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;CAUnD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ModelRegistry = void 0;
|
|
13
|
+
const core_1 = require("@hazeljs/core");
|
|
14
|
+
const core_2 = __importDefault(require("@hazeljs/core"));
|
|
15
|
+
/**
|
|
16
|
+
* Model Registry - Handles model versioning and storage
|
|
17
|
+
* Integrates with TensorFlow.js, ONNX Runtime for model persistence
|
|
18
|
+
*/
|
|
19
|
+
let ModelRegistry = class ModelRegistry {
|
|
20
|
+
constructor() {
|
|
21
|
+
this.models = new Map();
|
|
22
|
+
this.versions = new Map();
|
|
23
|
+
}
|
|
24
|
+
register(model) {
|
|
25
|
+
const key = `${model.metadata.name}@${model.metadata.version}`;
|
|
26
|
+
this.models.set(key, model);
|
|
27
|
+
const versions = this.versions.get(model.metadata.name) || [];
|
|
28
|
+
versions.push({
|
|
29
|
+
version: model.metadata.version,
|
|
30
|
+
createdAt: new Date(),
|
|
31
|
+
});
|
|
32
|
+
this.versions.set(model.metadata.name, versions);
|
|
33
|
+
core_2.default.debug(`Registered model: ${key}`);
|
|
34
|
+
}
|
|
35
|
+
get(name, version) {
|
|
36
|
+
if (version) {
|
|
37
|
+
return this.models.get(`${name}@${version}`);
|
|
38
|
+
}
|
|
39
|
+
// Return latest version
|
|
40
|
+
const versions = this.versions.get(name) || [];
|
|
41
|
+
const latest = versions[versions.length - 1];
|
|
42
|
+
return latest ? this.models.get(`${name}@${latest.version}`) : undefined;
|
|
43
|
+
}
|
|
44
|
+
list() {
|
|
45
|
+
return Array.from(this.models.values()).map((m) => m.metadata);
|
|
46
|
+
}
|
|
47
|
+
getVersions(name) {
|
|
48
|
+
return this.versions.get(name) || [];
|
|
49
|
+
}
|
|
50
|
+
unregister(name, version) {
|
|
51
|
+
const key = `${name}@${version}`;
|
|
52
|
+
const deleted = this.models.delete(key);
|
|
53
|
+
if (deleted) {
|
|
54
|
+
const versions = this.versions.get(name) || [];
|
|
55
|
+
const filtered = versions.filter((v) => v.version !== version);
|
|
56
|
+
this.versions.set(name, filtered);
|
|
57
|
+
}
|
|
58
|
+
return deleted;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
exports.ModelRegistry = ModelRegistry;
|
|
62
|
+
exports.ModelRegistry = ModelRegistry = __decorate([
|
|
63
|
+
(0, core_1.Injectable)()
|
|
64
|
+
], ModelRegistry);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { TrainingData } from '../ml.types';
|
|
2
|
+
export interface PipelineStep {
|
|
3
|
+
name: string;
|
|
4
|
+
transform: (data: unknown) => Promise<unknown> | unknown;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Pipeline Service - ETL pipelines for training data preparation
|
|
8
|
+
* Handles data transformation before model training
|
|
9
|
+
*/
|
|
10
|
+
export declare class PipelineService {
|
|
11
|
+
private pipelines;
|
|
12
|
+
registerPipeline(name: string, steps: PipelineStep[]): void;
|
|
13
|
+
run(name: string, data: TrainingData): Promise<TrainingData>;
|
|
14
|
+
getPipeline(name: string): PipelineStep[] | undefined;
|
|
15
|
+
listPipelines(): string[];
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=pipeline.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.service.d.ts","sourceRoot":"","sources":["../../src/training/pipeline.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAC1D;AAED;;;GAGG;AACH,qBACa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAA0C;IAE3D,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI;IAKrD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAelE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,GAAG,SAAS;IAIrD,aAAa,IAAI,MAAM,EAAE;CAG1B"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.PipelineService = void 0;
|
|
13
|
+
const core_1 = require("@hazeljs/core");
|
|
14
|
+
const core_2 = __importDefault(require("@hazeljs/core"));
|
|
15
|
+
/**
|
|
16
|
+
* Pipeline Service - ETL pipelines for training data preparation
|
|
17
|
+
* Handles data transformation before model training
|
|
18
|
+
*/
|
|
19
|
+
let PipelineService = class PipelineService {
|
|
20
|
+
constructor() {
|
|
21
|
+
this.pipelines = new Map();
|
|
22
|
+
}
|
|
23
|
+
registerPipeline(name, steps) {
|
|
24
|
+
this.pipelines.set(name, steps);
|
|
25
|
+
core_2.default.debug(`Registered pipeline: ${name} with ${steps.length} steps`);
|
|
26
|
+
}
|
|
27
|
+
async run(name, data) {
|
|
28
|
+
const steps = this.pipelines.get(name);
|
|
29
|
+
if (!steps) {
|
|
30
|
+
throw new Error(`Pipeline not found: ${name}`);
|
|
31
|
+
}
|
|
32
|
+
let result = data;
|
|
33
|
+
for (const step of steps) {
|
|
34
|
+
core_2.default.debug(`Pipeline ${name}: executing step ${step.name}`);
|
|
35
|
+
result = await Promise.resolve(step.transform(result));
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
getPipeline(name) {
|
|
40
|
+
return this.pipelines.get(name);
|
|
41
|
+
}
|
|
42
|
+
listPipelines() {
|
|
43
|
+
return Array.from(this.pipelines.keys());
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
exports.PipelineService = PipelineService;
|
|
47
|
+
exports.PipelineService = PipelineService = __decorate([
|
|
48
|
+
(0, core_1.Injectable)()
|
|
49
|
+
], PipelineService);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ModelRegistry } from '../registry/model.registry';
|
|
2
|
+
import { TrainingData, TrainingResult } from '../ml.types';
|
|
3
|
+
/**
|
|
4
|
+
* Trainer Service - Training orchestration for ML models
|
|
5
|
+
* Coordinates training pipelines and model updates
|
|
6
|
+
*/
|
|
7
|
+
export declare class TrainerService {
|
|
8
|
+
private readonly modelRegistry;
|
|
9
|
+
constructor(modelRegistry: ModelRegistry);
|
|
10
|
+
train(modelName: string, data: TrainingData, version?: string): Promise<TrainingResult>;
|
|
11
|
+
discoverTrainMethod(instance: object): string | undefined;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=trainer.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trainer.service.d.ts","sourceRoot":"","sources":["../../src/training/trainer.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG3D;;;GAGG;AACH,qBACa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAEnD,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA2B7F,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAgB1D"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.TrainerService = void 0;
|
|
16
|
+
const core_1 = require("@hazeljs/core");
|
|
17
|
+
const model_registry_1 = require("../registry/model.registry");
|
|
18
|
+
const decorators_1 = require("../decorators");
|
|
19
|
+
const core_2 = __importDefault(require("@hazeljs/core"));
|
|
20
|
+
/**
|
|
21
|
+
* Trainer Service - Training orchestration for ML models
|
|
22
|
+
* Coordinates training pipelines and model updates
|
|
23
|
+
*/
|
|
24
|
+
let TrainerService = class TrainerService {
|
|
25
|
+
constructor(modelRegistry) {
|
|
26
|
+
this.modelRegistry = modelRegistry;
|
|
27
|
+
}
|
|
28
|
+
async train(modelName, data, version) {
|
|
29
|
+
const model = this.modelRegistry.get(modelName, version);
|
|
30
|
+
if (!model) {
|
|
31
|
+
throw new Error(`Model not found: ${modelName}`);
|
|
32
|
+
}
|
|
33
|
+
const trainMethod = model.trainMethod;
|
|
34
|
+
if (!trainMethod) {
|
|
35
|
+
throw new Error(`Model ${modelName} has no training method`);
|
|
36
|
+
}
|
|
37
|
+
const instance = model.instance;
|
|
38
|
+
const trainFn = instance[trainMethod];
|
|
39
|
+
if (typeof trainFn !== 'function') {
|
|
40
|
+
throw new Error(`Training method ${trainMethod} not found on model`);
|
|
41
|
+
}
|
|
42
|
+
core_2.default.debug(`Starting training for model: ${modelName}`);
|
|
43
|
+
const result = await trainFn.call(instance, data);
|
|
44
|
+
core_2.default.debug(`Training completed for model: ${modelName}`, result);
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
discoverTrainMethod(instance) {
|
|
48
|
+
const metadata = (0, decorators_1.getModelMetadata)(instance.constructor);
|
|
49
|
+
if (!metadata)
|
|
50
|
+
return undefined;
|
|
51
|
+
const proto = Object.getPrototypeOf(instance);
|
|
52
|
+
for (const key of Object.getOwnPropertyNames(proto)) {
|
|
53
|
+
if (key === 'constructor')
|
|
54
|
+
continue;
|
|
55
|
+
const descriptor = Object.getOwnPropertyDescriptor(proto, key);
|
|
56
|
+
if (descriptor?.value && typeof descriptor.value === 'function') {
|
|
57
|
+
if ((0, decorators_1.getTrainMetadata)(proto, key)) {
|
|
58
|
+
return key;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
exports.TrainerService = TrainerService;
|
|
66
|
+
exports.TrainerService = TrainerService = __decorate([
|
|
67
|
+
(0, core_1.Injectable)(),
|
|
68
|
+
__metadata("design:paramtypes", [model_registry_1.ModelRegistry])
|
|
69
|
+
], TrainerService);
|