@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.
- package/README.md +341 -0
- package/client/bootstrap.ts +41 -0
- package/client/index.ts +2 -0
- package/client/pages/ml-deployment/ml-deployment-list-page.ts +46 -0
- package/client/pages/ml-model/ml-model-list-page.ts +46 -0
- package/client/pages/ml-pipeline/ml-pipeline-list-page.ts +46 -0
- package/client/pages/mlops-dashboard/mlops-dashboard-page.ts +90 -0
- package/client/route.ts +19 -0
- package/client/tsconfig.json +12 -0
- package/dist-client/bootstrap.d.ts +1 -0
- package/dist-client/bootstrap.js +40 -0
- package/dist-client/bootstrap.js.map +1 -0
- package/dist-client/index.d.ts +2 -0
- package/dist-client/index.js +3 -0
- package/dist-client/index.js.map +1 -0
- package/dist-client/pages/ml-deployment/ml-deployment-list-page.d.ts +5 -0
- package/dist-client/pages/ml-deployment/ml-deployment-list-page.js +49 -0
- package/dist-client/pages/ml-deployment/ml-deployment-list-page.js.map +1 -0
- package/dist-client/pages/ml-model/ml-model-list-page.d.ts +5 -0
- package/dist-client/pages/ml-model/ml-model-list-page.js +49 -0
- package/dist-client/pages/ml-model/ml-model-list-page.js.map +1 -0
- package/dist-client/pages/ml-pipeline/ml-pipeline-list-page.d.ts +5 -0
- package/dist-client/pages/ml-pipeline/ml-pipeline-list-page.js +49 -0
- package/dist-client/pages/ml-pipeline/ml-pipeline-list-page.js.map +1 -0
- package/dist-client/pages/mlops-dashboard/mlops-dashboard-page.d.ts +5 -0
- package/dist-client/pages/mlops-dashboard/mlops-dashboard-page.js +93 -0
- package/dist-client/pages/mlops-dashboard/mlops-dashboard-page.js.map +1 -0
- package/dist-client/route.d.ts +1 -0
- package/dist-client/route.js +17 -0
- package/dist-client/route.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -0
- package/dist-server/index.d.ts +2 -0
- package/dist-server/index.js +6 -0
- package/dist-server/index.js.map +1 -0
- package/dist-server/routes.d.ts +5 -0
- package/dist-server/routes.js +12 -0
- package/dist-server/routes.js.map +1 -0
- package/dist-server/service/index.d.ts +8 -0
- package/dist-server/service/index.js +31 -0
- package/dist-server/service/index.js.map +1 -0
- package/dist-server/service/ml-deployment/index.d.ts +3 -0
- package/dist-server/service/ml-deployment/index.js +8 -0
- package/dist-server/service/ml-deployment/index.js.map +1 -0
- package/dist-server/service/ml-deployment/ml-deployment.d.ts +48 -0
- package/dist-server/service/ml-deployment/ml-deployment.js +153 -0
- package/dist-server/service/ml-deployment/ml-deployment.js.map +1 -0
- package/dist-server/service/ml-model/index.d.ts +5 -0
- package/dist-server/service/ml-model/index.js +11 -0
- package/dist-server/service/ml-model/index.js.map +1 -0
- package/dist-server/service/ml-model/ml-model-mutation.d.ts +24 -0
- package/dist-server/service/ml-model/ml-model-mutation.js +177 -0
- package/dist-server/service/ml-model/ml-model-mutation.js.map +1 -0
- package/dist-server/service/ml-model/ml-model-query.d.ts +23 -0
- package/dist-server/service/ml-model/ml-model-query.js +123 -0
- package/dist-server/service/ml-model/ml-model-query.js.map +1 -0
- package/dist-server/service/ml-model/ml-model-types.d.ts +27 -0
- package/dist-server/service/ml-model/ml-model-types.js +105 -0
- package/dist-server/service/ml-model/ml-model-types.js.map +1 -0
- package/dist-server/service/ml-model/ml-model.d.ts +52 -0
- package/dist-server/service/ml-model/ml-model.js +161 -0
- package/dist-server/service/ml-model/ml-model.js.map +1 -0
- package/dist-server/service/ml-pipeline/index.d.ts +3 -0
- package/dist-server/service/ml-pipeline/index.js +8 -0
- package/dist-server/service/ml-pipeline/index.js.map +1 -0
- package/dist-server/service/ml-pipeline/ml-pipeline.d.ts +50 -0
- package/dist-server/service/ml-pipeline/ml-pipeline.js +163 -0
- package/dist-server/service/ml-pipeline/ml-pipeline.js.map +1 -0
- package/dist-server/service/ml-pipeline-run/index.d.ts +3 -0
- package/dist-server/service/ml-pipeline-run/index.js +8 -0
- package/dist-server/service/ml-pipeline-run/index.js.map +1 -0
- package/dist-server/service/ml-pipeline-run/ml-pipeline-run.d.ts +40 -0
- package/dist-server/service/ml-pipeline-run/ml-pipeline-run.js +136 -0
- package/dist-server/service/ml-pipeline-run/ml-pipeline-run.js.map +1 -0
- package/dist-server/tsconfig.json +11 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -0
- package/package.json +52 -0
- package/server/index.ts +3 -0
- package/server/routes.ts +13 -0
- package/server/service/index.ts +29 -0
- package/server/service/ml-deployment/index.ts +6 -0
- package/server/service/ml-deployment/ml-deployment.ts +136 -0
- package/server/service/ml-model/index.ts +9 -0
- package/server/service/ml-model/ml-model-mutation.ts +171 -0
- package/server/service/ml-model/ml-model-query.ts +97 -0
- package/server/service/ml-model/ml-model-types.ts +71 -0
- package/server/service/ml-model/ml-model.ts +143 -0
- package/server/service/ml-pipeline/index.ts +6 -0
- package/server/service/ml-pipeline/ml-pipeline.ts +144 -0
- package/server/service/ml-pipeline-run/index.ts +6 -0
- package/server/service/ml-pipeline-run/ml-pipeline-run.ts +118 -0
- package/server/tsconfig.json +11 -0
- package/things-factory.config.js +13 -0
- package/translations/en.json +30 -0
- package/translations/ko.json +30 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CreateDateColumn,
|
|
3
|
+
UpdateDateColumn,
|
|
4
|
+
DeleteDateColumn,
|
|
5
|
+
Entity,
|
|
6
|
+
Index,
|
|
7
|
+
Column,
|
|
8
|
+
RelationId,
|
|
9
|
+
ManyToOne,
|
|
10
|
+
PrimaryGeneratedColumn
|
|
11
|
+
} from 'typeorm'
|
|
12
|
+
import { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'
|
|
13
|
+
import { Domain } from '@things-factory/shell'
|
|
14
|
+
import { User } from '@things-factory/auth-base'
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* ML Model Stage
|
|
18
|
+
*/
|
|
19
|
+
export enum ModelStage {
|
|
20
|
+
NONE = 'None',
|
|
21
|
+
STAGING = 'Staging',
|
|
22
|
+
PRODUCTION = 'Production',
|
|
23
|
+
ARCHIVED = 'Archived'
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
registerEnumType(ModelStage, {
|
|
27
|
+
name: 'ModelStage',
|
|
28
|
+
description: 'ML model deployment stage'
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Model Framework
|
|
33
|
+
*/
|
|
34
|
+
export enum ModelFramework {
|
|
35
|
+
TENSORFLOW = 'TensorFlow',
|
|
36
|
+
PYTORCH = 'PyTorch',
|
|
37
|
+
SKLEARN = 'Scikit-Learn',
|
|
38
|
+
XGBOOST = 'XGBoost',
|
|
39
|
+
LIGHTGBM = 'LightGBM',
|
|
40
|
+
ONNX = 'ONNX',
|
|
41
|
+
CUSTOM = 'Custom'
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
registerEnumType(ModelFramework, {
|
|
45
|
+
name: 'ModelFramework',
|
|
46
|
+
description: 'ML framework used for model training'
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* ML Model Entity
|
|
51
|
+
*
|
|
52
|
+
* Represents a registered ML model with version management
|
|
53
|
+
*/
|
|
54
|
+
@Entity('ml_models')
|
|
55
|
+
@Index('ix_ml_model_0', ['domain', 'name', 'version'], { unique: true })
|
|
56
|
+
@Index('ix_ml_model_1', ['domain', 'stage'])
|
|
57
|
+
@ObjectType({ description: 'ML Model registered in the system' })
|
|
58
|
+
export class MLModel {
|
|
59
|
+
@PrimaryGeneratedColumn('uuid')
|
|
60
|
+
@Field(type => ID, { description: 'Model ID' })
|
|
61
|
+
id: string
|
|
62
|
+
|
|
63
|
+
@Column({ nullable: true, comment: 'Model name' })
|
|
64
|
+
@Field({ description: 'Model name' })
|
|
65
|
+
name: string
|
|
66
|
+
|
|
67
|
+
@Column({ nullable: true, comment: 'Model version' })
|
|
68
|
+
@Field({ description: 'Model version' })
|
|
69
|
+
version: string
|
|
70
|
+
|
|
71
|
+
@Column({ nullable: true, comment: 'Model description' })
|
|
72
|
+
@Field({ nullable: true, description: 'Model description' })
|
|
73
|
+
description?: string
|
|
74
|
+
|
|
75
|
+
@Column({ type: 'varchar', default: ModelStage.NONE, comment: 'Deployment stage' })
|
|
76
|
+
@Field(type => ModelStage, { description: 'Current deployment stage' })
|
|
77
|
+
stage: ModelStage
|
|
78
|
+
|
|
79
|
+
@Column({ type: 'varchar', nullable: true, comment: 'ML framework' })
|
|
80
|
+
@Field(type => ModelFramework, { nullable: true, description: 'Framework used for training' })
|
|
81
|
+
framework?: ModelFramework
|
|
82
|
+
|
|
83
|
+
@Column({ type: 'simple-json', nullable: true, comment: 'Model metrics (accuracy, loss, etc.)' })
|
|
84
|
+
@Field(type => String, { nullable: true, description: 'Model metrics as JSON' })
|
|
85
|
+
metrics?: string
|
|
86
|
+
|
|
87
|
+
@Column({ type: 'simple-json', nullable: true, comment: 'Model metadata' })
|
|
88
|
+
@Field(type => String, { nullable: true, description: 'Model metadata as JSON' })
|
|
89
|
+
metadata?: string
|
|
90
|
+
|
|
91
|
+
@Column({ nullable: true, comment: 'Model artifact URI (S3, local path, etc.)' })
|
|
92
|
+
@Field({ nullable: true, description: 'Model artifact storage URI' })
|
|
93
|
+
artifactUri?: string
|
|
94
|
+
|
|
95
|
+
@Column({ nullable: true, comment: 'MLflow run ID' })
|
|
96
|
+
@Field({ nullable: true, description: 'MLflow run ID for tracking' })
|
|
97
|
+
mlflowRunId?: string
|
|
98
|
+
|
|
99
|
+
@Column({ nullable: true, comment: 'MLflow experiment ID' })
|
|
100
|
+
@Field({ nullable: true, description: 'MLflow experiment ID' })
|
|
101
|
+
mlflowExperimentId?: string
|
|
102
|
+
|
|
103
|
+
@Column({ type: 'int', nullable: true, comment: 'Label Studio project ID' })
|
|
104
|
+
@Field(type => Int, { nullable: true, description: 'Associated Label Studio project' })
|
|
105
|
+
labelStudioProjectId?: number
|
|
106
|
+
|
|
107
|
+
@Column({ type: 'simple-json', nullable: true, comment: 'Model tags' })
|
|
108
|
+
@Field(type => String, { nullable: true, description: 'Tags as JSON array' })
|
|
109
|
+
tags?: string
|
|
110
|
+
|
|
111
|
+
@ManyToOne(() => Domain)
|
|
112
|
+
@Field({ nullable: true, description: 'Domain' })
|
|
113
|
+
domain?: Domain
|
|
114
|
+
|
|
115
|
+
@RelationId((model: MLModel) => model.domain)
|
|
116
|
+
domainId?: string
|
|
117
|
+
|
|
118
|
+
@ManyToOne(() => User, { nullable: true })
|
|
119
|
+
@Field(type => User, { nullable: true, description: 'Creator' })
|
|
120
|
+
creator?: User
|
|
121
|
+
|
|
122
|
+
@RelationId((model: MLModel) => model.creator)
|
|
123
|
+
creatorId?: string
|
|
124
|
+
|
|
125
|
+
@ManyToOne(() => User, { nullable: true })
|
|
126
|
+
@Field(type => User, { nullable: true, description: 'Last updater' })
|
|
127
|
+
updater?: User
|
|
128
|
+
|
|
129
|
+
@RelationId((model: MLModel) => model.updater)
|
|
130
|
+
updaterId?: string
|
|
131
|
+
|
|
132
|
+
@CreateDateColumn()
|
|
133
|
+
@Field({ description: 'Created at' })
|
|
134
|
+
createdAt: Date
|
|
135
|
+
|
|
136
|
+
@UpdateDateColumn()
|
|
137
|
+
@Field({ description: 'Updated at' })
|
|
138
|
+
updatedAt: Date
|
|
139
|
+
|
|
140
|
+
@DeleteDateColumn()
|
|
141
|
+
@Field({ nullable: true, description: 'Deleted at' })
|
|
142
|
+
deletedAt?: Date
|
|
143
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CreateDateColumn,
|
|
3
|
+
UpdateDateColumn,
|
|
4
|
+
DeleteDateColumn,
|
|
5
|
+
Entity,
|
|
6
|
+
Index,
|
|
7
|
+
Column,
|
|
8
|
+
RelationId,
|
|
9
|
+
ManyToOne,
|
|
10
|
+
PrimaryGeneratedColumn
|
|
11
|
+
} from 'typeorm'
|
|
12
|
+
import { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'
|
|
13
|
+
import { Domain } from '@things-factory/shell'
|
|
14
|
+
import { User } from '@things-factory/auth-base'
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Pipeline Status
|
|
18
|
+
*/
|
|
19
|
+
export enum PipelineStatus {
|
|
20
|
+
DRAFT = 'DRAFT',
|
|
21
|
+
ACTIVE = 'ACTIVE',
|
|
22
|
+
PAUSED = 'PAUSED',
|
|
23
|
+
ARCHIVED = 'ARCHIVED'
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
registerEnumType(PipelineStatus, {
|
|
27
|
+
name: 'PipelineStatus',
|
|
28
|
+
description: 'ML pipeline status'
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Pipeline Trigger Type
|
|
33
|
+
*/
|
|
34
|
+
export enum PipelineTriggerType {
|
|
35
|
+
MANUAL = 'MANUAL',
|
|
36
|
+
SCHEDULE = 'SCHEDULE',
|
|
37
|
+
WEBHOOK = 'WEBHOOK',
|
|
38
|
+
EVENT = 'EVENT'
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
registerEnumType(PipelineTriggerType, {
|
|
42
|
+
name: 'PipelineTriggerType',
|
|
43
|
+
description: 'How pipeline is triggered'
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* ML Pipeline Entity
|
|
48
|
+
*
|
|
49
|
+
* Represents an end-to-end ML pipeline for auto-training
|
|
50
|
+
*/
|
|
51
|
+
@Entity('ml_pipelines')
|
|
52
|
+
@Index('ix_ml_pipeline_0', ['domain', 'name'])
|
|
53
|
+
@Index('ix_ml_pipeline_1', ['domain', 'status'])
|
|
54
|
+
@ObjectType({ description: 'ML Pipeline for automated training workflow' })
|
|
55
|
+
export class MLPipeline {
|
|
56
|
+
@PrimaryGeneratedColumn('uuid')
|
|
57
|
+
@Field(type => ID, { description: 'Pipeline ID' })
|
|
58
|
+
id: string
|
|
59
|
+
|
|
60
|
+
@Column({ nullable: true, comment: 'Pipeline name' })
|
|
61
|
+
@Field({ description: 'Pipeline name' })
|
|
62
|
+
name: string
|
|
63
|
+
|
|
64
|
+
@Column({ nullable: true, comment: 'Pipeline description' })
|
|
65
|
+
@Field({ nullable: true, description: 'Pipeline description' })
|
|
66
|
+
description?: string
|
|
67
|
+
|
|
68
|
+
@Column({ type: 'varchar', default: PipelineStatus.DRAFT, comment: 'Pipeline status' })
|
|
69
|
+
@Field(type => PipelineStatus, { description: 'Current pipeline status' })
|
|
70
|
+
status: PipelineStatus
|
|
71
|
+
|
|
72
|
+
@Column({ type: 'varchar', default: PipelineTriggerType.MANUAL, comment: 'Trigger type' })
|
|
73
|
+
@Field(type => PipelineTriggerType, { description: 'How pipeline is triggered' })
|
|
74
|
+
triggerType: PipelineTriggerType
|
|
75
|
+
|
|
76
|
+
@Column({ nullable: true, comment: 'Cron schedule (if SCHEDULE trigger)' })
|
|
77
|
+
@Field({ nullable: true, description: 'Cron expression for scheduling' })
|
|
78
|
+
schedule?: string
|
|
79
|
+
|
|
80
|
+
@Column({ type: 'int', nullable: true, comment: 'Label Studio project ID' })
|
|
81
|
+
@Field(type => Int, { nullable: true, description: 'Source Label Studio project' })
|
|
82
|
+
labelStudioProjectId?: number
|
|
83
|
+
|
|
84
|
+
@Column({ type: 'int', nullable: true, comment: 'Minimum new annotations to trigger' })
|
|
85
|
+
@Field(type => Int, { nullable: true, description: 'Min annotations threshold' })
|
|
86
|
+
annotationThreshold?: number
|
|
87
|
+
|
|
88
|
+
@Column({ type: 'simple-json', nullable: true, comment: 'Pipeline configuration' })
|
|
89
|
+
@Field(type => String, { nullable: true, description: 'Pipeline config as JSON' })
|
|
90
|
+
config?: string
|
|
91
|
+
|
|
92
|
+
@Column({ type: 'simple-json', nullable: true, comment: 'Training parameters' })
|
|
93
|
+
@Field(type => String, { nullable: true, description: 'Training params as JSON' })
|
|
94
|
+
trainingParams?: string
|
|
95
|
+
|
|
96
|
+
@Column({ type: 'float', nullable: true, comment: 'Auto-promotion accuracy threshold' })
|
|
97
|
+
@Field({ nullable: true, description: 'Auto-promote if accuracy exceeds this' })
|
|
98
|
+
promotionThreshold?: number
|
|
99
|
+
|
|
100
|
+
@Column({ type: 'simple-json', nullable: true, comment: 'Notification settings' })
|
|
101
|
+
@Field(type => String, { nullable: true, description: 'Notification config as JSON' })
|
|
102
|
+
notifications?: string
|
|
103
|
+
|
|
104
|
+
@Column({ type: 'timestamp', nullable: true, comment: 'Last execution time' })
|
|
105
|
+
@Field({ nullable: true, description: 'Last executed at' })
|
|
106
|
+
lastExecutedAt?: Date
|
|
107
|
+
|
|
108
|
+
@Column({ type: 'int', default: 0, comment: 'Total execution count' })
|
|
109
|
+
@Field(type => Int, { description: 'Total times executed' })
|
|
110
|
+
executionCount: number
|
|
111
|
+
|
|
112
|
+
@ManyToOne(() => Domain)
|
|
113
|
+
@Field({ nullable: true, description: 'Domain' })
|
|
114
|
+
domain?: Domain
|
|
115
|
+
|
|
116
|
+
@RelationId((pipeline: MLPipeline) => pipeline.domain)
|
|
117
|
+
domainId?: string
|
|
118
|
+
|
|
119
|
+
@ManyToOne(() => User, { nullable: true })
|
|
120
|
+
@Field(type => User, { nullable: true, description: 'Creator' })
|
|
121
|
+
creator?: User
|
|
122
|
+
|
|
123
|
+
@RelationId((pipeline: MLPipeline) => pipeline.creator)
|
|
124
|
+
creatorId?: string
|
|
125
|
+
|
|
126
|
+
@ManyToOne(() => User, { nullable: true })
|
|
127
|
+
@Field(type => User, { nullable: true, description: 'Last updater' })
|
|
128
|
+
updater?: User
|
|
129
|
+
|
|
130
|
+
@RelationId((pipeline: MLPipeline) => pipeline.updater)
|
|
131
|
+
updaterId?: string
|
|
132
|
+
|
|
133
|
+
@CreateDateColumn()
|
|
134
|
+
@Field({ description: 'Created at' })
|
|
135
|
+
createdAt: Date
|
|
136
|
+
|
|
137
|
+
@UpdateDateColumn()
|
|
138
|
+
@Field({ description: 'Updated at' })
|
|
139
|
+
updatedAt: Date
|
|
140
|
+
|
|
141
|
+
@DeleteDateColumn()
|
|
142
|
+
@Field({ nullable: true, description: 'Deleted at' })
|
|
143
|
+
deletedAt?: Date
|
|
144
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CreateDateColumn,
|
|
3
|
+
UpdateDateColumn,
|
|
4
|
+
Entity,
|
|
5
|
+
Index,
|
|
6
|
+
Column,
|
|
7
|
+
RelationId,
|
|
8
|
+
ManyToOne,
|
|
9
|
+
PrimaryGeneratedColumn
|
|
10
|
+
} from 'typeorm'
|
|
11
|
+
import { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'
|
|
12
|
+
import { Domain } from '@things-factory/shell'
|
|
13
|
+
import { User } from '@things-factory/auth-base'
|
|
14
|
+
import { MLPipeline } from '../ml-pipeline/ml-pipeline'
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Pipeline Run Status
|
|
18
|
+
*/
|
|
19
|
+
export enum PipelineRunStatus {
|
|
20
|
+
PENDING = 'PENDING',
|
|
21
|
+
RUNNING = 'RUNNING',
|
|
22
|
+
SUCCEEDED = 'SUCCEEDED',
|
|
23
|
+
FAILED = 'FAILED',
|
|
24
|
+
CANCELLED = 'CANCELLED'
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
registerEnumType(PipelineRunStatus, {
|
|
28
|
+
name: 'PipelineRunStatus',
|
|
29
|
+
description: 'Status of pipeline execution'
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* ML Pipeline Run Entity
|
|
34
|
+
*
|
|
35
|
+
* Tracks individual pipeline executions
|
|
36
|
+
*/
|
|
37
|
+
@Entity('ml_pipeline_runs')
|
|
38
|
+
@Index('ix_ml_pipeline_run_0', ['domain', 'pipeline'])
|
|
39
|
+
@Index('ix_ml_pipeline_run_1', ['status', 'startedAt'])
|
|
40
|
+
@ObjectType({ description: 'Individual ML pipeline execution record' })
|
|
41
|
+
export class MLPipelineRun {
|
|
42
|
+
@PrimaryGeneratedColumn('uuid')
|
|
43
|
+
@Field(type => ID, { description: 'Run ID' })
|
|
44
|
+
id: string
|
|
45
|
+
|
|
46
|
+
@ManyToOne(() => MLPipeline)
|
|
47
|
+
@Field(type => MLPipeline, { description: 'Parent pipeline' })
|
|
48
|
+
pipeline: MLPipeline
|
|
49
|
+
|
|
50
|
+
@RelationId((run: MLPipelineRun) => run.pipeline)
|
|
51
|
+
pipelineId: string
|
|
52
|
+
|
|
53
|
+
@Column({ type: 'varchar', default: PipelineRunStatus.PENDING, comment: 'Run status' })
|
|
54
|
+
@Field(type => PipelineRunStatus, { description: 'Current run status' })
|
|
55
|
+
status: PipelineRunStatus
|
|
56
|
+
|
|
57
|
+
@Column({ type: 'timestamp', nullable: true, comment: 'Start time' })
|
|
58
|
+
@Field({ nullable: true, description: 'Started at' })
|
|
59
|
+
startedAt?: Date
|
|
60
|
+
|
|
61
|
+
@Column({ type: 'timestamp', nullable: true, comment: 'End time' })
|
|
62
|
+
@Field({ nullable: true, description: 'Completed at' })
|
|
63
|
+
completedAt?: Date
|
|
64
|
+
|
|
65
|
+
@Column({ type: 'int', nullable: true, comment: 'Duration in seconds' })
|
|
66
|
+
@Field(type => Int, { nullable: true, description: 'Duration in seconds' })
|
|
67
|
+
duration?: number
|
|
68
|
+
|
|
69
|
+
@Column({ type: 'text', nullable: true, comment: 'Error message if failed' })
|
|
70
|
+
@Field({ nullable: true, description: 'Error message' })
|
|
71
|
+
errorMessage?: string
|
|
72
|
+
|
|
73
|
+
@Column({ type: 'simple-json', nullable: true, comment: 'Run parameters' })
|
|
74
|
+
@Field(type => String, { nullable: true, description: 'Parameters used as JSON' })
|
|
75
|
+
params?: string
|
|
76
|
+
|
|
77
|
+
@Column({ type: 'simple-json', nullable: true, comment: 'Run results and metrics' })
|
|
78
|
+
@Field(type => String, { nullable: true, description: 'Results as JSON' })
|
|
79
|
+
results?: string
|
|
80
|
+
|
|
81
|
+
@Column({ type: 'int', nullable: true, comment: 'Training data count' })
|
|
82
|
+
@Field(type => Int, { nullable: true, description: 'Number of training samples' })
|
|
83
|
+
trainingDataCount?: number
|
|
84
|
+
|
|
85
|
+
@Column({ nullable: true, comment: 'Generated model ID' })
|
|
86
|
+
@Field({ nullable: true, description: 'Model ID created by this run' })
|
|
87
|
+
modelId?: string
|
|
88
|
+
|
|
89
|
+
@Column({ nullable: true, comment: 'MLflow run ID' })
|
|
90
|
+
@Field({ nullable: true, description: 'MLflow run ID' })
|
|
91
|
+
mlflowRunId?: string
|
|
92
|
+
|
|
93
|
+
@Column({ type: 'simple-json', nullable: true, comment: 'Logs or execution trace' })
|
|
94
|
+
@Field(type => String, { nullable: true, description: 'Execution logs as JSON' })
|
|
95
|
+
logs?: string
|
|
96
|
+
|
|
97
|
+
@ManyToOne(() => Domain)
|
|
98
|
+
@Field({ nullable: true, description: 'Domain' })
|
|
99
|
+
domain?: Domain
|
|
100
|
+
|
|
101
|
+
@RelationId((run: MLPipelineRun) => run.domain)
|
|
102
|
+
domainId?: string
|
|
103
|
+
|
|
104
|
+
@ManyToOne(() => User, { nullable: true })
|
|
105
|
+
@Field(type => User, { nullable: true, description: 'Triggered by' })
|
|
106
|
+
triggeredBy?: User
|
|
107
|
+
|
|
108
|
+
@RelationId((run: MLPipelineRun) => run.triggeredBy)
|
|
109
|
+
triggeredById?: string
|
|
110
|
+
|
|
111
|
+
@CreateDateColumn()
|
|
112
|
+
@Field({ description: 'Created at' })
|
|
113
|
+
createdAt: Date
|
|
114
|
+
|
|
115
|
+
@UpdateDateColumn()
|
|
116
|
+
@Field({ description: 'Updated at' })
|
|
117
|
+
updatedAt: Date
|
|
118
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import route from './dist-client/route'
|
|
2
|
+
import bootstrap from './dist-client/bootstrap'
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
route,
|
|
6
|
+
routes: [
|
|
7
|
+
{ tagname: 'mlops-dashboard-page', page: 'mlops-dashboard' },
|
|
8
|
+
{ tagname: 'ml-model-list-page', page: 'ml-model-list' },
|
|
9
|
+
{ tagname: 'ml-pipeline-list-page', page: 'ml-pipeline-list' },
|
|
10
|
+
{ tagname: 'ml-deployment-list-page', page: 'ml-deployment-list' }
|
|
11
|
+
],
|
|
12
|
+
bootstrap
|
|
13
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"menu": {
|
|
3
|
+
"mlops": "MLOps",
|
|
4
|
+
"ml-models": "ML Models",
|
|
5
|
+
"ml-pipelines": "Pipelines",
|
|
6
|
+
"ml-deployments": "Deployments",
|
|
7
|
+
"mlops-dashboard": "Dashboard"
|
|
8
|
+
},
|
|
9
|
+
"label": {
|
|
10
|
+
"model-name": "Model Name",
|
|
11
|
+
"model-version": "Version",
|
|
12
|
+
"model-stage": "Stage",
|
|
13
|
+
"model-framework": "Framework",
|
|
14
|
+
"model-metrics": "Metrics",
|
|
15
|
+
"pipeline-name": "Pipeline Name",
|
|
16
|
+
"pipeline-status": "Status",
|
|
17
|
+
"pipeline-trigger": "Trigger",
|
|
18
|
+
"deployment-environment": "Environment",
|
|
19
|
+
"deployment-status": "Status",
|
|
20
|
+
"deployment-endpoint": "Endpoint"
|
|
21
|
+
},
|
|
22
|
+
"button": {
|
|
23
|
+
"register-model": "Register Model",
|
|
24
|
+
"promote-model": "Promote",
|
|
25
|
+
"archive-model": "Archive",
|
|
26
|
+
"create-pipeline": "Create Pipeline",
|
|
27
|
+
"run-pipeline": "Run",
|
|
28
|
+
"deploy-model": "Deploy"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"menu": {
|
|
3
|
+
"mlops": "MLOps",
|
|
4
|
+
"ml-models": "ML 모델",
|
|
5
|
+
"ml-pipelines": "파이프라인",
|
|
6
|
+
"ml-deployments": "배포",
|
|
7
|
+
"mlops-dashboard": "대시보드"
|
|
8
|
+
},
|
|
9
|
+
"label": {
|
|
10
|
+
"model-name": "모델 이름",
|
|
11
|
+
"model-version": "버전",
|
|
12
|
+
"model-stage": "단계",
|
|
13
|
+
"model-framework": "프레임워크",
|
|
14
|
+
"model-metrics": "메트릭",
|
|
15
|
+
"pipeline-name": "파이프라인 이름",
|
|
16
|
+
"pipeline-status": "상태",
|
|
17
|
+
"pipeline-trigger": "트리거",
|
|
18
|
+
"deployment-environment": "환경",
|
|
19
|
+
"deployment-status": "상태",
|
|
20
|
+
"deployment-endpoint": "엔드포인트"
|
|
21
|
+
},
|
|
22
|
+
"button": {
|
|
23
|
+
"register-model": "모델 등록",
|
|
24
|
+
"promote-model": "프로모션",
|
|
25
|
+
"archive-model": "아카이브",
|
|
26
|
+
"create-pipeline": "파이프라인 생성",
|
|
27
|
+
"run-pipeline": "실행",
|
|
28
|
+
"deploy-model": "배포"
|
|
29
|
+
}
|
|
30
|
+
}
|