@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.
Files changed (68) hide show
  1. package/client/bootstrap.ts +41 -0
  2. package/client/index.ts +2 -0
  3. package/client/pages/mlflow-experiments-page.ts +45 -0
  4. package/client/pages/mlflow-models-page.ts +45 -0
  5. package/client/pages/mlflow-runs-page.ts +45 -0
  6. package/client/pages/mlflow-viewer-page.ts +74 -0
  7. package/client/route.ts +19 -0
  8. package/client/tsconfig.json +11 -0
  9. package/dist-client/bootstrap.d.ts +1 -0
  10. package/dist-client/bootstrap.js +40 -0
  11. package/dist-client/bootstrap.js.map +1 -0
  12. package/dist-client/index.d.ts +2 -0
  13. package/dist-client/index.js +3 -0
  14. package/dist-client/index.js.map +1 -0
  15. package/dist-client/pages/mlflow-experiments-page.d.ts +5 -0
  16. package/dist-client/pages/mlflow-experiments-page.js +48 -0
  17. package/dist-client/pages/mlflow-experiments-page.js.map +1 -0
  18. package/dist-client/pages/mlflow-models-page.d.ts +5 -0
  19. package/dist-client/pages/mlflow-models-page.js +48 -0
  20. package/dist-client/pages/mlflow-models-page.js.map +1 -0
  21. package/dist-client/pages/mlflow-runs-page.d.ts +5 -0
  22. package/dist-client/pages/mlflow-runs-page.js +48 -0
  23. package/dist-client/pages/mlflow-runs-page.js.map +1 -0
  24. package/dist-client/pages/mlflow-viewer-page.d.ts +12 -0
  25. package/dist-client/pages/mlflow-viewer-page.js +82 -0
  26. package/dist-client/pages/mlflow-viewer-page.js.map +1 -0
  27. package/dist-client/route.d.ts +1 -0
  28. package/dist-client/route.js +17 -0
  29. package/dist-client/route.js.map +1 -0
  30. package/dist-client/tsconfig.tsbuildinfo +1 -0
  31. package/dist-server/index.d.ts +4 -0
  32. package/dist-server/index.js +8 -0
  33. package/dist-server/index.js.map +1 -0
  34. package/dist-server/route.d.ts +5 -0
  35. package/dist-server/route.js +12 -0
  36. package/dist-server/route.js.map +1 -0
  37. package/dist-server/service/experiment/experiment-service.d.ts +19 -0
  38. package/dist-server/service/experiment/experiment-service.js +135 -0
  39. package/dist-server/service/experiment/experiment-service.js.map +1 -0
  40. package/dist-server/service/index.d.ts +10 -0
  41. package/dist-server/service/index.js +19 -0
  42. package/dist-server/service/index.js.map +1 -0
  43. package/dist-server/service/model-registry/model-registry-service.d.ts +31 -0
  44. package/dist-server/service/model-registry/model-registry-service.js +255 -0
  45. package/dist-server/service/model-registry/model-registry-service.js.map +1 -0
  46. package/dist-server/service/run/run-service.d.ts +27 -0
  47. package/dist-server/service/run/run-service.js +214 -0
  48. package/dist-server/service/run/run-service.js.map +1 -0
  49. package/dist-server/tsconfig.tsbuildinfo +1 -0
  50. package/dist-server/types/mlflow-types.d.ts +87 -0
  51. package/dist-server/types/mlflow-types.js +337 -0
  52. package/dist-server/types/mlflow-types.js.map +1 -0
  53. package/dist-server/utils/mlflow-api-client.d.ts +277 -0
  54. package/dist-server/utils/mlflow-api-client.js +201 -0
  55. package/dist-server/utils/mlflow-api-client.js.map +1 -0
  56. package/package.json +45 -0
  57. package/server/index.ts +5 -0
  58. package/server/route.ts +13 -0
  59. package/server/service/experiment/experiment-service.ts +117 -0
  60. package/server/service/index.ts +17 -0
  61. package/server/service/model-registry/model-registry-service.ts +232 -0
  62. package/server/service/run/run-service.ts +177 -0
  63. package/server/tsconfig.json +11 -0
  64. package/server/types/mlflow-types.ts +235 -0
  65. package/server/utils/mlflow-api-client.ts +375 -0
  66. package/things-factory.config.js +13 -0
  67. package/translations/en.json +28 -0
  68. 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":"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","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"]}