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 CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.1086",
3
+ "version": "0.1.1087",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "minimumDependencyAge": {
@@ -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;AAkC/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,KAAK,CAAC,EAAE,qBAAqB,CAAC;CAC/B;AAED,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAwkCD,qBAAa,wBAAyB,YAAW,kBAAkB;IACjE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAErB;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;IAapC,MAAM,CACV,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,uBAAuB,CAAC;CAkGpC;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"}
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 = createTrackingAuthHeaders(this.config);
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 = await uploadReportArtifacts({
819
- fetchImpl: this.fetchImpl,
820
- artifactsUri: this.config.artifactsUri,
821
- runArtifactUri,
822
- report,
823
- });
824
- const artifactVerification = await verifyUploadedArtifacts({
825
- fetchImpl: this.fetchImpl,
826
- trackingUri,
827
- authHeaders,
828
- runId,
829
- artifacts,
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: "true" },
919
+ { key: "artifacts.logged", value: String(this.config.exportArtifacts) },
836
920
  { key: "artifacts.count", value: String(artifacts.length) },
837
- { key: "artifacts.verified", value: String(artifactVerification.verified) },
838
- {
839
- key: "artifacts.verified_count",
840
- value: String(artifactVerification.artifacts.length - artifactVerification.missing.length),
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,EAiI3E,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"}
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
  ],
@@ -1,3 +1,3 @@
1
1
  /** Shared version value. */
2
- export declare const VERSION = "0.1.1086";
2
+ export declare const VERSION = "0.1.1087";
3
3
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
3
  /** Shared version value. */
4
- export const VERSION = "0.1.1086";
4
+ export const VERSION = "0.1.1087";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.1086",
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.1086",
332
- "@veryfront/ext-content-mdx": "0.1.1086",
333
- "@veryfront/ext-css-tailwind": "0.1.1086",
334
- "@veryfront/ext-parser-babel": "0.1.1086"
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"