@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.
Files changed (44) hide show
  1. package/LICENSE +192 -0
  2. package/dist/decorators/index.d.ts +4 -0
  3. package/dist/decorators/index.d.ts.map +1 -0
  4. package/dist/decorators/index.js +15 -0
  5. package/dist/decorators/model.decorator.d.ts +26 -0
  6. package/dist/decorators/model.decorator.d.ts.map +1 -0
  7. package/dist/decorators/model.decorator.js +48 -0
  8. package/dist/decorators/predict.decorator.d.ts +20 -0
  9. package/dist/decorators/predict.decorator.d.ts.map +1 -0
  10. package/dist/decorators/predict.decorator.js +40 -0
  11. package/dist/decorators/train.decorator.d.ts +21 -0
  12. package/dist/decorators/train.decorator.d.ts.map +1 -0
  13. package/dist/decorators/train.decorator.js +41 -0
  14. package/dist/evaluation/metrics.service.d.ts +30 -0
  15. package/dist/evaluation/metrics.service.d.ts.map +1 -0
  16. package/dist/evaluation/metrics.service.js +54 -0
  17. package/dist/index.d.ts +16 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +42 -0
  20. package/dist/inference/batch.service.d.ts +16 -0
  21. package/dist/inference/batch.service.d.ts.map +1 -0
  22. package/dist/inference/batch.service.js +47 -0
  23. package/dist/inference/predictor.service.d.ts +13 -0
  24. package/dist/inference/predictor.service.d.ts.map +1 -0
  25. package/dist/inference/predictor.service.js +65 -0
  26. package/dist/ml-model.base.d.ts +20 -0
  27. package/dist/ml-model.base.d.ts.map +1 -0
  28. package/dist/ml-model.base.js +33 -0
  29. package/dist/ml.module.d.ts +27 -0
  30. package/dist/ml.module.d.ts.map +1 -0
  31. package/dist/ml.module.js +126 -0
  32. package/dist/ml.types.d.ts +30 -0
  33. package/dist/ml.types.d.ts.map +1 -0
  34. package/dist/ml.types.js +5 -0
  35. package/dist/registry/model.registry.d.ts +21 -0
  36. package/dist/registry/model.registry.d.ts.map +1 -0
  37. package/dist/registry/model.registry.js +64 -0
  38. package/dist/training/pipeline.service.d.ts +17 -0
  39. package/dist/training/pipeline.service.d.ts.map +1 -0
  40. package/dist/training/pipeline.service.js +49 -0
  41. package/dist/training/trainer.service.d.ts +13 -0
  42. package/dist/training/trainer.service.d.ts.map +1 -0
  43. package/dist/training/trainer.service.js +69 -0
  44. 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"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ /**
3
+ * @hazeljs/ml - Type definitions for ML models and operations
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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);