@things-factory/integration-mlflow 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/client/bootstrap.ts +41 -0
- package/client/index.ts +2 -0
- package/client/pages/mlflow-experiments-page.ts +45 -0
- package/client/pages/mlflow-models-page.ts +45 -0
- package/client/pages/mlflow-runs-page.ts +45 -0
- package/client/pages/mlflow-viewer-page.ts +74 -0
- package/client/route.ts +19 -0
- package/client/tsconfig.json +11 -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/mlflow-experiments-page.d.ts +5 -0
- package/dist-client/pages/mlflow-experiments-page.js +48 -0
- package/dist-client/pages/mlflow-experiments-page.js.map +1 -0
- package/dist-client/pages/mlflow-models-page.d.ts +5 -0
- package/dist-client/pages/mlflow-models-page.js +48 -0
- package/dist-client/pages/mlflow-models-page.js.map +1 -0
- package/dist-client/pages/mlflow-runs-page.d.ts +5 -0
- package/dist-client/pages/mlflow-runs-page.js +48 -0
- package/dist-client/pages/mlflow-runs-page.js.map +1 -0
- package/dist-client/pages/mlflow-viewer-page.d.ts +12 -0
- package/dist-client/pages/mlflow-viewer-page.js +82 -0
- package/dist-client/pages/mlflow-viewer-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 +4 -0
- package/dist-server/index.js +8 -0
- package/dist-server/index.js.map +1 -0
- package/dist-server/route.d.ts +5 -0
- package/dist-server/route.js +12 -0
- package/dist-server/route.js.map +1 -0
- package/dist-server/service/experiment/experiment-service.d.ts +19 -0
- package/dist-server/service/experiment/experiment-service.js +135 -0
- package/dist-server/service/experiment/experiment-service.js.map +1 -0
- package/dist-server/service/index.d.ts +10 -0
- package/dist-server/service/index.js +19 -0
- package/dist-server/service/index.js.map +1 -0
- package/dist-server/service/model-registry/model-registry-service.d.ts +31 -0
- package/dist-server/service/model-registry/model-registry-service.js +255 -0
- package/dist-server/service/model-registry/model-registry-service.js.map +1 -0
- package/dist-server/service/run/run-service.d.ts +27 -0
- package/dist-server/service/run/run-service.js +214 -0
- package/dist-server/service/run/run-service.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -0
- package/dist-server/types/mlflow-types.d.ts +87 -0
- package/dist-server/types/mlflow-types.js +337 -0
- package/dist-server/types/mlflow-types.js.map +1 -0
- package/dist-server/utils/mlflow-api-client.d.ts +277 -0
- package/dist-server/utils/mlflow-api-client.js +201 -0
- package/dist-server/utils/mlflow-api-client.js.map +1 -0
- package/package.json +45 -0
- package/server/index.ts +5 -0
- package/server/route.ts +13 -0
- package/server/service/experiment/experiment-service.ts +117 -0
- package/server/service/index.ts +17 -0
- package/server/service/model-registry/model-registry-service.ts +232 -0
- package/server/service/run/run-service.ts +177 -0
- package/server/tsconfig.json +11 -0
- package/server/types/mlflow-types.ts +235 -0
- package/server/utils/mlflow-api-client.ts +375 -0
- package/things-factory.config.js +13 -0
- package/translations/en.json +28 -0
- package/translations/ko.json +28 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ModelRegistryService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const type_graphql_1 = require("type-graphql");
|
|
6
|
+
const mlflow_api_client_1 = require("../../utils/mlflow-api-client");
|
|
7
|
+
const mlflow_types_1 = require("../../types/mlflow-types");
|
|
8
|
+
let ModelRegistryService = class ModelRegistryService {
|
|
9
|
+
/**
|
|
10
|
+
* Get all registered models
|
|
11
|
+
*/
|
|
12
|
+
async mlflowRegisteredModels(context) {
|
|
13
|
+
try {
|
|
14
|
+
const response = await mlflow_api_client_1.mlflowApi.searchRegisteredModels();
|
|
15
|
+
return response.registered_models.map(model => ({
|
|
16
|
+
name: model.name,
|
|
17
|
+
creationTimestamp: model.creation_timestamp,
|
|
18
|
+
lastUpdatedTimestamp: model.last_updated_timestamp,
|
|
19
|
+
description: model.description,
|
|
20
|
+
tags: undefined,
|
|
21
|
+
latestVersions: model.latest_versions ? JSON.stringify(model.latest_versions) : undefined
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
console.error('Failed to fetch registered models:', error);
|
|
26
|
+
throw new Error(`Failed to fetch registered models: ${error.message}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get registered model by name
|
|
31
|
+
*/
|
|
32
|
+
async mlflowRegisteredModel(name, context) {
|
|
33
|
+
try {
|
|
34
|
+
const response = await mlflow_api_client_1.mlflowApi.getRegisteredModel(name);
|
|
35
|
+
return {
|
|
36
|
+
name: response.registered_model.name,
|
|
37
|
+
creationTimestamp: response.registered_model.creation_timestamp,
|
|
38
|
+
lastUpdatedTimestamp: response.registered_model.last_updated_timestamp,
|
|
39
|
+
description: response.registered_model.description,
|
|
40
|
+
tags: response.registered_model.tags ? JSON.stringify(response.registered_model.tags) : undefined,
|
|
41
|
+
latestVersions: response.registered_model.latest_versions ? JSON.stringify(response.registered_model.latest_versions) : undefined
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.error(`Failed to fetch model ${name}:`, error);
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create registered model
|
|
51
|
+
*/
|
|
52
|
+
async createMLflowRegisteredModel(input, context) {
|
|
53
|
+
try {
|
|
54
|
+
const tags = input.tags ? JSON.parse(input.tags) : undefined;
|
|
55
|
+
const response = await mlflow_api_client_1.mlflowApi.createRegisteredModel({
|
|
56
|
+
name: input.name,
|
|
57
|
+
description: input.description,
|
|
58
|
+
tags
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
name: response.registered_model.name,
|
|
62
|
+
creationTimestamp: response.registered_model.creation_timestamp,
|
|
63
|
+
lastUpdatedTimestamp: response.registered_model.last_updated_timestamp,
|
|
64
|
+
description: input.description,
|
|
65
|
+
tags: input.tags,
|
|
66
|
+
latestVersions: undefined
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.error('Failed to create registered model:', error);
|
|
71
|
+
throw new Error(`Failed to create registered model: ${error.message}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get model version
|
|
76
|
+
*/
|
|
77
|
+
async mlflowModelVersion(name, version, context) {
|
|
78
|
+
try {
|
|
79
|
+
const response = await mlflow_api_client_1.mlflowApi.getModelVersion({ name, version });
|
|
80
|
+
return {
|
|
81
|
+
name: response.model_version.name,
|
|
82
|
+
version: response.model_version.version,
|
|
83
|
+
creationTimestamp: response.model_version.creation_timestamp,
|
|
84
|
+
currentStage: response.model_version.current_stage,
|
|
85
|
+
source: response.model_version.source,
|
|
86
|
+
status: response.model_version.status,
|
|
87
|
+
runId: response.model_version.run_id,
|
|
88
|
+
description: undefined
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
console.error(`Failed to fetch model version ${name}/${version}:`, error);
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Create model version
|
|
98
|
+
*/
|
|
99
|
+
async createMLflowModelVersion(input, context) {
|
|
100
|
+
try {
|
|
101
|
+
const tags = input.tags ? JSON.parse(input.tags) : undefined;
|
|
102
|
+
const response = await mlflow_api_client_1.mlflowApi.createModelVersion({
|
|
103
|
+
name: input.name,
|
|
104
|
+
source: input.source,
|
|
105
|
+
run_id: input.runId,
|
|
106
|
+
description: input.description,
|
|
107
|
+
tags
|
|
108
|
+
});
|
|
109
|
+
return {
|
|
110
|
+
name: response.model_version.name,
|
|
111
|
+
version: response.model_version.version,
|
|
112
|
+
creationTimestamp: response.model_version.creation_timestamp,
|
|
113
|
+
currentStage: response.model_version.status,
|
|
114
|
+
source: response.model_version.source,
|
|
115
|
+
status: response.model_version.status,
|
|
116
|
+
runId: input.runId,
|
|
117
|
+
description: input.description
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error('Failed to create model version:', error);
|
|
122
|
+
throw new Error(`Failed to create model version: ${error.message}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Transition model version stage
|
|
127
|
+
*/
|
|
128
|
+
async transitionMLflowModelStage(input, context) {
|
|
129
|
+
try {
|
|
130
|
+
const response = await mlflow_api_client_1.mlflowApi.transitionModelVersionStage({
|
|
131
|
+
name: input.name,
|
|
132
|
+
version: input.version,
|
|
133
|
+
stage: input.stage,
|
|
134
|
+
archive_existing_versions: input.archiveExistingVersions
|
|
135
|
+
});
|
|
136
|
+
// Fetch updated version
|
|
137
|
+
const version = await mlflow_api_client_1.mlflowApi.getModelVersion({
|
|
138
|
+
name: input.name,
|
|
139
|
+
version: input.version
|
|
140
|
+
});
|
|
141
|
+
return {
|
|
142
|
+
name: version.model_version.name,
|
|
143
|
+
version: version.model_version.version,
|
|
144
|
+
creationTimestamp: version.model_version.creation_timestamp,
|
|
145
|
+
currentStage: version.model_version.current_stage,
|
|
146
|
+
source: version.model_version.source,
|
|
147
|
+
status: version.model_version.status,
|
|
148
|
+
runId: version.model_version.run_id,
|
|
149
|
+
description: undefined
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
console.error('Failed to transition model stage:', error);
|
|
154
|
+
throw new Error(`Failed to transition model stage: ${error.message}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Delete model version
|
|
159
|
+
*/
|
|
160
|
+
async deleteMLflowModelVersion(name, version, context) {
|
|
161
|
+
try {
|
|
162
|
+
await mlflow_api_client_1.mlflowApi.deleteModelVersion({ name, version });
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
console.error(`Failed to delete model version ${name}/${version}:`, error);
|
|
167
|
+
throw new Error(`Failed to delete model version: ${error.message}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
exports.ModelRegistryService = ModelRegistryService;
|
|
172
|
+
tslib_1.__decorate([
|
|
173
|
+
(0, type_graphql_1.Query)(returns => [mlflow_types_1.MLflowRegisteredModel], {
|
|
174
|
+
description: 'Get all registered models in MLflow'
|
|
175
|
+
}),
|
|
176
|
+
(0, type_graphql_1.Directive)('@privilege(category: "mlflow", privilege: "query")'),
|
|
177
|
+
tslib_1.__param(0, (0, type_graphql_1.Ctx)()),
|
|
178
|
+
tslib_1.__metadata("design:type", Function),
|
|
179
|
+
tslib_1.__metadata("design:paramtypes", [Object]),
|
|
180
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
181
|
+
], ModelRegistryService.prototype, "mlflowRegisteredModels", null);
|
|
182
|
+
tslib_1.__decorate([
|
|
183
|
+
(0, type_graphql_1.Query)(returns => mlflow_types_1.MLflowRegisteredModel, {
|
|
184
|
+
description: 'Get registered model by name',
|
|
185
|
+
nullable: true
|
|
186
|
+
}),
|
|
187
|
+
(0, type_graphql_1.Directive)('@privilege(category: "mlflow", privilege: "query")'),
|
|
188
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('name')),
|
|
189
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
190
|
+
tslib_1.__metadata("design:type", Function),
|
|
191
|
+
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
192
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
193
|
+
], ModelRegistryService.prototype, "mlflowRegisteredModel", null);
|
|
194
|
+
tslib_1.__decorate([
|
|
195
|
+
(0, type_graphql_1.Mutation)(returns => mlflow_types_1.MLflowRegisteredModel, {
|
|
196
|
+
description: 'Create new registered model'
|
|
197
|
+
}),
|
|
198
|
+
(0, type_graphql_1.Directive)('@privilege(category: "mlflow", privilege: "mutation")'),
|
|
199
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('input')),
|
|
200
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
201
|
+
tslib_1.__metadata("design:type", Function),
|
|
202
|
+
tslib_1.__metadata("design:paramtypes", [mlflow_types_1.CreateRegisteredModelInput, Object]),
|
|
203
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
204
|
+
], ModelRegistryService.prototype, "createMLflowRegisteredModel", null);
|
|
205
|
+
tslib_1.__decorate([
|
|
206
|
+
(0, type_graphql_1.Query)(returns => mlflow_types_1.MLflowModelVersion, {
|
|
207
|
+
description: 'Get model version',
|
|
208
|
+
nullable: true
|
|
209
|
+
}),
|
|
210
|
+
(0, type_graphql_1.Directive)('@privilege(category: "mlflow", privilege: "query")'),
|
|
211
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('name')),
|
|
212
|
+
tslib_1.__param(1, (0, type_graphql_1.Arg)('version')),
|
|
213
|
+
tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
|
|
214
|
+
tslib_1.__metadata("design:type", Function),
|
|
215
|
+
tslib_1.__metadata("design:paramtypes", [String, String, Object]),
|
|
216
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
217
|
+
], ModelRegistryService.prototype, "mlflowModelVersion", null);
|
|
218
|
+
tslib_1.__decorate([
|
|
219
|
+
(0, type_graphql_1.Mutation)(returns => mlflow_types_1.MLflowModelVersion, {
|
|
220
|
+
description: 'Create new model version'
|
|
221
|
+
}),
|
|
222
|
+
(0, type_graphql_1.Directive)('@privilege(category: "mlflow", privilege: "mutation")'),
|
|
223
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('input')),
|
|
224
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
225
|
+
tslib_1.__metadata("design:type", Function),
|
|
226
|
+
tslib_1.__metadata("design:paramtypes", [mlflow_types_1.CreateModelVersionInput, Object]),
|
|
227
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
228
|
+
], ModelRegistryService.prototype, "createMLflowModelVersion", null);
|
|
229
|
+
tslib_1.__decorate([
|
|
230
|
+
(0, type_graphql_1.Mutation)(returns => mlflow_types_1.MLflowModelVersion, {
|
|
231
|
+
description: 'Transition model version to target stage (None, Staging, Production, Archived)'
|
|
232
|
+
}),
|
|
233
|
+
(0, type_graphql_1.Directive)('@privilege(category: "mlflow", privilege: "mutation")'),
|
|
234
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('input')),
|
|
235
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
236
|
+
tslib_1.__metadata("design:type", Function),
|
|
237
|
+
tslib_1.__metadata("design:paramtypes", [mlflow_types_1.TransitionStageInput, Object]),
|
|
238
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
239
|
+
], ModelRegistryService.prototype, "transitionMLflowModelStage", null);
|
|
240
|
+
tslib_1.__decorate([
|
|
241
|
+
(0, type_graphql_1.Mutation)(returns => Boolean, {
|
|
242
|
+
description: 'Delete model version'
|
|
243
|
+
}),
|
|
244
|
+
(0, type_graphql_1.Directive)('@privilege(category: "mlflow", privilege: "mutation")'),
|
|
245
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('name')),
|
|
246
|
+
tslib_1.__param(1, (0, type_graphql_1.Arg)('version')),
|
|
247
|
+
tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
|
|
248
|
+
tslib_1.__metadata("design:type", Function),
|
|
249
|
+
tslib_1.__metadata("design:paramtypes", [String, String, Object]),
|
|
250
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
251
|
+
], ModelRegistryService.prototype, "deleteMLflowModelVersion", null);
|
|
252
|
+
exports.ModelRegistryService = ModelRegistryService = tslib_1.__decorate([
|
|
253
|
+
(0, type_graphql_1.Resolver)()
|
|
254
|
+
], ModelRegistryService);
|
|
255
|
+
//# sourceMappingURL=model-registry-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-registry-service.js","sourceRoot":"","sources":["../../../server/service/model-registry/model-registry-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { mlflowApi } from '../../utils/mlflow-api-client'\nimport {\n MLflowRegisteredModel,\n MLflowModelVersion,\n CreateRegisteredModelInput,\n CreateModelVersionInput,\n TransitionStageInput\n} from '../../types/mlflow-types'\n\n@Resolver()\nexport class ModelRegistryService {\n /**\n * Get all registered models\n */\n @Query(returns => [MLflowRegisteredModel], {\n description: 'Get all registered models in MLflow'\n })\n @Directive('@privilege(category: \"mlflow\", privilege: \"query\")')\n async mlflowRegisteredModels(@Ctx() context: ResolverContext): Promise<MLflowRegisteredModel[]> {\n try {\n const response = await mlflowApi.searchRegisteredModels()\n\n return response.registered_models.map(model => ({\n name: model.name,\n creationTimestamp: model.creation_timestamp,\n lastUpdatedTimestamp: model.last_updated_timestamp,\n description: model.description,\n tags: undefined,\n latestVersions: model.latest_versions ? JSON.stringify(model.latest_versions) : undefined\n }))\n } catch (error) {\n console.error('Failed to fetch registered models:', error)\n throw new Error(`Failed to fetch registered models: ${error.message}`)\n }\n }\n\n /**\n * Get registered model by name\n */\n @Query(returns => MLflowRegisteredModel, {\n description: 'Get registered model by name',\n nullable: true\n })\n @Directive('@privilege(category: \"mlflow\", privilege: \"query\")')\n async mlflowRegisteredModel(\n @Arg('name') name: string,\n @Ctx() context: ResolverContext\n ): Promise<MLflowRegisteredModel | null> {\n try {\n const response = await mlflowApi.getRegisteredModel(name)\n\n return {\n name: response.registered_model.name,\n creationTimestamp: response.registered_model.creation_timestamp,\n lastUpdatedTimestamp: response.registered_model.last_updated_timestamp,\n description: response.registered_model.description,\n tags: response.registered_model.tags ? JSON.stringify(response.registered_model.tags) : undefined,\n latestVersions: response.registered_model.latest_versions ? JSON.stringify(response.registered_model.latest_versions) : undefined\n }\n } catch (error) {\n console.error(`Failed to fetch model ${name}:`, error)\n return null\n }\n }\n\n /**\n * Create registered model\n */\n @Mutation(returns => MLflowRegisteredModel, {\n description: 'Create new registered model'\n })\n @Directive('@privilege(category: \"mlflow\", privilege: \"mutation\")')\n async createMLflowRegisteredModel(\n @Arg('input') input: CreateRegisteredModelInput,\n @Ctx() context: ResolverContext\n ): Promise<MLflowRegisteredModel> {\n try {\n const tags = input.tags ? JSON.parse(input.tags) : undefined\n\n const response = await mlflowApi.createRegisteredModel({\n name: input.name,\n description: input.description,\n tags\n })\n\n return {\n name: response.registered_model.name,\n creationTimestamp: response.registered_model.creation_timestamp,\n lastUpdatedTimestamp: response.registered_model.last_updated_timestamp,\n description: input.description,\n tags: input.tags,\n latestVersions: undefined\n }\n } catch (error) {\n console.error('Failed to create registered model:', error)\n throw new Error(`Failed to create registered model: ${error.message}`)\n }\n }\n\n /**\n * Get model version\n */\n @Query(returns => MLflowModelVersion, {\n description: 'Get model version',\n nullable: true\n })\n @Directive('@privilege(category: \"mlflow\", privilege: \"query\")')\n async mlflowModelVersion(\n @Arg('name') name: string,\n @Arg('version') version: string,\n @Ctx() context: ResolverContext\n ): Promise<MLflowModelVersion | null> {\n try {\n const response = await mlflowApi.getModelVersion({ name, version })\n\n return {\n name: response.model_version.name,\n version: response.model_version.version,\n creationTimestamp: response.model_version.creation_timestamp,\n currentStage: response.model_version.current_stage,\n source: response.model_version.source,\n status: response.model_version.status,\n runId: response.model_version.run_id,\n description: undefined\n }\n } catch (error) {\n console.error(`Failed to fetch model version ${name}/${version}:`, error)\n return null\n }\n }\n\n /**\n * Create model version\n */\n @Mutation(returns => MLflowModelVersion, {\n description: 'Create new model version'\n })\n @Directive('@privilege(category: \"mlflow\", privilege: \"mutation\")')\n async createMLflowModelVersion(\n @Arg('input') input: CreateModelVersionInput,\n @Ctx() context: ResolverContext\n ): Promise<MLflowModelVersion> {\n try {\n const tags = input.tags ? JSON.parse(input.tags) : undefined\n\n const response = await mlflowApi.createModelVersion({\n name: input.name,\n source: input.source,\n run_id: input.runId,\n description: input.description,\n tags\n })\n\n return {\n name: response.model_version.name,\n version: response.model_version.version,\n creationTimestamp: response.model_version.creation_timestamp,\n currentStage: response.model_version.status,\n source: response.model_version.source,\n status: response.model_version.status,\n runId: input.runId,\n description: input.description\n }\n } catch (error) {\n console.error('Failed to create model version:', error)\n throw new Error(`Failed to create model version: ${error.message}`)\n }\n }\n\n /**\n * Transition model version stage\n */\n @Mutation(returns => MLflowModelVersion, {\n description: 'Transition model version to target stage (None, Staging, Production, Archived)'\n })\n @Directive('@privilege(category: \"mlflow\", privilege: \"mutation\")')\n async transitionMLflowModelStage(\n @Arg('input') input: TransitionStageInput,\n @Ctx() context: ResolverContext\n ): Promise<MLflowModelVersion> {\n try {\n const response = await mlflowApi.transitionModelVersionStage({\n name: input.name,\n version: input.version,\n stage: input.stage as any,\n archive_existing_versions: input.archiveExistingVersions\n })\n\n // Fetch updated version\n const version = await mlflowApi.getModelVersion({\n name: input.name,\n version: input.version\n })\n\n return {\n name: version.model_version.name,\n version: version.model_version.version,\n creationTimestamp: version.model_version.creation_timestamp,\n currentStage: version.model_version.current_stage,\n source: version.model_version.source,\n status: version.model_version.status,\n runId: version.model_version.run_id,\n description: undefined\n }\n } catch (error) {\n console.error('Failed to transition model stage:', error)\n throw new Error(`Failed to transition model stage: ${error.message}`)\n }\n }\n\n /**\n * Delete model version\n */\n @Mutation(returns => Boolean, {\n description: 'Delete model version'\n })\n @Directive('@privilege(category: \"mlflow\", privilege: \"mutation\")')\n async deleteMLflowModelVersion(\n @Arg('name') name: string,\n @Arg('version') version: string,\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n try {\n await mlflowApi.deleteModelVersion({ name, version })\n return true\n } catch (error) {\n console.error(`Failed to delete model version ${name}/${version}:`, error)\n throw new Error(`Failed to delete model version: ${error.message}`)\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { MLflowRun, CreateRunInput, LogMetricInput, LogParamInput, UpdateRunInput, SearchRunsInput } from '../../types/mlflow-types';
|
|
2
|
+
export declare class RunService {
|
|
3
|
+
/**
|
|
4
|
+
* Get run by ID
|
|
5
|
+
*/
|
|
6
|
+
mlflowRun(runId: string, context: ResolverContext): Promise<MLflowRun | null>;
|
|
7
|
+
/**
|
|
8
|
+
* Search runs
|
|
9
|
+
*/
|
|
10
|
+
searchMLflowRuns(input: SearchRunsInput, context: ResolverContext): Promise<MLflowRun[]>;
|
|
11
|
+
/**
|
|
12
|
+
* Create new run
|
|
13
|
+
*/
|
|
14
|
+
createMLflowRun(input: CreateRunInput, context: ResolverContext): Promise<MLflowRun>;
|
|
15
|
+
/**
|
|
16
|
+
* Log metric
|
|
17
|
+
*/
|
|
18
|
+
logMLflowMetric(input: LogMetricInput, context: ResolverContext): Promise<boolean>;
|
|
19
|
+
/**
|
|
20
|
+
* Log parameter
|
|
21
|
+
*/
|
|
22
|
+
logMLflowParam(input: LogParamInput, context: ResolverContext): Promise<boolean>;
|
|
23
|
+
/**
|
|
24
|
+
* Update run
|
|
25
|
+
*/
|
|
26
|
+
updateMLflowRun(input: UpdateRunInput, context: ResolverContext): Promise<boolean>;
|
|
27
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RunService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const type_graphql_1 = require("type-graphql");
|
|
6
|
+
const mlflow_api_client_1 = require("../../utils/mlflow-api-client");
|
|
7
|
+
const mlflow_types_1 = require("../../types/mlflow-types");
|
|
8
|
+
let RunService = class RunService {
|
|
9
|
+
/**
|
|
10
|
+
* Get run by ID
|
|
11
|
+
*/
|
|
12
|
+
async mlflowRun(runId, context) {
|
|
13
|
+
try {
|
|
14
|
+
const response = await mlflow_api_client_1.mlflowApi.getRun(runId);
|
|
15
|
+
const run = response.run;
|
|
16
|
+
return {
|
|
17
|
+
runId: run.info.run_id,
|
|
18
|
+
experimentId: run.info.experiment_id,
|
|
19
|
+
status: run.info.status,
|
|
20
|
+
startTime: run.info.start_time,
|
|
21
|
+
endTime: run.info.end_time,
|
|
22
|
+
artifactUri: run.info.artifact_uri,
|
|
23
|
+
metrics: run.data.metrics ? JSON.stringify(run.data.metrics) : undefined,
|
|
24
|
+
params: run.data.params ? JSON.stringify(run.data.params) : undefined,
|
|
25
|
+
tags: run.data.tags ? JSON.stringify(run.data.tags) : undefined
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
console.error(`Failed to fetch run ${runId}:`, error);
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Search runs
|
|
35
|
+
*/
|
|
36
|
+
async searchMLflowRuns(input, context) {
|
|
37
|
+
try {
|
|
38
|
+
const response = await mlflow_api_client_1.mlflowApi.searchRuns({
|
|
39
|
+
experiment_ids: input.experimentIds,
|
|
40
|
+
filter: input.filter,
|
|
41
|
+
max_results: input.maxResults,
|
|
42
|
+
order_by: input.orderBy
|
|
43
|
+
});
|
|
44
|
+
return response.runs.map(run => ({
|
|
45
|
+
runId: run.info.run_id,
|
|
46
|
+
experimentId: run.info.experiment_id,
|
|
47
|
+
status: run.info.status,
|
|
48
|
+
startTime: run.info.start_time,
|
|
49
|
+
endTime: run.info.end_time,
|
|
50
|
+
artifactUri: run.info.artifact_uri,
|
|
51
|
+
metrics: run.data.metrics ? JSON.stringify(run.data.metrics) : undefined,
|
|
52
|
+
params: run.data.params ? JSON.stringify(run.data.params) : undefined,
|
|
53
|
+
tags: run.data.tags ? JSON.stringify(run.data.tags) : undefined
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.error('Failed to search runs:', error);
|
|
58
|
+
throw new Error(`Failed to search runs: ${error.message}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Create new run
|
|
63
|
+
*/
|
|
64
|
+
async createMLflowRun(input, context) {
|
|
65
|
+
try {
|
|
66
|
+
const tags = input.tags ? JSON.parse(input.tags) : undefined;
|
|
67
|
+
const response = await mlflow_api_client_1.mlflowApi.createRun({
|
|
68
|
+
experiment_id: input.experimentId,
|
|
69
|
+
start_time: input.startTime,
|
|
70
|
+
tags
|
|
71
|
+
});
|
|
72
|
+
const run = response.run;
|
|
73
|
+
return {
|
|
74
|
+
runId: run.info.run_id,
|
|
75
|
+
experimentId: run.info.experiment_id,
|
|
76
|
+
status: run.info.status,
|
|
77
|
+
startTime: run.info.start_time,
|
|
78
|
+
artifactUri: run.info.artifact_uri,
|
|
79
|
+
metrics: run.data.metrics ? JSON.stringify(run.data.metrics) : undefined,
|
|
80
|
+
params: run.data.params ? JSON.stringify(run.data.params) : undefined,
|
|
81
|
+
tags: run.data.tags ? JSON.stringify(run.data.tags) : undefined
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error('Failed to create run:', error);
|
|
86
|
+
throw new Error(`Failed to create run: ${error.message}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Log metric
|
|
91
|
+
*/
|
|
92
|
+
async logMLflowMetric(input, context) {
|
|
93
|
+
try {
|
|
94
|
+
await mlflow_api_client_1.mlflowApi.logMetric({
|
|
95
|
+
run_id: input.runId,
|
|
96
|
+
key: input.key,
|
|
97
|
+
value: input.value,
|
|
98
|
+
timestamp: input.timestamp,
|
|
99
|
+
step: input.step
|
|
100
|
+
});
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error('Failed to log metric:', error);
|
|
105
|
+
throw new Error(`Failed to log metric: ${error.message}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Log parameter
|
|
110
|
+
*/
|
|
111
|
+
async logMLflowParam(input, context) {
|
|
112
|
+
try {
|
|
113
|
+
await mlflow_api_client_1.mlflowApi.logParam({
|
|
114
|
+
run_id: input.runId,
|
|
115
|
+
key: input.key,
|
|
116
|
+
value: input.value
|
|
117
|
+
});
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error('Failed to log parameter:', error);
|
|
122
|
+
throw new Error(`Failed to log parameter: ${error.message}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Update run
|
|
127
|
+
*/
|
|
128
|
+
async updateMLflowRun(input, context) {
|
|
129
|
+
try {
|
|
130
|
+
await mlflow_api_client_1.mlflowApi.updateRun({
|
|
131
|
+
run_id: input.runId,
|
|
132
|
+
status: input.status,
|
|
133
|
+
end_time: input.endTime
|
|
134
|
+
});
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
console.error('Failed to update run:', error);
|
|
139
|
+
throw new Error(`Failed to update run: ${error.message}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
exports.RunService = RunService;
|
|
144
|
+
tslib_1.__decorate([
|
|
145
|
+
(0, type_graphql_1.Query)(returns => mlflow_types_1.MLflowRun, {
|
|
146
|
+
description: 'Get MLflow run by ID',
|
|
147
|
+
nullable: true
|
|
148
|
+
}),
|
|
149
|
+
(0, type_graphql_1.Directive)('@privilege(category: "mlflow", privilege: "query")'),
|
|
150
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('runId')),
|
|
151
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
152
|
+
tslib_1.__metadata("design:type", Function),
|
|
153
|
+
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
154
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
155
|
+
], RunService.prototype, "mlflowRun", null);
|
|
156
|
+
tslib_1.__decorate([
|
|
157
|
+
(0, type_graphql_1.Query)(returns => [mlflow_types_1.MLflowRun], {
|
|
158
|
+
description: 'Search MLflow runs'
|
|
159
|
+
}),
|
|
160
|
+
(0, type_graphql_1.Directive)('@privilege(category: "mlflow", privilege: "query")'),
|
|
161
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('input')),
|
|
162
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
163
|
+
tslib_1.__metadata("design:type", Function),
|
|
164
|
+
tslib_1.__metadata("design:paramtypes", [mlflow_types_1.SearchRunsInput, Object]),
|
|
165
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
166
|
+
], RunService.prototype, "searchMLflowRuns", null);
|
|
167
|
+
tslib_1.__decorate([
|
|
168
|
+
(0, type_graphql_1.Mutation)(returns => mlflow_types_1.MLflowRun, {
|
|
169
|
+
description: 'Create new MLflow run'
|
|
170
|
+
}),
|
|
171
|
+
(0, type_graphql_1.Directive)('@privilege(category: "mlflow", privilege: "mutation")'),
|
|
172
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('input')),
|
|
173
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
174
|
+
tslib_1.__metadata("design:type", Function),
|
|
175
|
+
tslib_1.__metadata("design:paramtypes", [mlflow_types_1.CreateRunInput, Object]),
|
|
176
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
177
|
+
], RunService.prototype, "createMLflowRun", null);
|
|
178
|
+
tslib_1.__decorate([
|
|
179
|
+
(0, type_graphql_1.Mutation)(returns => Boolean, {
|
|
180
|
+
description: 'Log metric to MLflow run'
|
|
181
|
+
}),
|
|
182
|
+
(0, type_graphql_1.Directive)('@privilege(category: "mlflow", privilege: "mutation")'),
|
|
183
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('input')),
|
|
184
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
185
|
+
tslib_1.__metadata("design:type", Function),
|
|
186
|
+
tslib_1.__metadata("design:paramtypes", [mlflow_types_1.LogMetricInput, Object]),
|
|
187
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
188
|
+
], RunService.prototype, "logMLflowMetric", null);
|
|
189
|
+
tslib_1.__decorate([
|
|
190
|
+
(0, type_graphql_1.Mutation)(returns => Boolean, {
|
|
191
|
+
description: 'Log parameter to MLflow run'
|
|
192
|
+
}),
|
|
193
|
+
(0, type_graphql_1.Directive)('@privilege(category: "mlflow", privilege: "mutation")'),
|
|
194
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('input')),
|
|
195
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
196
|
+
tslib_1.__metadata("design:type", Function),
|
|
197
|
+
tslib_1.__metadata("design:paramtypes", [mlflow_types_1.LogParamInput, Object]),
|
|
198
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
199
|
+
], RunService.prototype, "logMLflowParam", null);
|
|
200
|
+
tslib_1.__decorate([
|
|
201
|
+
(0, type_graphql_1.Mutation)(returns => Boolean, {
|
|
202
|
+
description: 'Update MLflow run status'
|
|
203
|
+
}),
|
|
204
|
+
(0, type_graphql_1.Directive)('@privilege(category: "mlflow", privilege: "mutation")'),
|
|
205
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('input')),
|
|
206
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
207
|
+
tslib_1.__metadata("design:type", Function),
|
|
208
|
+
tslib_1.__metadata("design:paramtypes", [mlflow_types_1.UpdateRunInput, Object]),
|
|
209
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
210
|
+
], RunService.prototype, "updateMLflowRun", null);
|
|
211
|
+
exports.RunService = RunService = tslib_1.__decorate([
|
|
212
|
+
(0, type_graphql_1.Resolver)()
|
|
213
|
+
], RunService);
|
|
214
|
+
//# sourceMappingURL=run-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-service.js","sourceRoot":"","sources":["../../../server/service/run/run-service.ts"],"names":[],"mappings":";;;;AAAA,+CAA6E;AAE7E,qEAAyD;AACzD,2DAOiC;AAG1B,IAAM,UAAU,GAAhB,MAAM,UAAU;IACrB;;OAEG;IAMG,AAAN,KAAK,CAAC,SAAS,CAAe,KAAa,EAAS,OAAwB;QAC1E,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,6BAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAA;YAExB,OAAO;gBACL,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;gBACtB,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa;gBACpC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;gBACvB,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU;gBAC9B,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ;gBAC1B,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY;gBAClC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;gBACxE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;gBACrE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;aAChE,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,KAAK,GAAG,EAAE,KAAK,CAAC,CAAA;YACrD,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED;;OAEG;IAKG,AAAN,KAAK,CAAC,gBAAgB,CAAe,KAAsB,EAAS,OAAwB;QAC1F,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,6BAAS,CAAC,UAAU,CAAC;gBAC1C,cAAc,EAAE,KAAK,CAAC,aAAa;gBACnC,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,WAAW,EAAE,KAAK,CAAC,UAAU;gBAC7B,QAAQ,EAAE,KAAK,CAAC,OAAO;aACxB,CAAC,CAAA;YAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC/B,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;gBACtB,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa;gBACpC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;gBACvB,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU;gBAC9B,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ;gBAC1B,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY;gBAClC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;gBACxE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;gBACrE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;aAChE,CAAC,CAAC,CAAA;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAA;YAC9C,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC;IAED;;OAEG;IAKG,AAAN,KAAK,CAAC,eAAe,CAAe,KAAqB,EAAS,OAAwB;QACxF,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAE5D,MAAM,QAAQ,GAAG,MAAM,6BAAS,CAAC,SAAS,CAAC;gBACzC,aAAa,EAAE,KAAK,CAAC,YAAY;gBACjC,UAAU,EAAE,KAAK,CAAC,SAAS;gBAC3B,IAAI;aACL,CAAC,CAAA;YAEF,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAA;YAExB,OAAO;gBACL,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;gBACtB,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa;gBACpC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;gBACvB,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU;gBAC9B,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY;gBAClC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;gBACxE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;gBACrE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;aAChE,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAA;YAC7C,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC;IAED;;OAEG;IAKG,AAAN,KAAK,CAAC,eAAe,CAAe,KAAqB,EAAS,OAAwB;QACxF,IAAI,CAAC;YACH,MAAM,6BAAS,CAAC,SAAS,CAAC;gBACxB,MAAM,EAAE,KAAK,CAAC,KAAK;gBACnB,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAA;YACF,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAA;YAC7C,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC;IAED;;OAEG;IAKG,AAAN,KAAK,CAAC,cAAc,CAAe,KAAoB,EAAS,OAAwB;QACtF,IAAI,CAAC;YACH,MAAM,6BAAS,CAAC,QAAQ,CAAC;gBACvB,MAAM,EAAE,KAAK,CAAC,KAAK;gBACnB,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB,CAAC,CAAA;YACF,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAA;YAChD,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAC9D,CAAC;IACH,CAAC;IAED;;OAEG;IAKG,AAAN,KAAK,CAAC,eAAe,CAAe,KAAqB,EAAS,OAAwB;QACxF,IAAI,CAAC;YACH,MAAM,6BAAS,CAAC,SAAS,CAAC;gBACxB,MAAM,EAAE,KAAK,CAAC,KAAK;gBACnB,MAAM,EAAE,KAAK,CAAC,MAAa;gBAC3B,QAAQ,EAAE,KAAK,CAAC,OAAO;aACxB,CAAC,CAAA;YACF,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAA;YAC7C,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC;CACF,CAAA;AAnKY,gCAAU;AASf;IALL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,wBAAS,EAAE;QAC3B,WAAW,EAAE,sBAAsB;QACnC,QAAQ,EAAE,IAAI;KACf,CAAC;IACD,IAAA,wBAAS,EAAC,oDAAoD,CAAC;IAC/C,mBAAA,IAAA,kBAAG,EAAC,OAAO,CAAC,CAAA;IAAiB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;2CAoBlD;AASK;IAJL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,wBAAS,CAAC,EAAE;QAC7B,WAAW,EAAE,oBAAoB;KAClC,CAAC;IACD,IAAA,wBAAS,EAAC,oDAAoD,CAAC;IACxC,mBAAA,IAAA,kBAAG,EAAC,OAAO,CAAC,CAAA;IAA0B,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAvB,8BAAe;;kDAwB1D;AASK;IAJL,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,wBAAS,EAAE;QAC9B,WAAW,EAAE,uBAAuB;KACrC,CAAC;IACD,IAAA,wBAAS,EAAC,uDAAuD,CAAC;IAC5C,mBAAA,IAAA,kBAAG,EAAC,OAAO,CAAC,CAAA;IAAyB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAtB,6BAAc;;iDA0BxD;AASK;IAJL,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE;QAC5B,WAAW,EAAE,0BAA0B;KACxC,CAAC;IACD,IAAA,wBAAS,EAAC,uDAAuD,CAAC;IAC5C,mBAAA,IAAA,kBAAG,EAAC,OAAO,CAAC,CAAA;IAAyB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAtB,6BAAc;;iDAcxD;AASK;IAJL,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE;QAC5B,WAAW,EAAE,6BAA6B;KAC3C,CAAC;IACD,IAAA,wBAAS,EAAC,uDAAuD,CAAC;IAC7C,mBAAA,IAAA,kBAAG,EAAC,OAAO,CAAC,CAAA;IAAwB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAArB,4BAAa;;gDAYtD;AASK;IAJL,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE;QAC5B,WAAW,EAAE,0BAA0B;KACxC,CAAC;IACD,IAAA,wBAAS,EAAC,uDAAuD,CAAC;IAC5C,mBAAA,IAAA,kBAAG,EAAC,OAAO,CAAC,CAAA;IAAyB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAtB,6BAAc;;iDAYxD;qBAlKU,UAAU;IADtB,IAAA,uBAAQ,GAAE;GACE,UAAU,CAmKtB","sourcesContent":["import { Resolver, Query, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { User } from '@things-factory/auth-base'\nimport { mlflowApi } from '../../utils/mlflow-api-client'\nimport {\n MLflowRun,\n CreateRunInput,\n LogMetricInput,\n LogParamInput,\n UpdateRunInput,\n SearchRunsInput\n} from '../../types/mlflow-types'\n\n@Resolver()\nexport class RunService {\n /**\n * Get run by ID\n */\n @Query(returns => MLflowRun, {\n description: 'Get MLflow run by ID',\n nullable: true\n })\n @Directive('@privilege(category: \"mlflow\", privilege: \"query\")')\n async mlflowRun(@Arg('runId') runId: string, @Ctx() context: ResolverContext): Promise<MLflowRun | null> {\n try {\n const response = await mlflowApi.getRun(runId)\n const run = response.run\n\n return {\n runId: run.info.run_id,\n experimentId: run.info.experiment_id,\n status: run.info.status,\n startTime: run.info.start_time,\n endTime: run.info.end_time,\n artifactUri: run.info.artifact_uri,\n metrics: run.data.metrics ? JSON.stringify(run.data.metrics) : undefined,\n params: run.data.params ? JSON.stringify(run.data.params) : undefined,\n tags: run.data.tags ? JSON.stringify(run.data.tags) : undefined\n }\n } catch (error) {\n console.error(`Failed to fetch run ${runId}:`, error)\n return null\n }\n }\n\n /**\n * Search runs\n */\n @Query(returns => [MLflowRun], {\n description: 'Search MLflow runs'\n })\n @Directive('@privilege(category: \"mlflow\", privilege: \"query\")')\n async searchMLflowRuns(@Arg('input') input: SearchRunsInput, @Ctx() context: ResolverContext): Promise<MLflowRun[]> {\n try {\n const response = await mlflowApi.searchRuns({\n experiment_ids: input.experimentIds,\n filter: input.filter,\n max_results: input.maxResults,\n order_by: input.orderBy\n })\n\n return response.runs.map(run => ({\n runId: run.info.run_id,\n experimentId: run.info.experiment_id,\n status: run.info.status,\n startTime: run.info.start_time,\n endTime: run.info.end_time,\n artifactUri: run.info.artifact_uri,\n metrics: run.data.metrics ? JSON.stringify(run.data.metrics) : undefined,\n params: run.data.params ? JSON.stringify(run.data.params) : undefined,\n tags: run.data.tags ? JSON.stringify(run.data.tags) : undefined\n }))\n } catch (error) {\n console.error('Failed to search runs:', error)\n throw new Error(`Failed to search runs: ${error.message}`)\n }\n }\n\n /**\n * Create new run\n */\n @Mutation(returns => MLflowRun, {\n description: 'Create new MLflow run'\n })\n @Directive('@privilege(category: \"mlflow\", privilege: \"mutation\")')\n async createMLflowRun(@Arg('input') input: CreateRunInput, @Ctx() context: ResolverContext): Promise<MLflowRun> {\n try {\n const tags = input.tags ? JSON.parse(input.tags) : undefined\n\n const response = await mlflowApi.createRun({\n experiment_id: input.experimentId,\n start_time: input.startTime,\n tags\n })\n\n const run = response.run\n\n return {\n runId: run.info.run_id,\n experimentId: run.info.experiment_id,\n status: run.info.status,\n startTime: run.info.start_time,\n artifactUri: run.info.artifact_uri,\n metrics: run.data.metrics ? JSON.stringify(run.data.metrics) : undefined,\n params: run.data.params ? JSON.stringify(run.data.params) : undefined,\n tags: run.data.tags ? JSON.stringify(run.data.tags) : undefined\n }\n } catch (error) {\n console.error('Failed to create run:', error)\n throw new Error(`Failed to create run: ${error.message}`)\n }\n }\n\n /**\n * Log metric\n */\n @Mutation(returns => Boolean, {\n description: 'Log metric to MLflow run'\n })\n @Directive('@privilege(category: \"mlflow\", privilege: \"mutation\")')\n async logMLflowMetric(@Arg('input') input: LogMetricInput, @Ctx() context: ResolverContext): Promise<boolean> {\n try {\n await mlflowApi.logMetric({\n run_id: input.runId,\n key: input.key,\n value: input.value,\n timestamp: input.timestamp,\n step: input.step\n })\n return true\n } catch (error) {\n console.error('Failed to log metric:', error)\n throw new Error(`Failed to log metric: ${error.message}`)\n }\n }\n\n /**\n * Log parameter\n */\n @Mutation(returns => Boolean, {\n description: 'Log parameter to MLflow run'\n })\n @Directive('@privilege(category: \"mlflow\", privilege: \"mutation\")')\n async logMLflowParam(@Arg('input') input: LogParamInput, @Ctx() context: ResolverContext): Promise<boolean> {\n try {\n await mlflowApi.logParam({\n run_id: input.runId,\n key: input.key,\n value: input.value\n })\n return true\n } catch (error) {\n console.error('Failed to log parameter:', error)\n throw new Error(`Failed to log parameter: ${error.message}`)\n }\n }\n\n /**\n * Update run\n */\n @Mutation(returns => Boolean, {\n description: 'Update MLflow run status'\n })\n @Directive('@privilege(category: \"mlflow\", privilege: \"mutation\")')\n async updateMLflowRun(@Arg('input') input: UpdateRunInput, @Ctx() context: ResolverContext): Promise<boolean> {\n try {\n await mlflowApi.updateRun({\n run_id: input.runId,\n status: input.status as any,\n end_time: input.endTime\n })\n return true\n } catch (error) {\n console.error('Failed to update run:', error)\n throw new Error(`Failed to update run: ${error.message}`)\n }\n }\n}\n"]}
|