@things-factory/mlops 9.1.19

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 (94) hide show
  1. package/README.md +341 -0
  2. package/client/bootstrap.ts +41 -0
  3. package/client/index.ts +2 -0
  4. package/client/pages/ml-deployment/ml-deployment-list-page.ts +46 -0
  5. package/client/pages/ml-model/ml-model-list-page.ts +46 -0
  6. package/client/pages/ml-pipeline/ml-pipeline-list-page.ts +46 -0
  7. package/client/pages/mlops-dashboard/mlops-dashboard-page.ts +90 -0
  8. package/client/route.ts +19 -0
  9. package/client/tsconfig.json +12 -0
  10. package/dist-client/bootstrap.d.ts +1 -0
  11. package/dist-client/bootstrap.js +40 -0
  12. package/dist-client/bootstrap.js.map +1 -0
  13. package/dist-client/index.d.ts +2 -0
  14. package/dist-client/index.js +3 -0
  15. package/dist-client/index.js.map +1 -0
  16. package/dist-client/pages/ml-deployment/ml-deployment-list-page.d.ts +5 -0
  17. package/dist-client/pages/ml-deployment/ml-deployment-list-page.js +49 -0
  18. package/dist-client/pages/ml-deployment/ml-deployment-list-page.js.map +1 -0
  19. package/dist-client/pages/ml-model/ml-model-list-page.d.ts +5 -0
  20. package/dist-client/pages/ml-model/ml-model-list-page.js +49 -0
  21. package/dist-client/pages/ml-model/ml-model-list-page.js.map +1 -0
  22. package/dist-client/pages/ml-pipeline/ml-pipeline-list-page.d.ts +5 -0
  23. package/dist-client/pages/ml-pipeline/ml-pipeline-list-page.js +49 -0
  24. package/dist-client/pages/ml-pipeline/ml-pipeline-list-page.js.map +1 -0
  25. package/dist-client/pages/mlops-dashboard/mlops-dashboard-page.d.ts +5 -0
  26. package/dist-client/pages/mlops-dashboard/mlops-dashboard-page.js +93 -0
  27. package/dist-client/pages/mlops-dashboard/mlops-dashboard-page.js.map +1 -0
  28. package/dist-client/route.d.ts +1 -0
  29. package/dist-client/route.js +17 -0
  30. package/dist-client/route.js.map +1 -0
  31. package/dist-client/tsconfig.tsbuildinfo +1 -0
  32. package/dist-server/index.d.ts +2 -0
  33. package/dist-server/index.js +6 -0
  34. package/dist-server/index.js.map +1 -0
  35. package/dist-server/routes.d.ts +5 -0
  36. package/dist-server/routes.js +12 -0
  37. package/dist-server/routes.js.map +1 -0
  38. package/dist-server/service/index.d.ts +8 -0
  39. package/dist-server/service/index.js +31 -0
  40. package/dist-server/service/index.js.map +1 -0
  41. package/dist-server/service/ml-deployment/index.d.ts +3 -0
  42. package/dist-server/service/ml-deployment/index.js +8 -0
  43. package/dist-server/service/ml-deployment/index.js.map +1 -0
  44. package/dist-server/service/ml-deployment/ml-deployment.d.ts +48 -0
  45. package/dist-server/service/ml-deployment/ml-deployment.js +153 -0
  46. package/dist-server/service/ml-deployment/ml-deployment.js.map +1 -0
  47. package/dist-server/service/ml-model/index.d.ts +5 -0
  48. package/dist-server/service/ml-model/index.js +11 -0
  49. package/dist-server/service/ml-model/index.js.map +1 -0
  50. package/dist-server/service/ml-model/ml-model-mutation.d.ts +24 -0
  51. package/dist-server/service/ml-model/ml-model-mutation.js +177 -0
  52. package/dist-server/service/ml-model/ml-model-mutation.js.map +1 -0
  53. package/dist-server/service/ml-model/ml-model-query.d.ts +23 -0
  54. package/dist-server/service/ml-model/ml-model-query.js +123 -0
  55. package/dist-server/service/ml-model/ml-model-query.js.map +1 -0
  56. package/dist-server/service/ml-model/ml-model-types.d.ts +27 -0
  57. package/dist-server/service/ml-model/ml-model-types.js +105 -0
  58. package/dist-server/service/ml-model/ml-model-types.js.map +1 -0
  59. package/dist-server/service/ml-model/ml-model.d.ts +52 -0
  60. package/dist-server/service/ml-model/ml-model.js +161 -0
  61. package/dist-server/service/ml-model/ml-model.js.map +1 -0
  62. package/dist-server/service/ml-pipeline/index.d.ts +3 -0
  63. package/dist-server/service/ml-pipeline/index.js +8 -0
  64. package/dist-server/service/ml-pipeline/index.js.map +1 -0
  65. package/dist-server/service/ml-pipeline/ml-pipeline.d.ts +50 -0
  66. package/dist-server/service/ml-pipeline/ml-pipeline.js +163 -0
  67. package/dist-server/service/ml-pipeline/ml-pipeline.js.map +1 -0
  68. package/dist-server/service/ml-pipeline-run/index.d.ts +3 -0
  69. package/dist-server/service/ml-pipeline-run/index.js +8 -0
  70. package/dist-server/service/ml-pipeline-run/index.js.map +1 -0
  71. package/dist-server/service/ml-pipeline-run/ml-pipeline-run.d.ts +40 -0
  72. package/dist-server/service/ml-pipeline-run/ml-pipeline-run.js +136 -0
  73. package/dist-server/service/ml-pipeline-run/ml-pipeline-run.js.map +1 -0
  74. package/dist-server/tsconfig.json +11 -0
  75. package/dist-server/tsconfig.tsbuildinfo +1 -0
  76. package/package.json +52 -0
  77. package/server/index.ts +3 -0
  78. package/server/routes.ts +13 -0
  79. package/server/service/index.ts +29 -0
  80. package/server/service/ml-deployment/index.ts +6 -0
  81. package/server/service/ml-deployment/ml-deployment.ts +136 -0
  82. package/server/service/ml-model/index.ts +9 -0
  83. package/server/service/ml-model/ml-model-mutation.ts +171 -0
  84. package/server/service/ml-model/ml-model-query.ts +97 -0
  85. package/server/service/ml-model/ml-model-types.ts +71 -0
  86. package/server/service/ml-model/ml-model.ts +143 -0
  87. package/server/service/ml-pipeline/index.ts +6 -0
  88. package/server/service/ml-pipeline/ml-pipeline.ts +144 -0
  89. package/server/service/ml-pipeline-run/index.ts +6 -0
  90. package/server/service/ml-pipeline-run/ml-pipeline-run.ts +118 -0
  91. package/server/tsconfig.json +11 -0
  92. package/things-factory.config.js +13 -0
  93. package/translations/en.json +30 -0
  94. package/translations/ko.json +30 -0
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MLDeployment = exports.DeploymentEnvironment = exports.DeploymentStatus = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const typeorm_1 = require("typeorm");
6
+ const type_graphql_1 = require("type-graphql");
7
+ const shell_1 = require("@things-factory/shell");
8
+ const auth_base_1 = require("@things-factory/auth-base");
9
+ const ml_model_1 = require("../ml-model/ml-model");
10
+ /**
11
+ * Deployment Status
12
+ */
13
+ var DeploymentStatus;
14
+ (function (DeploymentStatus) {
15
+ DeploymentStatus["DEPLOYING"] = "DEPLOYING";
16
+ DeploymentStatus["ACTIVE"] = "ACTIVE";
17
+ DeploymentStatus["FAILED"] = "FAILED";
18
+ DeploymentStatus["STOPPED"] = "STOPPED";
19
+ })(DeploymentStatus || (exports.DeploymentStatus = DeploymentStatus = {}));
20
+ (0, type_graphql_1.registerEnumType)(DeploymentStatus, {
21
+ name: 'DeploymentStatus',
22
+ description: 'Model deployment status'
23
+ });
24
+ /**
25
+ * Deployment Environment
26
+ */
27
+ var DeploymentEnvironment;
28
+ (function (DeploymentEnvironment) {
29
+ DeploymentEnvironment["DEVELOPMENT"] = "DEVELOPMENT";
30
+ DeploymentEnvironment["STAGING"] = "STAGING";
31
+ DeploymentEnvironment["PRODUCTION"] = "PRODUCTION";
32
+ })(DeploymentEnvironment || (exports.DeploymentEnvironment = DeploymentEnvironment = {}));
33
+ (0, type_graphql_1.registerEnumType)(DeploymentEnvironment, {
34
+ name: 'DeploymentEnvironment',
35
+ description: 'Deployment environment'
36
+ });
37
+ /**
38
+ * ML Deployment Entity
39
+ *
40
+ * Tracks model deployments to various environments
41
+ */
42
+ let MLDeployment = class MLDeployment {
43
+ };
44
+ exports.MLDeployment = MLDeployment;
45
+ tslib_1.__decorate([
46
+ (0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
47
+ (0, type_graphql_1.Field)(type => type_graphql_1.ID, { description: 'Deployment ID' }),
48
+ tslib_1.__metadata("design:type", String)
49
+ ], MLDeployment.prototype, "id", void 0);
50
+ tslib_1.__decorate([
51
+ (0, typeorm_1.ManyToOne)(() => ml_model_1.MLModel),
52
+ (0, type_graphql_1.Field)(type => ml_model_1.MLModel, { description: 'Deployed model' }),
53
+ tslib_1.__metadata("design:type", ml_model_1.MLModel)
54
+ ], MLDeployment.prototype, "model", void 0);
55
+ tslib_1.__decorate([
56
+ (0, typeorm_1.RelationId)((deployment) => deployment.model),
57
+ tslib_1.__metadata("design:type", String)
58
+ ], MLDeployment.prototype, "modelId", void 0);
59
+ tslib_1.__decorate([
60
+ (0, typeorm_1.Column)({ nullable: true, comment: 'Deployment name' }),
61
+ (0, type_graphql_1.Field)({ description: 'Deployment name' }),
62
+ tslib_1.__metadata("design:type", String)
63
+ ], MLDeployment.prototype, "name", void 0);
64
+ tslib_1.__decorate([
65
+ (0, typeorm_1.Column)({ type: 'varchar', default: DeploymentEnvironment.DEVELOPMENT, comment: 'Environment' }),
66
+ (0, type_graphql_1.Field)(type => DeploymentEnvironment, { description: 'Deployment environment' }),
67
+ tslib_1.__metadata("design:type", String)
68
+ ], MLDeployment.prototype, "environment", void 0);
69
+ tslib_1.__decorate([
70
+ (0, typeorm_1.Column)({ type: 'varchar', default: DeploymentStatus.DEPLOYING, comment: 'Status' }),
71
+ (0, type_graphql_1.Field)(type => DeploymentStatus, { description: 'Current deployment status' }),
72
+ tslib_1.__metadata("design:type", String)
73
+ ], MLDeployment.prototype, "status", void 0);
74
+ tslib_1.__decorate([
75
+ (0, typeorm_1.Column)({ nullable: true, comment: 'Endpoint URL' }),
76
+ (0, type_graphql_1.Field)({ nullable: true, description: 'API endpoint URL' }),
77
+ tslib_1.__metadata("design:type", String)
78
+ ], MLDeployment.prototype, "endpoint", void 0);
79
+ tslib_1.__decorate([
80
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true, comment: 'Scaling configuration' }),
81
+ (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'Scaling config as JSON' }),
82
+ tslib_1.__metadata("design:type", String)
83
+ ], MLDeployment.prototype, "scalingConfig", void 0);
84
+ tslib_1.__decorate([
85
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true, comment: 'Resource allocation' }),
86
+ (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'Resource config as JSON' }),
87
+ tslib_1.__metadata("design:type", String)
88
+ ], MLDeployment.prototype, "resources", void 0);
89
+ tslib_1.__decorate([
90
+ (0, typeorm_1.Column)({ type: 'timestamp', nullable: true, comment: 'Deployment time' }),
91
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Deployed at' }),
92
+ tslib_1.__metadata("design:type", Date)
93
+ ], MLDeployment.prototype, "deployedAt", void 0);
94
+ tslib_1.__decorate([
95
+ (0, typeorm_1.Column)({ type: 'int', default: 0, comment: 'Total prediction count' }),
96
+ (0, type_graphql_1.Field)(type => type_graphql_1.Int, { description: 'Total predictions served' }),
97
+ tslib_1.__metadata("design:type", Number)
98
+ ], MLDeployment.prototype, "predictionCount", void 0);
99
+ tslib_1.__decorate([
100
+ (0, typeorm_1.Column)({ type: 'float', nullable: true, comment: 'Average latency (ms)' }),
101
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Average latency in ms' }),
102
+ tslib_1.__metadata("design:type", Number)
103
+ ], MLDeployment.prototype, "avgLatency", void 0);
104
+ tslib_1.__decorate([
105
+ (0, typeorm_1.Column)({ type: 'float', nullable: true, comment: 'Error rate' }),
106
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Error rate (0-1)' }),
107
+ tslib_1.__metadata("design:type", Number)
108
+ ], MLDeployment.prototype, "errorRate", void 0);
109
+ tslib_1.__decorate([
110
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true, comment: 'Deployment metadata' }),
111
+ (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'Metadata as JSON' }),
112
+ tslib_1.__metadata("design:type", String)
113
+ ], MLDeployment.prototype, "metadata", void 0);
114
+ tslib_1.__decorate([
115
+ (0, typeorm_1.ManyToOne)(() => shell_1.Domain),
116
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Domain' }),
117
+ tslib_1.__metadata("design:type", shell_1.Domain)
118
+ ], MLDeployment.prototype, "domain", void 0);
119
+ tslib_1.__decorate([
120
+ (0, typeorm_1.RelationId)((deployment) => deployment.domain),
121
+ tslib_1.__metadata("design:type", String)
122
+ ], MLDeployment.prototype, "domainId", void 0);
123
+ tslib_1.__decorate([
124
+ (0, typeorm_1.ManyToOne)(() => auth_base_1.User, { nullable: true }),
125
+ (0, type_graphql_1.Field)(type => auth_base_1.User, { nullable: true, description: 'Deployed by' }),
126
+ tslib_1.__metadata("design:type", auth_base_1.User)
127
+ ], MLDeployment.prototype, "deployedBy", void 0);
128
+ tslib_1.__decorate([
129
+ (0, typeorm_1.RelationId)((deployment) => deployment.deployedBy),
130
+ tslib_1.__metadata("design:type", String)
131
+ ], MLDeployment.prototype, "deployedById", void 0);
132
+ tslib_1.__decorate([
133
+ (0, typeorm_1.CreateDateColumn)(),
134
+ (0, type_graphql_1.Field)({ description: 'Created at' }),
135
+ tslib_1.__metadata("design:type", Date)
136
+ ], MLDeployment.prototype, "createdAt", void 0);
137
+ tslib_1.__decorate([
138
+ (0, typeorm_1.UpdateDateColumn)(),
139
+ (0, type_graphql_1.Field)({ description: 'Updated at' }),
140
+ tslib_1.__metadata("design:type", Date)
141
+ ], MLDeployment.prototype, "updatedAt", void 0);
142
+ tslib_1.__decorate([
143
+ (0, typeorm_1.DeleteDateColumn)(),
144
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Deleted at' }),
145
+ tslib_1.__metadata("design:type", Date)
146
+ ], MLDeployment.prototype, "deletedAt", void 0);
147
+ exports.MLDeployment = MLDeployment = tslib_1.__decorate([
148
+ (0, typeorm_1.Entity)('ml_deployments'),
149
+ (0, typeorm_1.Index)('ix_ml_deployment_0', ['domain', 'model']),
150
+ (0, typeorm_1.Index)('ix_ml_deployment_1', ['environment', 'status']),
151
+ (0, type_graphql_1.ObjectType)({ description: 'ML Model deployment configuration' })
152
+ ], MLDeployment);
153
+ //# sourceMappingURL=ml-deployment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ml-deployment.js","sourceRoot":"","sources":["../../../server/service/ml-deployment/ml-deployment.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n PrimaryGeneratedColumn\n} from 'typeorm'\nimport { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { MLModel } from '../ml-model/ml-model'\n\n/**\n * Deployment Status\n */\nexport enum DeploymentStatus {\n DEPLOYING = 'DEPLOYING',\n ACTIVE = 'ACTIVE',\n FAILED = 'FAILED',\n STOPPED = 'STOPPED'\n}\n\nregisterEnumType(DeploymentStatus, {\n name: 'DeploymentStatus',\n description: 'Model deployment status'\n})\n\n/**\n * Deployment Environment\n */\nexport enum DeploymentEnvironment {\n DEVELOPMENT = 'DEVELOPMENT',\n STAGING = 'STAGING',\n PRODUCTION = 'PRODUCTION'\n}\n\nregisterEnumType(DeploymentEnvironment, {\n name: 'DeploymentEnvironment',\n description: 'Deployment environment'\n})\n\n/**\n * ML Deployment Entity\n *\n * Tracks model deployments to various environments\n */\n@Entity('ml_deployments')\n@Index('ix_ml_deployment_0', ['domain', 'model'])\n@Index('ix_ml_deployment_1', ['environment', 'status'])\n@ObjectType({ description: 'ML Model deployment configuration' })\nexport class MLDeployment {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Deployment ID' })\n id: string\n\n @ManyToOne(() => MLModel)\n @Field(type => MLModel, { description: 'Deployed model' })\n model: MLModel\n\n @RelationId((deployment: MLDeployment) => deployment.model)\n modelId: string\n\n @Column({ nullable: true, comment: 'Deployment name' })\n @Field({ description: 'Deployment name' })\n name: string\n\n @Column({ type: 'varchar', default: DeploymentEnvironment.DEVELOPMENT, comment: 'Environment' })\n @Field(type => DeploymentEnvironment, { description: 'Deployment environment' })\n environment: DeploymentEnvironment\n\n @Column({ type: 'varchar', default: DeploymentStatus.DEPLOYING, comment: 'Status' })\n @Field(type => DeploymentStatus, { description: 'Current deployment status' })\n status: DeploymentStatus\n\n @Column({ nullable: true, comment: 'Endpoint URL' })\n @Field({ nullable: true, description: 'API endpoint URL' })\n endpoint?: string\n\n @Column({ type: 'simple-json', nullable: true, comment: 'Scaling configuration' })\n @Field(type => String, { nullable: true, description: 'Scaling config as JSON' })\n scalingConfig?: string\n\n @Column({ type: 'simple-json', nullable: true, comment: 'Resource allocation' })\n @Field(type => String, { nullable: true, description: 'Resource config as JSON' })\n resources?: string\n\n @Column({ type: 'timestamp', nullable: true, comment: 'Deployment time' })\n @Field({ nullable: true, description: 'Deployed at' })\n deployedAt?: Date\n\n @Column({ type: 'int', default: 0, comment: 'Total prediction count' })\n @Field(type => Int, { description: 'Total predictions served' })\n predictionCount: number\n\n @Column({ type: 'float', nullable: true, comment: 'Average latency (ms)' })\n @Field({ nullable: true, description: 'Average latency in ms' })\n avgLatency?: number\n\n @Column({ type: 'float', nullable: true, comment: 'Error rate' })\n @Field({ nullable: true, description: 'Error rate (0-1)' })\n errorRate?: number\n\n @Column({ type: 'simple-json', nullable: true, comment: 'Deployment metadata' })\n @Field(type => String, { nullable: true, description: 'Metadata as JSON' })\n metadata?: string\n\n @ManyToOne(() => Domain)\n @Field({ nullable: true, description: 'Domain' })\n domain?: Domain\n\n @RelationId((deployment: MLDeployment) => deployment.domain)\n domainId?: string\n\n @ManyToOne(() => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'Deployed by' })\n deployedBy?: User\n\n @RelationId((deployment: MLDeployment) => deployment.deployedBy)\n deployedById?: string\n\n @CreateDateColumn()\n @Field({ description: 'Created at' })\n createdAt: Date\n\n @UpdateDateColumn()\n @Field({ description: 'Updated at' })\n updatedAt: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'Deleted at' })\n deletedAt?: Date\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import { MLModel } from './ml-model';
2
+ import { MLModelQuery } from './ml-model-query';
3
+ import { MLModelMutation } from './ml-model-mutation';
4
+ export declare const entities: (typeof MLModel)[];
5
+ export declare const resolvers: (typeof MLModelQuery | typeof MLModelMutation)[];
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvers = exports.entities = void 0;
4
+ const ml_model_1 = require("./ml-model");
5
+ const ml_model_query_1 = require("./ml-model-query");
6
+ const ml_model_mutation_1 = require("./ml-model-mutation");
7
+ exports.entities = [ml_model_1.MLModel];
8
+ exports.resolvers = [ml_model_query_1.MLModelQuery, ml_model_mutation_1.MLModelMutation];
9
+ // export * from './ml-model'
10
+ // export * from './ml-model-types'
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/ml-model/index.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,qDAA+C;AAC/C,2DAAqD;AAExC,QAAA,QAAQ,GAAG,CAAC,kBAAO,CAAC,CAAA;AACpB,QAAA,SAAS,GAAG,CAAC,6BAAY,EAAE,mCAAe,CAAC,CAAA;AAExD,6BAA6B;AAC7B,mCAAmC","sourcesContent":["import { MLModel } from './ml-model'\nimport { MLModelQuery } from './ml-model-query'\nimport { MLModelMutation } from './ml-model-mutation'\n\nexport const entities = [MLModel]\nexport const resolvers = [MLModelQuery, MLModelMutation]\n\n// export * from './ml-model'\n// export * from './ml-model-types'\n"]}
@@ -0,0 +1,24 @@
1
+ import { MLModel } from './ml-model';
2
+ import { RegisterMLModelInput, UpdateMLModelInput, PromoteModelInput } from './ml-model-types';
3
+ export declare class MLModelMutation {
4
+ /**
5
+ * Register new ML model
6
+ */
7
+ registerMLModel(input: RegisterMLModelInput, context: ResolverContext): Promise<MLModel>;
8
+ /**
9
+ * Update ML model
10
+ */
11
+ updateMLModel(id: string, input: UpdateMLModelInput, context: ResolverContext): Promise<MLModel>;
12
+ /**
13
+ * Promote model to target stage
14
+ */
15
+ promoteMLModel(input: PromoteModelInput, context: ResolverContext): Promise<MLModel>;
16
+ /**
17
+ * Archive ML model
18
+ */
19
+ archiveMLModel(id: string, context: ResolverContext): Promise<boolean>;
20
+ /**
21
+ * Delete ML model
22
+ */
23
+ deleteMLModel(id: string, context: ResolverContext): Promise<boolean>;
24
+ }
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MLModelMutation = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const type_graphql_1 = require("type-graphql");
6
+ const typeorm_1 = require("typeorm");
7
+ const ml_model_1 = require("./ml-model");
8
+ const ml_model_types_1 = require("./ml-model-types");
9
+ let MLModelMutation = class MLModelMutation {
10
+ /**
11
+ * Register new ML model
12
+ */
13
+ async registerMLModel(input, context) {
14
+ const { domain, user } = context.state;
15
+ // Check if model with same name and version exists
16
+ const existing = await (0, typeorm_1.getRepository)(ml_model_1.MLModel).findOne({
17
+ where: {
18
+ domain: { id: domain.id },
19
+ name: input.name,
20
+ version: input.version
21
+ }
22
+ });
23
+ if (existing) {
24
+ throw new Error(`Model ${input.name} version ${input.version} already exists`);
25
+ }
26
+ const model = (0, typeorm_1.getRepository)(ml_model_1.MLModel).create({
27
+ ...input,
28
+ stage: input.stage || ml_model_1.ModelStage.NONE,
29
+ domain,
30
+ creator: user,
31
+ updater: user
32
+ });
33
+ return await (0, typeorm_1.getRepository)(ml_model_1.MLModel).save(model);
34
+ }
35
+ /**
36
+ * Update ML model
37
+ */
38
+ async updateMLModel(id, input, context) {
39
+ const { domain, user } = context.state;
40
+ const model = await (0, typeorm_1.getRepository)(ml_model_1.MLModel).findOne({
41
+ where: { id, domain: { id: domain.id } }
42
+ });
43
+ if (!model) {
44
+ throw new Error(`Model ${id} not found`);
45
+ }
46
+ Object.assign(model, input, { updater: user });
47
+ return await (0, typeorm_1.getRepository)(ml_model_1.MLModel).save(model);
48
+ }
49
+ /**
50
+ * Promote model to target stage
51
+ */
52
+ async promoteMLModel(input, context) {
53
+ const { domain, user } = context.state;
54
+ const model = await (0, typeorm_1.getRepository)(ml_model_1.MLModel).findOne({
55
+ where: { id: input.modelId, domain: { id: domain.id } }
56
+ });
57
+ if (!model) {
58
+ throw new Error(`Model ${input.modelId} not found`);
59
+ }
60
+ // Validate stage transition
61
+ if (model.stage === ml_model_1.ModelStage.ARCHIVED) {
62
+ throw new Error('Cannot promote archived model');
63
+ }
64
+ if (input.targetStage === ml_model_1.ModelStage.NONE) {
65
+ throw new Error('Cannot promote to None stage');
66
+ }
67
+ // If promoting to Production, demote other Production models with same name
68
+ if (input.targetStage === ml_model_1.ModelStage.PRODUCTION) {
69
+ await (0, typeorm_1.getRepository)(ml_model_1.MLModel).update({
70
+ domain: { id: domain.id },
71
+ name: model.name,
72
+ stage: ml_model_1.ModelStage.PRODUCTION
73
+ }, {
74
+ stage: ml_model_1.ModelStage.STAGING
75
+ });
76
+ }
77
+ model.stage = input.targetStage;
78
+ model.updater = user;
79
+ return await (0, typeorm_1.getRepository)(ml_model_1.MLModel).save(model);
80
+ }
81
+ /**
82
+ * Archive ML model
83
+ */
84
+ async archiveMLModel(id, context) {
85
+ const { domain } = context.state;
86
+ const model = await (0, typeorm_1.getRepository)(ml_model_1.MLModel).findOne({
87
+ where: { id, domain: { id: domain.id } }
88
+ });
89
+ if (!model) {
90
+ throw new Error(`Model ${id} not found`);
91
+ }
92
+ if (model.stage === ml_model_1.ModelStage.PRODUCTION) {
93
+ throw new Error('Cannot archive production model. Demote it first.');
94
+ }
95
+ model.stage = ml_model_1.ModelStage.ARCHIVED;
96
+ await (0, typeorm_1.getRepository)(ml_model_1.MLModel).save(model);
97
+ return true;
98
+ }
99
+ /**
100
+ * Delete ML model
101
+ */
102
+ async deleteMLModel(id, context) {
103
+ const { domain } = context.state;
104
+ const model = await (0, typeorm_1.getRepository)(ml_model_1.MLModel).findOne({
105
+ where: { id, domain: { id: domain.id } }
106
+ });
107
+ if (!model) {
108
+ throw new Error(`Model ${id} not found`);
109
+ }
110
+ if (model.stage === ml_model_1.ModelStage.PRODUCTION) {
111
+ throw new Error('Cannot delete production model');
112
+ }
113
+ await (0, typeorm_1.getRepository)(ml_model_1.MLModel).softDelete({ id });
114
+ return true;
115
+ }
116
+ };
117
+ exports.MLModelMutation = MLModelMutation;
118
+ tslib_1.__decorate([
119
+ (0, type_graphql_1.Mutation)(returns => ml_model_1.MLModel, {
120
+ description: 'Register new ML model in the system'
121
+ }),
122
+ (0, type_graphql_1.Directive)('@privilege(category: "mlops", privilege: "mutation")'),
123
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('input')),
124
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
125
+ tslib_1.__metadata("design:type", Function),
126
+ tslib_1.__metadata("design:paramtypes", [ml_model_types_1.RegisterMLModelInput, Object]),
127
+ tslib_1.__metadata("design:returntype", Promise)
128
+ ], MLModelMutation.prototype, "registerMLModel", null);
129
+ tslib_1.__decorate([
130
+ (0, type_graphql_1.Mutation)(returns => ml_model_1.MLModel, {
131
+ description: 'Update ML model information'
132
+ }),
133
+ (0, type_graphql_1.Directive)('@privilege(category: "mlops", privilege: "mutation")'),
134
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
135
+ tslib_1.__param(1, (0, type_graphql_1.Arg)('input')),
136
+ tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
137
+ tslib_1.__metadata("design:type", Function),
138
+ tslib_1.__metadata("design:paramtypes", [String, ml_model_types_1.UpdateMLModelInput, Object]),
139
+ tslib_1.__metadata("design:returntype", Promise)
140
+ ], MLModelMutation.prototype, "updateMLModel", null);
141
+ tslib_1.__decorate([
142
+ (0, type_graphql_1.Mutation)(returns => ml_model_1.MLModel, {
143
+ description: 'Promote model to target deployment stage (Staging/Production)'
144
+ }),
145
+ (0, type_graphql_1.Directive)('@privilege(category: "mlops", privilege: "mutation")'),
146
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('input')),
147
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
148
+ tslib_1.__metadata("design:type", Function),
149
+ tslib_1.__metadata("design:paramtypes", [ml_model_types_1.PromoteModelInput, Object]),
150
+ tslib_1.__metadata("design:returntype", Promise)
151
+ ], MLModelMutation.prototype, "promoteMLModel", null);
152
+ tslib_1.__decorate([
153
+ (0, type_graphql_1.Mutation)(returns => Boolean, {
154
+ description: 'Archive ML model (soft delete)'
155
+ }),
156
+ (0, type_graphql_1.Directive)('@privilege(category: "mlops", privilege: "mutation")'),
157
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
158
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
159
+ tslib_1.__metadata("design:type", Function),
160
+ tslib_1.__metadata("design:paramtypes", [String, Object]),
161
+ tslib_1.__metadata("design:returntype", Promise)
162
+ ], MLModelMutation.prototype, "archiveMLModel", null);
163
+ tslib_1.__decorate([
164
+ (0, type_graphql_1.Mutation)(returns => Boolean, {
165
+ description: 'Delete ML model permanently'
166
+ }),
167
+ (0, type_graphql_1.Directive)('@privilege(category: "mlops", privilege: "mutation")'),
168
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
169
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
170
+ tslib_1.__metadata("design:type", Function),
171
+ tslib_1.__metadata("design:paramtypes", [String, Object]),
172
+ tslib_1.__metadata("design:returntype", Promise)
173
+ ], MLModelMutation.prototype, "deleteMLModel", null);
174
+ exports.MLModelMutation = MLModelMutation = tslib_1.__decorate([
175
+ (0, type_graphql_1.Resolver)(ml_model_1.MLModel)
176
+ ], MLModelMutation);
177
+ //# sourceMappingURL=ml-model-mutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ml-model-mutation.js","sourceRoot":"","sources":["../../../server/service/ml-model/ml-model-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { getRepository } from 'typeorm'\nimport { MLModel, ModelStage } from './ml-model'\nimport { RegisterMLModelInput, UpdateMLModelInput, PromoteModelInput } from './ml-model-types'\n\n@Resolver(MLModel)\nexport class MLModelMutation {\n /**\n * Register new ML model\n */\n @Mutation(returns => MLModel, {\n description: 'Register new ML model in the system'\n })\n @Directive('@privilege(category: \"mlops\", privilege: \"mutation\")')\n async registerMLModel(@Arg('input') input: RegisterMLModelInput, @Ctx() context: ResolverContext): Promise<MLModel> {\n const { domain, user } = context.state\n\n // Check if model with same name and version exists\n const existing = await getRepository(MLModel).findOne({\n where: {\n domain: { id: domain.id },\n name: input.name,\n version: input.version\n }\n })\n\n if (existing) {\n throw new Error(`Model ${input.name} version ${input.version} already exists`)\n }\n\n const model = getRepository(MLModel).create({\n ...input,\n stage: input.stage || ModelStage.NONE,\n domain,\n creator: user,\n updater: user\n })\n\n return await getRepository(MLModel).save(model)\n }\n\n /**\n * Update ML model\n */\n @Mutation(returns => MLModel, {\n description: 'Update ML model information'\n })\n @Directive('@privilege(category: \"mlops\", privilege: \"mutation\")')\n async updateMLModel(\n @Arg('id') id: string,\n @Arg('input') input: UpdateMLModelInput,\n @Ctx() context: ResolverContext\n ): Promise<MLModel> {\n const { domain, user } = context.state\n\n const model = await getRepository(MLModel).findOne({\n where: { id, domain: { id: domain.id } }\n })\n\n if (!model) {\n throw new Error(`Model ${id} not found`)\n }\n\n Object.assign(model, input, { updater: user })\n\n return await getRepository(MLModel).save(model)\n }\n\n /**\n * Promote model to target stage\n */\n @Mutation(returns => MLModel, {\n description: 'Promote model to target deployment stage (Staging/Production)'\n })\n @Directive('@privilege(category: \"mlops\", privilege: \"mutation\")')\n async promoteMLModel(@Arg('input') input: PromoteModelInput, @Ctx() context: ResolverContext): Promise<MLModel> {\n const { domain, user } = context.state\n\n const model = await getRepository(MLModel).findOne({\n where: { id: input.modelId, domain: { id: domain.id } }\n })\n\n if (!model) {\n throw new Error(`Model ${input.modelId} not found`)\n }\n\n // Validate stage transition\n if (model.stage === ModelStage.ARCHIVED) {\n throw new Error('Cannot promote archived model')\n }\n\n if (input.targetStage === ModelStage.NONE) {\n throw new Error('Cannot promote to None stage')\n }\n\n // If promoting to Production, demote other Production models with same name\n if (input.targetStage === ModelStage.PRODUCTION) {\n await getRepository(MLModel).update(\n {\n domain: { id: domain.id },\n name: model.name,\n stage: ModelStage.PRODUCTION\n },\n {\n stage: ModelStage.STAGING\n }\n )\n }\n\n model.stage = input.targetStage\n model.updater = user\n\n return await getRepository(MLModel).save(model)\n }\n\n /**\n * Archive ML model\n */\n @Mutation(returns => Boolean, {\n description: 'Archive ML model (soft delete)'\n })\n @Directive('@privilege(category: \"mlops\", privilege: \"mutation\")')\n async archiveMLModel(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain } = context.state\n\n const model = await getRepository(MLModel).findOne({\n where: { id, domain: { id: domain.id } }\n })\n\n if (!model) {\n throw new Error(`Model ${id} not found`)\n }\n\n if (model.stage === ModelStage.PRODUCTION) {\n throw new Error('Cannot archive production model. Demote it first.')\n }\n\n model.stage = ModelStage.ARCHIVED\n\n await getRepository(MLModel).save(model)\n\n return true\n }\n\n /**\n * Delete ML model\n */\n @Mutation(returns => Boolean, {\n description: 'Delete ML model permanently'\n })\n @Directive('@privilege(category: \"mlops\", privilege: \"mutation\")')\n async deleteMLModel(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain } = context.state\n\n const model = await getRepository(MLModel).findOne({\n where: { id, domain: { id: domain.id } }\n })\n\n if (!model) {\n throw new Error(`Model ${id} not found`)\n }\n\n if (model.stage === ModelStage.PRODUCTION) {\n throw new Error('Cannot delete production model')\n }\n\n await getRepository(MLModel).softDelete({ id })\n\n return true\n }\n}\n"]}
@@ -0,0 +1,23 @@
1
+ import { MLModel, ModelStage } from './ml-model';
2
+ export declare class MLModelQuery {
3
+ /**
4
+ * Get all ML models
5
+ */
6
+ mlModels(context: ResolverContext): Promise<MLModel[]>;
7
+ /**
8
+ * Get ML model by ID
9
+ */
10
+ mlModel(id: string, context: ResolverContext): Promise<MLModel | undefined>;
11
+ /**
12
+ * Get models by stage
13
+ */
14
+ mlModelsByStage(stage: ModelStage, context: ResolverContext): Promise<MLModel[]>;
15
+ /**
16
+ * Get models by name (all versions)
17
+ */
18
+ mlModelVersions(name: string, context: ResolverContext): Promise<MLModel[]>;
19
+ /**
20
+ * Get models by Label Studio project
21
+ */
22
+ mlModelsByLabelStudioProject(projectId: number, context: ResolverContext): Promise<MLModel[]>;
23
+ }
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MLModelQuery = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const type_graphql_1 = require("type-graphql");
6
+ const typeorm_1 = require("typeorm");
7
+ const ml_model_1 = require("./ml-model");
8
+ let MLModelQuery = class MLModelQuery {
9
+ /**
10
+ * Get all ML models
11
+ */
12
+ async mlModels(context) {
13
+ const { domain } = context.state;
14
+ return await (0, typeorm_1.getRepository)(ml_model_1.MLModel).find({
15
+ where: { domain: { id: domain.id } },
16
+ order: { createdAt: 'DESC' },
17
+ relations: ['creator', 'updater']
18
+ });
19
+ }
20
+ /**
21
+ * Get ML model by ID
22
+ */
23
+ async mlModel(id, context) {
24
+ const { domain } = context.state;
25
+ return await (0, typeorm_1.getRepository)(ml_model_1.MLModel).findOne({
26
+ where: { id, domain: { id: domain.id } },
27
+ relations: ['creator', 'updater']
28
+ });
29
+ }
30
+ /**
31
+ * Get models by stage
32
+ */
33
+ async mlModelsByStage(stage, context) {
34
+ const { domain } = context.state;
35
+ return await (0, typeorm_1.getRepository)(ml_model_1.MLModel).find({
36
+ where: { domain: { id: domain.id }, stage },
37
+ order: { updatedAt: 'DESC' },
38
+ relations: ['creator', 'updater']
39
+ });
40
+ }
41
+ /**
42
+ * Get models by name (all versions)
43
+ */
44
+ async mlModelVersions(name, context) {
45
+ const { domain } = context.state;
46
+ return await (0, typeorm_1.getRepository)(ml_model_1.MLModel).find({
47
+ where: { domain: { id: domain.id }, name },
48
+ order: { createdAt: 'DESC' },
49
+ relations: ['creator', 'updater']
50
+ });
51
+ }
52
+ /**
53
+ * Get models by Label Studio project
54
+ */
55
+ async mlModelsByLabelStudioProject(projectId, context) {
56
+ const { domain } = context.state;
57
+ return await (0, typeorm_1.getRepository)(ml_model_1.MLModel).find({
58
+ where: { domain: { id: domain.id }, labelStudioProjectId: projectId },
59
+ order: { createdAt: 'DESC' },
60
+ relations: ['creator', 'updater']
61
+ });
62
+ }
63
+ };
64
+ exports.MLModelQuery = MLModelQuery;
65
+ tslib_1.__decorate([
66
+ (0, type_graphql_1.Query)(returns => [ml_model_1.MLModel], {
67
+ description: 'Get all ML models in the system'
68
+ }),
69
+ (0, type_graphql_1.Directive)('@privilege(category: "mlops", privilege: "query")'),
70
+ tslib_1.__param(0, (0, type_graphql_1.Ctx)()),
71
+ tslib_1.__metadata("design:type", Function),
72
+ tslib_1.__metadata("design:paramtypes", [Object]),
73
+ tslib_1.__metadata("design:returntype", Promise)
74
+ ], MLModelQuery.prototype, "mlModels", null);
75
+ tslib_1.__decorate([
76
+ (0, type_graphql_1.Query)(returns => ml_model_1.MLModel, {
77
+ description: 'Get ML model by ID',
78
+ nullable: true
79
+ }),
80
+ (0, type_graphql_1.Directive)('@privilege(category: "mlops", privilege: "query")'),
81
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
82
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
83
+ tslib_1.__metadata("design:type", Function),
84
+ tslib_1.__metadata("design:paramtypes", [String, Object]),
85
+ tslib_1.__metadata("design:returntype", Promise)
86
+ ], MLModelQuery.prototype, "mlModel", null);
87
+ tslib_1.__decorate([
88
+ (0, type_graphql_1.Query)(returns => [ml_model_1.MLModel], {
89
+ description: 'Get models by deployment stage'
90
+ }),
91
+ (0, type_graphql_1.Directive)('@privilege(category: "mlops", privilege: "query")'),
92
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('stage', type => ml_model_1.ModelStage)),
93
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
94
+ tslib_1.__metadata("design:type", Function),
95
+ tslib_1.__metadata("design:paramtypes", [String, Object]),
96
+ tslib_1.__metadata("design:returntype", Promise)
97
+ ], MLModelQuery.prototype, "mlModelsByStage", null);
98
+ tslib_1.__decorate([
99
+ (0, type_graphql_1.Query)(returns => [ml_model_1.MLModel], {
100
+ description: 'Get all versions of a model by name'
101
+ }),
102
+ (0, type_graphql_1.Directive)('@privilege(category: "mlops", privilege: "query")'),
103
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('name')),
104
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
105
+ tslib_1.__metadata("design:type", Function),
106
+ tslib_1.__metadata("design:paramtypes", [String, Object]),
107
+ tslib_1.__metadata("design:returntype", Promise)
108
+ ], MLModelQuery.prototype, "mlModelVersions", null);
109
+ tslib_1.__decorate([
110
+ (0, type_graphql_1.Query)(returns => [ml_model_1.MLModel], {
111
+ description: 'Get models associated with Label Studio project'
112
+ }),
113
+ (0, type_graphql_1.Directive)('@privilege(category: "mlops", privilege: "query")'),
114
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('projectId', type => Number)),
115
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
116
+ tslib_1.__metadata("design:type", Function),
117
+ tslib_1.__metadata("design:paramtypes", [Number, Object]),
118
+ tslib_1.__metadata("design:returntype", Promise)
119
+ ], MLModelQuery.prototype, "mlModelsByLabelStudioProject", null);
120
+ exports.MLModelQuery = MLModelQuery = tslib_1.__decorate([
121
+ (0, type_graphql_1.Resolver)(ml_model_1.MLModel)
122
+ ], MLModelQuery);
123
+ //# sourceMappingURL=ml-model-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ml-model-query.js","sourceRoot":"","sources":["../../../server/service/ml-model/ml-model-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, Arg, Ctx, Directive } from 'type-graphql'\nimport { getRepository, In } from 'typeorm'\nimport { MLModel, ModelStage } from './ml-model'\n\n@Resolver(MLModel)\nexport class MLModelQuery {\n /**\n * Get all ML models\n */\n @Query(returns => [MLModel], {\n description: 'Get all ML models in the system'\n })\n @Directive('@privilege(category: \"mlops\", privilege: \"query\")')\n async mlModels(@Ctx() context: ResolverContext): Promise<MLModel[]> {\n const { domain } = context.state\n\n return await getRepository(MLModel).find({\n where: { domain: { id: domain.id } },\n order: { createdAt: 'DESC' },\n relations: ['creator', 'updater']\n })\n }\n\n /**\n * Get ML model by ID\n */\n @Query(returns => MLModel, {\n description: 'Get ML model by ID',\n nullable: true\n })\n @Directive('@privilege(category: \"mlops\", privilege: \"query\")')\n async mlModel(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<MLModel | undefined> {\n const { domain } = context.state\n\n return await getRepository(MLModel).findOne({\n where: { id, domain: { id: domain.id } },\n relations: ['creator', 'updater']\n })\n }\n\n /**\n * Get models by stage\n */\n @Query(returns => [MLModel], {\n description: 'Get models by deployment stage'\n })\n @Directive('@privilege(category: \"mlops\", privilege: \"query\")')\n async mlModelsByStage(\n @Arg('stage', type => ModelStage) stage: ModelStage,\n @Ctx() context: ResolverContext\n ): Promise<MLModel[]> {\n const { domain } = context.state\n\n return await getRepository(MLModel).find({\n where: { domain: { id: domain.id }, stage },\n order: { updatedAt: 'DESC' },\n relations: ['creator', 'updater']\n })\n }\n\n /**\n * Get models by name (all versions)\n */\n @Query(returns => [MLModel], {\n description: 'Get all versions of a model by name'\n })\n @Directive('@privilege(category: \"mlops\", privilege: \"query\")')\n async mlModelVersions(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<MLModel[]> {\n const { domain } = context.state\n\n return await getRepository(MLModel).find({\n where: { domain: { id: domain.id }, name },\n order: { createdAt: 'DESC' },\n relations: ['creator', 'updater']\n })\n }\n\n /**\n * Get models by Label Studio project\n */\n @Query(returns => [MLModel], {\n description: 'Get models associated with Label Studio project'\n })\n @Directive('@privilege(category: \"mlops\", privilege: \"query\")')\n async mlModelsByLabelStudioProject(\n @Arg('projectId', type => Number) projectId: number,\n @Ctx() context: ResolverContext\n ): Promise<MLModel[]> {\n const { domain } = context.state\n\n return await getRepository(MLModel).find({\n where: { domain: { id: domain.id }, labelStudioProjectId: projectId },\n order: { createdAt: 'DESC' },\n relations: ['creator', 'updater']\n })\n }\n}\n"]}
@@ -0,0 +1,27 @@
1
+ import { ModelStage, ModelFramework } from './ml-model';
2
+ export declare class RegisterMLModelInput {
3
+ name: string;
4
+ version: string;
5
+ description?: string;
6
+ stage?: ModelStage;
7
+ framework?: ModelFramework;
8
+ metrics?: string;
9
+ metadata?: string;
10
+ artifactUri?: string;
11
+ mlflowRunId?: string;
12
+ mlflowExperimentId?: string;
13
+ labelStudioProjectId?: number;
14
+ tags?: string;
15
+ }
16
+ export declare class UpdateMLModelInput {
17
+ description?: string;
18
+ stage?: ModelStage;
19
+ metrics?: string;
20
+ metadata?: string;
21
+ tags?: string;
22
+ }
23
+ export declare class PromoteModelInput {
24
+ modelId: string;
25
+ targetStage: ModelStage;
26
+ notes?: string;
27
+ }