veryfront 0.1.1086 → 0.1.1087
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/esm/deno.js +1 -1
- package/esm/extensions/ext-eval-report-mlflow/src/index.d.ts +5 -0
- package/esm/extensions/ext-eval-report-mlflow/src/index.d.ts.map +1 -1
- package/esm/extensions/ext-eval-report-mlflow/src/index.js +109 -21
- package/esm/src/extensions/builtin-extensions.d.ts.map +1 -1
- package/esm/src/extensions/builtin-extensions.js +5 -0
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +5 -5
package/esm/deno.js
CHANGED
|
@@ -11,6 +11,11 @@ export interface EvalReportMlflowExtensionConfig {
|
|
|
11
11
|
trackingToken?: string;
|
|
12
12
|
trackingUsername?: string;
|
|
13
13
|
trackingPassword?: string;
|
|
14
|
+
oauthTokenUrl?: string;
|
|
15
|
+
oauthClientId?: string;
|
|
16
|
+
oauthClientSecret?: string;
|
|
17
|
+
oauthScope?: string;
|
|
18
|
+
exportArtifacts?: boolean;
|
|
14
19
|
fetch?: EvalReportMlflowFetch;
|
|
15
20
|
}
|
|
16
21
|
export interface MlflowArtifactUploadResult {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/extensions/ext-eval-report-mlflow/src/index.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EAGvB,KAAK,uBAAuB,EAC7B,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/extensions/ext-eval-report-mlflow/src/index.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EAGvB,KAAK,uBAAuB,EAC7B,MAAM,uCAAuC,CAAC;AA4C/C,KAAK,qBAAqB,GAAG,CAC3B,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAC7B,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,QAAQ,CAAC,CAAC;AA8CvB,MAAM,WAAW,+BAA+B;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,qBAAqB,CAAC;CAC/B;AASD,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAkpCD,qBAAa,wBAAyB,YAAW,kBAAkB;IACjE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAIrB;IACF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;gBAGhD,MAAM,EAAE,+BAA+B,GAAG;QACxC,EAAE,EAAE,MAAM,CAAC;QACX,WAAW,EAAE,MAAM,CAAC;KACrB,EACD,SAAS,GAAE,qBAA6B;IAgBpC,MAAM,CACV,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,uBAAuB,CAAC;CA6GpC;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,+BAA+B,GAAG;IACxC,WAAW,EAAE,MAAM,CAAC;CACrB,EACD,SAAS,CAAC,EAAE,qBAAqB,GAChC,wBAAwB,CAK1B;AAED,QAAA,MAAM,mBAAmB,EAAE,gBA0C1B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -18,6 +18,11 @@ const ENV_ARTIFACTS_URI = "MLFLOW_ARTIFACTS_URI";
|
|
|
18
18
|
const ENV_TRACKING_TOKEN = "MLFLOW_TRACKING_TOKEN";
|
|
19
19
|
const ENV_TRACKING_USERNAME = "MLFLOW_TRACKING_USERNAME";
|
|
20
20
|
const ENV_TRACKING_PASSWORD = "MLFLOW_TRACKING_PASSWORD";
|
|
21
|
+
const ENV_OAUTH_TOKEN_URL = "MLFLOW_OAUTH_TOKEN_URL";
|
|
22
|
+
const ENV_OAUTH_CLIENT_ID = "MLFLOW_OAUTH_CLIENT_ID";
|
|
23
|
+
const ENV_OAUTH_CLIENT_SECRET = "MLFLOW_OAUTH_CLIENT_SECRET";
|
|
24
|
+
const ENV_OAUTH_SCOPE = "MLFLOW_OAUTH_SCOPE";
|
|
25
|
+
const ENV_EXPORT_ARTIFACTS = "MLFLOW_EXPORT_ARTIFACTS";
|
|
21
26
|
const EXTENSION_METADATA = {
|
|
22
27
|
contracts: {
|
|
23
28
|
requires: ["EvalReportExporterRegistry"],
|
|
@@ -35,6 +40,11 @@ const EXTENSION_METADATA = {
|
|
|
35
40
|
"MLFLOW_TRACKING_TOKEN",
|
|
36
41
|
"MLFLOW_TRACKING_URI",
|
|
37
42
|
"MLFLOW_TRACKING_USERNAME",
|
|
43
|
+
"MLFLOW_OAUTH_TOKEN_URL",
|
|
44
|
+
"MLFLOW_OAUTH_CLIENT_ID",
|
|
45
|
+
"MLFLOW_OAUTH_CLIENT_SECRET",
|
|
46
|
+
"MLFLOW_OAUTH_SCOPE",
|
|
47
|
+
"MLFLOW_EXPORT_ARTIFACTS",
|
|
38
48
|
],
|
|
39
49
|
},
|
|
40
50
|
],
|
|
@@ -82,6 +92,15 @@ function normalizeConfig(config) {
|
|
|
82
92
|
...(typeof config.trackingPassword === "string"
|
|
83
93
|
? { trackingPassword: config.trackingPassword }
|
|
84
94
|
: {}),
|
|
95
|
+
...(typeof config.oauthTokenUrl === "string" ? { oauthTokenUrl: config.oauthTokenUrl } : {}),
|
|
96
|
+
...(typeof config.oauthClientId === "string" ? { oauthClientId: config.oauthClientId } : {}),
|
|
97
|
+
...(typeof config.oauthClientSecret === "string"
|
|
98
|
+
? { oauthClientSecret: config.oauthClientSecret }
|
|
99
|
+
: {}),
|
|
100
|
+
...(typeof config.oauthScope === "string" ? { oauthScope: config.oauthScope } : {}),
|
|
101
|
+
...(typeof config.exportArtifacts === "boolean"
|
|
102
|
+
? { exportArtifacts: config.exportArtifacts }
|
|
103
|
+
: {}),
|
|
85
104
|
...(typeof config.fetch === "function" ? { fetch: config.fetch } : {}),
|
|
86
105
|
};
|
|
87
106
|
}
|
|
@@ -163,6 +182,56 @@ function createTrackingAuthHeaders(config) {
|
|
|
163
182
|
}
|
|
164
183
|
return {};
|
|
165
184
|
}
|
|
185
|
+
function readBooleanEnv(name) {
|
|
186
|
+
const value = readEnv(name)?.toLowerCase();
|
|
187
|
+
if (value === undefined)
|
|
188
|
+
return undefined;
|
|
189
|
+
if (["1", "true", "yes", "on"].includes(value))
|
|
190
|
+
return true;
|
|
191
|
+
if (["0", "false", "no", "off"].includes(value))
|
|
192
|
+
return false;
|
|
193
|
+
throw new Error(`MLflow ${name} must be true or false.`);
|
|
194
|
+
}
|
|
195
|
+
function resolveOAuthClientCredentials(config) {
|
|
196
|
+
const configured = [
|
|
197
|
+
config.oauthTokenUrl,
|
|
198
|
+
config.oauthClientId,
|
|
199
|
+
config.oauthClientSecret,
|
|
200
|
+
].some((value) => value !== undefined && value.length > 0);
|
|
201
|
+
if (!configured)
|
|
202
|
+
return undefined;
|
|
203
|
+
if (!config.oauthTokenUrl || !config.oauthClientId || !config.oauthClientSecret) {
|
|
204
|
+
throw new Error("MLflow OAuth requires MLFLOW_OAUTH_TOKEN_URL, MLFLOW_OAUTH_CLIENT_ID, and MLFLOW_OAUTH_CLIENT_SECRET together.");
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
tokenUrl: normalizeHttpUri(config.oauthTokenUrl, "OAuth token URL"),
|
|
208
|
+
clientId: config.oauthClientId,
|
|
209
|
+
clientSecret: config.oauthClientSecret,
|
|
210
|
+
...(config.oauthScope ? { scope: config.oauthScope } : {}),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
async function createOAuthTrackingAuthHeaders(fetchImpl, config) {
|
|
214
|
+
const body = new URLSearchParams({ grant_type: "client_credentials" });
|
|
215
|
+
if (config.scope)
|
|
216
|
+
body.set("scope", config.scope);
|
|
217
|
+
const response = await fetchImpl(config.tokenUrl, {
|
|
218
|
+
method: "POST",
|
|
219
|
+
headers: {
|
|
220
|
+
accept: "application/json",
|
|
221
|
+
authorization: `Basic ${btoa(`${config.clientId}:${config.clientSecret}`)}`,
|
|
222
|
+
"content-type": "application/x-www-form-urlencoded",
|
|
223
|
+
},
|
|
224
|
+
body: body.toString(),
|
|
225
|
+
});
|
|
226
|
+
const payload = await response.json().catch(() => undefined);
|
|
227
|
+
if (!response.ok) {
|
|
228
|
+
throw new Error(`MLflow OAuth token request failed (${response.status}).`);
|
|
229
|
+
}
|
|
230
|
+
if (!isRecord(payload) || typeof payload.access_token !== "string" || !payload.access_token) {
|
|
231
|
+
throw new Error("MLflow OAuth token response did not include an access_token.");
|
|
232
|
+
}
|
|
233
|
+
return { authorization: `Bearer ${payload.access_token}` };
|
|
234
|
+
}
|
|
166
235
|
function resolveExporterConfig(config) {
|
|
167
236
|
return {
|
|
168
237
|
id: DEFAULT_EXPORTER_ID,
|
|
@@ -174,6 +243,11 @@ function resolveExporterConfig(config) {
|
|
|
174
243
|
trackingToken: config.trackingToken ?? readEnv(ENV_TRACKING_TOKEN),
|
|
175
244
|
trackingUsername: config.trackingUsername ?? readEnv(ENV_TRACKING_USERNAME),
|
|
176
245
|
trackingPassword: config.trackingPassword ?? readEnv(ENV_TRACKING_PASSWORD),
|
|
246
|
+
oauthTokenUrl: config.oauthTokenUrl ?? readEnv(ENV_OAUTH_TOKEN_URL),
|
|
247
|
+
oauthClientId: config.oauthClientId ?? readEnv(ENV_OAUTH_CLIENT_ID),
|
|
248
|
+
oauthClientSecret: config.oauthClientSecret ?? readEnv(ENV_OAUTH_CLIENT_SECRET),
|
|
249
|
+
oauthScope: config.oauthScope ?? readEnv(ENV_OAUTH_SCOPE),
|
|
250
|
+
exportArtifacts: config.exportArtifacts ?? readBooleanEnv(ENV_EXPORT_ARTIFACTS),
|
|
177
251
|
...(config.fetch ? { fetch: config.fetch } : {}),
|
|
178
252
|
};
|
|
179
253
|
}
|
|
@@ -775,16 +849,21 @@ export class EvalReportMlflowExporter {
|
|
|
775
849
|
this.id = config.id;
|
|
776
850
|
const trackingUri = normalizeHttpUri(config.trackingUri, "trackingUri");
|
|
777
851
|
const artifactsUri = resolveArtifactsUri(config, trackingUri);
|
|
852
|
+
const oauth = resolveOAuthClientCredentials(config);
|
|
778
853
|
this.config = {
|
|
779
854
|
...config,
|
|
780
855
|
trackingUri,
|
|
856
|
+
exportArtifacts: config.exportArtifacts ?? true,
|
|
781
857
|
...(artifactsUri ? { artifactsUri: normalizeHttpUri(artifactsUri, "artifactsUri") } : {}),
|
|
858
|
+
...(oauth ? { oauth } : {}),
|
|
782
859
|
};
|
|
783
860
|
this.fetchImpl = fetchImpl;
|
|
784
861
|
}
|
|
785
862
|
async export(report, context) {
|
|
786
863
|
const trackingUri = this.config.trackingUri;
|
|
787
|
-
const authHeaders =
|
|
864
|
+
const authHeaders = this.config.oauth
|
|
865
|
+
? await createOAuthTrackingAuthHeaders(this.fetchImpl, this.config.oauth)
|
|
866
|
+
: createTrackingAuthHeaders(this.config);
|
|
788
867
|
const selectedExperimentName = experimentName(this.config, report, context);
|
|
789
868
|
const experimentId = await getOrCreateMlflowExperiment({
|
|
790
869
|
fetchImpl: this.fetchImpl,
|
|
@@ -815,30 +894,39 @@ export class EvalReportMlflowExporter {
|
|
|
815
894
|
tag("veryfront.summary.passed", report.summary.passed),
|
|
816
895
|
]),
|
|
817
896
|
});
|
|
818
|
-
const artifacts =
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
897
|
+
const artifacts = this.config.exportArtifacts
|
|
898
|
+
? await uploadReportArtifacts({
|
|
899
|
+
fetchImpl: this.fetchImpl,
|
|
900
|
+
artifactsUri: this.config.artifactsUri ??
|
|
901
|
+
(runArtifactUri.startsWith("mlflow-artifacts:/") ? trackingUri : undefined),
|
|
902
|
+
runArtifactUri,
|
|
903
|
+
report,
|
|
904
|
+
})
|
|
905
|
+
: [];
|
|
906
|
+
const artifactVerification = this.config.exportArtifacts
|
|
907
|
+
? await verifyUploadedArtifacts({
|
|
908
|
+
fetchImpl: this.fetchImpl,
|
|
909
|
+
trackingUri,
|
|
910
|
+
authHeaders,
|
|
911
|
+
runId,
|
|
912
|
+
artifacts,
|
|
913
|
+
})
|
|
914
|
+
: undefined;
|
|
831
915
|
await logMlflowBatch(this.fetchImpl, trackingUri, {
|
|
832
916
|
runId,
|
|
833
917
|
authHeaders,
|
|
834
918
|
tags: [
|
|
835
|
-
{ key: "artifacts.logged", value:
|
|
919
|
+
{ key: "artifacts.logged", value: String(this.config.exportArtifacts) },
|
|
836
920
|
{ key: "artifacts.count", value: String(artifacts.length) },
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
921
|
+
...(artifactVerification
|
|
922
|
+
? [
|
|
923
|
+
{ key: "artifacts.verified", value: String(artifactVerification.verified) },
|
|
924
|
+
{
|
|
925
|
+
key: "artifacts.verified_count",
|
|
926
|
+
value: String(artifactVerification.artifacts.length - artifactVerification.missing.length),
|
|
927
|
+
},
|
|
928
|
+
]
|
|
929
|
+
: []),
|
|
842
930
|
],
|
|
843
931
|
});
|
|
844
932
|
await mlflowPost(this.fetchImpl, trackingUri, authHeaders, "runs/update", {
|
|
@@ -853,7 +941,7 @@ export class EvalReportMlflowExporter {
|
|
|
853
941
|
experimentId,
|
|
854
942
|
experimentName: selectedExperimentName,
|
|
855
943
|
artifacts,
|
|
856
|
-
artifactVerification,
|
|
944
|
+
...(artifactVerification ? { artifactVerification } : {}),
|
|
857
945
|
},
|
|
858
946
|
};
|
|
859
947
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builtin-extensions.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/builtin-extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAGV,yBAAyB,EACzB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAMlE,OAAO,KAAK,EAAe,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAevE,MAAM,MAAM,kCAAkC,GAAG;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B,CAAC;AAoBF,eAAO,MAAM,2BAA2B,EAAE,kCAAkC,
|
|
1
|
+
{"version":3,"file":"builtin-extensions.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/builtin-extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAGV,yBAAyB,EACzB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAMlE,OAAO,KAAK,EAAe,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAevE,MAAM,MAAM,kCAAkC,GAAG;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B,CAAC;AAoBF,eAAO,MAAM,2BAA2B,EAAE,kCAAkC,EAsI3E,CAAC;AAWF,wBAAgB,uCAAuC,IAAI,0BAA0B,CASpF;AAWD,wBAAgB,yBAAyB,IAAI,mBAAmB,CAM/D;AAED,wBAAgB,4BAA4B,IAAI,IAAI,CAInD;AA0CD,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,kCAAkC,GAC7C,iBAAiB,CA6BnB;AAwDD,wBAAgB,uBAAuB,IAAI,iBAAiB,EAAE,CAa7D;AAED,wBAAgB,8BAA8B,CAC5C,mBAAmB,GAAE,MAAM,EAAO,GACjC,iBAAiB,EAAE,CAiBrB"}
|
|
@@ -150,6 +150,11 @@ export const OPTIONAL_BUILTIN_EXTENSIONS = [
|
|
|
150
150
|
"MLFLOW_TRACKING_TOKEN",
|
|
151
151
|
"MLFLOW_TRACKING_URI",
|
|
152
152
|
"MLFLOW_TRACKING_USERNAME",
|
|
153
|
+
"MLFLOW_OAUTH_TOKEN_URL",
|
|
154
|
+
"MLFLOW_OAUTH_CLIENT_ID",
|
|
155
|
+
"MLFLOW_OAUTH_CLIENT_SECRET",
|
|
156
|
+
"MLFLOW_OAUTH_SCOPE",
|
|
157
|
+
"MLFLOW_EXPORT_ARTIFACTS",
|
|
153
158
|
],
|
|
154
159
|
},
|
|
155
160
|
],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "veryfront",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1087",
|
|
4
4
|
"description": "The simplest way to build AI-powered apps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -328,10 +328,10 @@
|
|
|
328
328
|
"@types/react": "19.2.14",
|
|
329
329
|
"@types/react-dom": "19.2.3",
|
|
330
330
|
"ws": "8.21.0",
|
|
331
|
-
"@veryfront/ext-bundler-esbuild": "0.1.
|
|
332
|
-
"@veryfront/ext-content-mdx": "0.1.
|
|
333
|
-
"@veryfront/ext-css-tailwind": "0.1.
|
|
334
|
-
"@veryfront/ext-parser-babel": "0.1.
|
|
331
|
+
"@veryfront/ext-bundler-esbuild": "0.1.1087",
|
|
332
|
+
"@veryfront/ext-content-mdx": "0.1.1087",
|
|
333
|
+
"@veryfront/ext-css-tailwind": "0.1.1087",
|
|
334
|
+
"@veryfront/ext-parser-babel": "0.1.1087"
|
|
335
335
|
},
|
|
336
336
|
"devDependencies": {
|
|
337
337
|
"@types/node": "20.9.0"
|