@lmnr-ai/lmnr 0.8.30 → 0.8.32

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 (39) hide show
  1. package/dist/cli.cjs +20 -22
  2. package/dist/cli.cjs.map +1 -1
  3. package/dist/cli.d.cts +1 -1
  4. package/dist/cli.d.mts +1 -1
  5. package/dist/cli.mjs +7 -9
  6. package/dist/cli.mjs.map +1 -1
  7. package/dist/{consts-ivIFfgfN.mjs → consts-3AfXaMBI.mjs} +1 -1
  8. package/dist/{consts-ivIFfgfN.mjs.map → consts-3AfXaMBI.mjs.map} +1 -1
  9. package/dist/{consts-Cx9iKRmq.cjs → consts-DV6_Ea-8.cjs} +1 -1
  10. package/dist/{consts-Cx9iKRmq.cjs.map → consts-DV6_Ea-8.cjs.map} +1 -1
  11. package/dist/{dist-Cyli7uVF.cjs → dist-CDaxruok.cjs} +580 -12
  12. package/dist/dist-CDaxruok.cjs.map +1 -0
  13. package/dist/{dist-DMgpr2Zn.mjs → dist-DwtZd9Jy.mjs} +337 -5
  14. package/dist/dist-DwtZd9Jy.mjs.map +1 -0
  15. package/dist/{evaluations-DLNweSzE.d.cts → evaluations-8E6Oxgoq.d.cts} +18 -5
  16. package/dist/{evaluations-fF1Y_olL.d.mts → evaluations-HtzF0xSN.d.mts} +18 -5
  17. package/dist/{file-utils-CHgYB_Ei.mjs → file-utils-CjQ2Zw9n.mjs} +3 -3
  18. package/dist/{file-utils-CHgYB_Ei.mjs.map → file-utils-CjQ2Zw9n.mjs.map} +1 -1
  19. package/dist/{file-utils-Cysp1Ym1.cjs → file-utils-DWqUwg2p.cjs} +12 -12
  20. package/dist/{file-utils-Cysp1Ym1.cjs.map → file-utils-DWqUwg2p.cjs.map} +1 -1
  21. package/dist/index.cjs +555 -502
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.cts +108 -33
  24. package/dist/index.d.mts +108 -33
  25. package/dist/index.mjs +343 -290
  26. package/dist/index.mjs.map +1 -1
  27. package/dist/opentelemetry-lib/instrumentation/temporal/workflow-interceptors.cjs +69 -69
  28. package/dist/opentelemetry-lib/instrumentation/temporal/workflow-interceptors.cjs.map +1 -1
  29. package/dist/opentelemetry-lib/instrumentation/temporal/workflow-interceptors.mjs +2 -2
  30. package/dist/opentelemetry-lib/instrumentation/temporal/workflow-interceptors.mjs.map +1 -1
  31. package/package.json +7 -7
  32. package/dist/dist-Cyli7uVF.cjs.map +0 -1
  33. package/dist/dist-DMgpr2Zn.mjs.map +0 -1
  34. package/dist/utils-Bdv7YZH7.mjs +0 -337
  35. package/dist/utils-Bdv7YZH7.mjs.map +0 -1
  36. package/dist/utils-C_Pf3r64.cjs +0 -561
  37. package/dist/utils-C_Pf3r64.cjs.map +0 -1
  38. /package/dist/{chunk-hT5z_Zn9.mjs → rolldown-runtime-2rV9d50f.mjs} +0 -0
  39. /package/dist/{chunk-BN4qSVkS.cjs → rolldown-runtime-CVvi-lCc.cjs} +0 -0
package/dist/cli.cjs CHANGED
@@ -1,17 +1,16 @@
1
1
  #!/usr/bin/env node
2
- const require_chunk = require("./chunk-BN4qSVkS.cjs");
3
- const require_utils = require("./utils-C_Pf3r64.cjs");
4
- const require_dist = require("./dist-Cyli7uVF.cjs");
5
- const require_file_utils = require("./file-utils-Cysp1Ym1.cjs");
2
+ const require_rolldown_runtime = require("./rolldown-runtime-CVvi-lCc.cjs");
3
+ const require_dist = require("./dist-CDaxruok.cjs");
4
+ const require_file_utils = require("./file-utils-DWqUwg2p.cjs");
6
5
  let fs = require("fs");
7
- fs = require_chunk.__toESM(fs);
6
+ fs = require_rolldown_runtime.__toESM(fs);
8
7
  let commander = require("commander");
9
8
  let esbuild = require("esbuild");
10
- esbuild = require_chunk.__toESM(esbuild);
9
+ esbuild = require_rolldown_runtime.__toESM(esbuild);
11
10
  let glob = require("glob");
12
- glob = require_chunk.__toESM(glob);
11
+ glob = require_rolldown_runtime.__toESM(glob);
13
12
  //#region src/cli/datasets.ts
14
- const logger$2 = require_utils.initializeLogger();
13
+ const logger$2 = require_dist.initializeLogger();
15
14
  const DEFAULT_DATASET_PULL_BATCH_SIZE = 100;
16
15
  const DEFAULT_DATASET_PUSH_BATCH_SIZE = 100;
17
16
  /**
@@ -62,7 +61,7 @@ const handleDatasetsList = async (options) => {
62
61
  }
63
62
  console.log(`\nTotal: ${datasets.length} dataset(s)\n`);
64
63
  } catch (error) {
65
- logger$2.error(`Failed to list datasets: ${require_utils.errorMessage(error)}`);
64
+ logger$2.error(`Failed to list datasets: ${require_dist.errorMessage(error)}`);
66
65
  }
67
66
  };
68
67
  /**
@@ -96,7 +95,7 @@ const handleDatasetsPush = async (paths, options) => {
96
95
  });
97
96
  logger$2.info(`Pushed ${data.length} data points to dataset ${options.name || options.id}`);
98
97
  } catch (error) {
99
- logger$2.error(`Failed to push dataset: ${require_utils.errorMessage(error)}`);
98
+ logger$2.error(`Failed to push dataset: ${require_dist.errorMessage(error)}`);
100
99
  }
101
100
  };
102
101
  /**
@@ -124,7 +123,7 @@ const handleDatasetsPull = async (outputPath, options) => {
124
123
  logger$2.info(`Successfully pulled ${result.length} data points to ${outputPath}`);
125
124
  } else require_file_utils.printToConsole(result, options.outputFormat ?? "json");
126
125
  } catch (error) {
127
- logger$2.error(`Failed to pull dataset: ${require_utils.errorMessage(error)}`);
126
+ logger$2.error(`Failed to pull dataset: ${require_dist.errorMessage(error)}`);
128
127
  }
129
128
  };
130
129
  /**
@@ -151,7 +150,7 @@ const handleDatasetsCreate = async (name, paths, options) => {
151
150
  });
152
151
  logger$2.info(`Successfully pushed ${data.length} data points to dataset '${name}'`);
153
152
  } catch (error) {
154
- logger$2.error(`Failed to create dataset: ${require_utils.errorMessage(error)}`);
153
+ logger$2.error(`Failed to create dataset: ${require_dist.errorMessage(error)}`);
155
154
  return;
156
155
  }
157
156
  logger$2.info(`Pulling data from dataset '${name}'...`);
@@ -160,12 +159,12 @@ const handleDatasetsCreate = async (name, paths, options) => {
160
159
  await require_file_utils.writeToFile(options.outputFile, result, options.outputFormat);
161
160
  logger$2.info(`Successfully created dataset '${name}' and saved ${result.length} datapoints to ${options.outputFile}`);
162
161
  } catch (error) {
163
- logger$2.error("Failed to pull dataset after creation: " + require_utils.errorMessage(error));
162
+ logger$2.error("Failed to pull dataset after creation: " + require_dist.errorMessage(error));
164
163
  }
165
164
  };
166
165
  //#endregion
167
166
  //#region src/cli/evals.ts
168
- const logger$1 = require_utils.initializeLogger();
167
+ const logger$1 = require_dist.initializeLogger();
169
168
  const createSkipDynamicImportsPlugin = (skipModules) => ({
170
169
  name: "skip-dynamic-imports",
171
170
  setup(build) {
@@ -192,7 +191,7 @@ function loadModule({ filename, moduleText }) {
192
191
  globalThis._evaluations = [];
193
192
  globalThis._set_global_evaluation = true;
194
193
  const __filename = filename;
195
- const __dirname = require_utils.getDirname();
194
+ const __dirname = require_dist.getDirname();
196
195
  new Function("require", "module", "__filename", "__dirname", moduleText)(require, module, __filename, __dirname);
197
196
  return globalThis._evaluations;
198
197
  }
@@ -264,38 +263,37 @@ async function runEvaluation(files, options) {
264
263
  }
265
264
  //#endregion
266
265
  //#region src/cli/index.ts
267
- const logger = require_utils.initializeLogger();
266
+ const logger = require_dist.initializeLogger();
268
267
  async function cli() {
269
268
  const program = new commander.Command();
270
269
  program.name("lmnr").description("CLI for Laminar. Use `lmnr <subcommand> --help` for more information.").version(require_dist.version, "-v, --version", "display version number");
271
270
  program.command("eval").description("Run an evaluation").argument("[files...]", "A file or files containing the evaluation to run. If no file is provided, the evaluation will run all `*.eval.ts|js` files in the `evals` directory. If multiple files are provided, the evaluation will run each file in order.").option("--fail-on-error", "Fail on error. If specified, will fail if encounters a file that cannot be run").option("--output-file <file>", "Output file to write the results to. Outputs are written in JSON format.").option("--external-packages <packages...>", "[ADVANCED] List of packages to pass as external to esbuild. This will not link the packages directly into the eval file, but will instead require them at runtime. Read more: https://esbuild.github.io/api/#external").option("--dynamic-imports-to-skip <modules...>", "[ADVANCED] List of module names to skip when encountered as dynamic imports. These dynamic imports will resolve to an empty module to prevent build failures. This is meant to skip the imports that are not used in the evaluation itself.").option("--frontend-port <port>", "Port for the Laminar frontend. Defaults to 5667", (val) => parseInt(val, 10)).action(async (files, options) => {
272
271
  await runEvaluation(files, options);
273
272
  });
274
- const deprecatedDatasetsWarning = "DeprecationWarning: `lmnr datasets` is deprecated and will be removed in a future version. Use `lmnr-cli dataset` instead.";
275
273
  const datasetCmd = program.command("datasets").description("[DEPRECATED] Manage datasets. Use `lmnr-cli dataset` instead.").option("--project-api-key <key>", "Project API key. If not provided, reads from LMNR_PROJECT_API_KEY env variable").option("--base-url <url>", "Base URL for the Laminar API. Defaults to https://api.lmnr.ai or LMNR_BASE_URL env variable").option("--port <port>", "Port for the Laminar API. Defaults to 443", (val) => parseInt(val, 10));
276
274
  datasetCmd.command("list").description("List all datasets").action(async (options, cmd) => {
277
- process.stderr.write(deprecatedDatasetsWarning + "\n");
275
+ process.stderr.write("DeprecationWarning: `lmnr datasets` is deprecated and will be removed in a future version. Use `lmnr-cli dataset` instead.\n");
278
276
  await handleDatasetsList({
279
277
  ...cmd.parent?.opts() || {},
280
278
  ...options
281
279
  });
282
280
  });
283
281
  datasetCmd.command("push").description("Push datapoints to an existing dataset").argument("<paths...>", "Paths to files or directories containing data to push").option("-n, --name <name>", "Name of the dataset (either name or id must be provided)").option("--id <id>", "ID of the dataset (either name or id must be provided)").option("-r, --recursive", "Recursively read files in directories", false).option("--batch-size <size>", "Batch size for pushing data", (val) => parseInt(val, 10), 100).action(async (paths, options, cmd) => {
284
- process.stderr.write(deprecatedDatasetsWarning + "\n");
282
+ process.stderr.write("DeprecationWarning: `lmnr datasets` is deprecated and will be removed in a future version. Use `lmnr-cli dataset` instead.\n");
285
283
  await handleDatasetsPush(paths, {
286
284
  ...cmd.parent?.opts() || {},
287
285
  ...options
288
286
  });
289
287
  });
290
288
  datasetCmd.command("pull").description("Pull data from a dataset").argument("[output-path]", "Path to save the data. If not provided, prints to console").option("-n, --name <name>", "Name of the dataset (either name or id must be provided)").option("--id <id>", "ID of the dataset (either name or id must be provided)").option("--output-format <format>", "Output format (json, csv, jsonl). Inferred from file extension if not provided").option("--batch-size <size>", "Batch size for pulling data", (val) => parseInt(val, 10), 100).option("--limit <limit>", "Limit number of datapoints to pull", (val) => parseInt(val, 10)).option("--offset <offset>", "Offset for pagination", (val) => parseInt(val, 10), 0).action(async (outputPath, options, cmd) => {
291
- process.stderr.write(deprecatedDatasetsWarning + "\n");
289
+ process.stderr.write("DeprecationWarning: `lmnr datasets` is deprecated and will be removed in a future version. Use `lmnr-cli dataset` instead.\n");
292
290
  await handleDatasetsPull(outputPath, {
293
291
  ...cmd.parent?.opts() || {},
294
292
  ...options
295
293
  });
296
294
  });
297
295
  datasetCmd.command("create").description("Create a dataset from input files").argument("<name>", "Name of the dataset to create").argument("<paths...>", "Paths to files or directories containing data to push").requiredOption("-o, --output-file <file>", "Path to save the pulled data").option("--output-format <format>", "Output format (json, csv, jsonl). Inferred from file extension if not provided").option("-r, --recursive", "Recursively read files in directories", false).option("--batch-size <size>", "Batch size for pushing/pulling data", (val) => parseInt(val, 10), 100).action(async (name, paths, options, cmd) => {
298
- process.stderr.write(deprecatedDatasetsWarning + "\n");
296
+ process.stderr.write("DeprecationWarning: `lmnr datasets` is deprecated and will be removed in a future version. Use `lmnr-cli dataset` instead.\n");
299
297
  await handleDatasetsCreate(name, paths, {
300
298
  ...cmd.parent?.opts() || {},
301
299
  ...options
@@ -308,7 +306,7 @@ async function cli() {
308
306
  await program.parseAsync();
309
307
  }
310
308
  cli().catch((err) => {
311
- logger.error(require_utils.errorMessage(err));
309
+ logger.error(require_dist.errorMessage(err));
312
310
  throw err;
313
311
  });
314
312
  //#endregion
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.cjs","names":["logger","initializeLogger","LaminarClient","errorMessage","loadFromPaths","writeToFile","logger","initializeLogger","getDirname","initializeLogger","Command","version","errorMessage"],"sources":["../src/cli/datasets.ts","../src/cli/evals.ts","../src/cli/index.ts"],"sourcesContent":["import { LaminarClient } from \"@lmnr-ai/client\";\nimport { errorMessage, type StringUUID } from \"@lmnr-ai/types\";\n\nimport { Datapoint } from \"../evaluations\";\nimport { initializeLogger } from \"../utils\";\nimport { loadFromPaths, printToConsole, writeToFile } from \"./file-utils\";\n\nconst logger = initializeLogger();\nconst DEFAULT_DATASET_PULL_BATCH_SIZE = 100;\nconst DEFAULT_DATASET_PUSH_BATCH_SIZE = 100;\n\ninterface DatasetCommandOptions {\n projectApiKey?: string;\n baseUrl?: string;\n port?: number;\n}\n\n/**\n * Pull all data from a dataset in batches.\n */\nconst pullAllData = async <D = any, T = any>(\n client: LaminarClient,\n identifier: { name?: string; id?: StringUUID },\n batchSize: number = DEFAULT_DATASET_PULL_BATCH_SIZE,\n offset: number = 0,\n limit?: number,\n): Promise<Datapoint<D, T>[]> => {\n let hasMore = true;\n let currentOffset = offset;\n const stopAt = limit !== undefined ? offset + limit : undefined;\n\n const result: Datapoint<D, T>[] = [];\n\n while (hasMore && (stopAt === undefined || currentOffset < stopAt)) {\n const data = await client.datasets.pull<D, T>({\n ...identifier,\n offset: currentOffset,\n limit: batchSize,\n });\n\n result.push(...data.items);\n\n // Stop if we received no items or fewer items than requested (end of data)\n if (data.items.length === 0 || data.items.length < batchSize) {\n hasMore = false;\n } else if (stopAt !== undefined && currentOffset + batchSize >= stopAt) {\n hasMore = false;\n } else if (data.totalCount !== undefined && currentOffset + batchSize >= data.totalCount) {\n hasMore = false;\n }\n\n currentOffset += batchSize;\n }\n\n if (limit !== undefined) {\n return result.slice(0, limit);\n }\n\n return result;\n};\n\n/**\n * Handle datasets list command.\n */\nexport const handleDatasetsList = async (\n options: DatasetCommandOptions,\n): Promise<void> => {\n const client = new LaminarClient({\n projectApiKey: options.projectApiKey,\n baseUrl: options.baseUrl,\n port: options.port,\n });\n\n try {\n const datasets = await client.datasets.listDatasets();\n\n if (datasets.length === 0) {\n console.log(\"No datasets found.\");\n return;\n }\n\n // Print table header\n const idWidth = 36; // UUID length\n const createdAtWidth = 19; // YYYY-MM-DD HH:MM:SS format\n\n console.log(`\\n${'ID'.padEnd(idWidth)} ${'Created At'.padEnd(createdAtWidth)} Name`);\n console.log(`${'-'.repeat(idWidth)} ${'-'.repeat(createdAtWidth)} ${'-'.repeat(20)}`);\n\n // Print each dataset row\n for (const dataset of datasets) {\n const createdAt = new Date(dataset.createdAt);\n const createdAtStr = createdAt.toISOString().replace('T', ' ').substring(0, 19);\n console.log(\n `${dataset.id.padEnd(idWidth)} ${createdAtStr.padEnd(createdAtWidth)} ${dataset.name}`,\n );\n }\n\n console.log(`\\nTotal: ${datasets.length} dataset(s)\\n`);\n } catch (error) {\n logger.error(\n `Failed to list datasets: ${errorMessage(error)}`,\n );\n }\n};\n\n/**\n * Handle datasets push command.\n */\nexport const handleDatasetsPush = async (\n paths: string[],\n options: DatasetCommandOptions & {\n name?: string;\n id?: StringUUID;\n recursive?: boolean;\n batchSize?: number;\n },\n): Promise<void> => {\n if (!options.name && !options.id) {\n logger.error(\"Either name or id must be provided\");\n return;\n }\n\n if (options.name && options.id) {\n logger.error(\"Only one of name or id must be provided\");\n return;\n }\n\n const client = new LaminarClient({\n projectApiKey: options.projectApiKey,\n baseUrl: options.baseUrl,\n port: options.port,\n });\n\n const data = await loadFromPaths(paths, options.recursive);\n\n if (data.length === 0) {\n logger.warn(\"No data to push. Skipping\");\n return;\n }\n\n const identifier = options.name ? { name: options.name } : { id: options.id };\n\n try {\n await client.datasets.push({\n points: data,\n ...identifier,\n batchSize: options.batchSize ?? DEFAULT_DATASET_PUSH_BATCH_SIZE,\n });\n logger.info(`Pushed ${data.length} data points to dataset ${options.name || options.id}`);\n } catch (error) {\n logger.error(\n `Failed to push dataset: ${errorMessage(error)}`,\n );\n }\n};\n\n/**\n * Handle datasets pull command.\n */\nexport const handleDatasetsPull = async (\n outputPath: string | undefined,\n options: DatasetCommandOptions & {\n name?: string;\n id?: StringUUID;\n outputFormat?: 'json' | 'csv' | 'jsonl';\n batchSize?: number;\n limit?: number;\n offset?: number;\n },\n): Promise<void> => {\n if (!options.name && !options.id) {\n logger.error(\"Either name or id must be provided\");\n return;\n }\n\n if (options.name && options.id) {\n logger.error(\"Only one of name or id must be provided\");\n return;\n }\n\n const client = new LaminarClient({\n projectApiKey: options.projectApiKey,\n baseUrl: options.baseUrl,\n port: options.port,\n });\n\n const identifier = options.name ? { name: options.name } : { id: options.id };\n\n try {\n const result = await pullAllData(\n client,\n identifier,\n options.batchSize ?? DEFAULT_DATASET_PULL_BATCH_SIZE,\n options.offset ?? 0,\n options.limit,\n );\n\n if (outputPath) {\n await writeToFile(outputPath, result, options.outputFormat);\n logger.info(`Successfully pulled ${result.length} data points to ${outputPath}`);\n } else {\n printToConsole(result, options.outputFormat ?? 'json');\n }\n } catch (error) {\n logger.error(\n `Failed to pull dataset: ${errorMessage(error)}`,\n );\n }\n};\n\n/**\n * Handle datasets create command.\n */\nexport const handleDatasetsCreate = async (\n name: string,\n paths: string[],\n options: DatasetCommandOptions & {\n outputFile: string;\n outputFormat?: 'json' | 'csv' | 'jsonl';\n recursive?: boolean;\n batchSize?: number;\n },\n): Promise<void> => {\n const client = new LaminarClient({\n projectApiKey: options.projectApiKey,\n baseUrl: options.baseUrl,\n port: options.port,\n });\n\n // Load data from input files\n const data = await loadFromPaths(paths, options.recursive);\n\n if (data.length === 0) {\n logger.warn(\"No data to push. Skipping\");\n return;\n }\n\n // Push data to create/populate the dataset\n logger.info(`Pushing ${data.length} data points to dataset '${name}'...`);\n\n try {\n await client.datasets.push({\n points: data,\n name,\n batchSize: options.batchSize ?? DEFAULT_DATASET_PUSH_BATCH_SIZE,\n createDataset: true,\n });\n logger.info(`Successfully pushed ${data.length} data points to dataset '${name}'`);\n } catch (error) {\n logger.error(\n `Failed to create dataset: ${errorMessage(error)}`,\n );\n return;\n }\n\n // Pull data back from the dataset\n logger.info(`Pulling data from dataset '${name}'...`);\n\n try {\n const result = await pullAllData(\n client,\n { name },\n options.batchSize ?? DEFAULT_DATASET_PULL_BATCH_SIZE,\n 0,\n undefined,\n );\n\n // Save to output file\n await writeToFile(options.outputFile, result, options.outputFormat);\n\n logger.info(\n `Successfully created dataset '${name}' `\n + `and saved ${result.length} datapoints to ${options.outputFile}`,\n );\n } catch (error) {\n logger.error(\n \"Failed to pull dataset after creation: \" + errorMessage(error),\n );\n }\n};\n\n","import * as esbuild from \"esbuild\";\nimport * as fs from \"fs\";\nimport * as glob from \"glob\";\n\nimport { Evaluation } from \"../evaluations\";\nimport { getDirname, initializeLogger } from \"../utils\";\n\nconst logger = initializeLogger();\n\n// esbuild plugin to skip dynamic imports\nconst createSkipDynamicImportsPlugin = (skipModules: string[]): esbuild.Plugin => ({\n name: 'skip-dynamic-imports',\n setup(build) {\n if (!skipModules || skipModules.length === 0) return;\n\n build.onResolve({ filter: /.*/ }, (args) => {\n // Only handle dynamic imports\n if (args.kind === 'dynamic-import' && skipModules.includes(args.path)) {\n logger.warn(`Skipping dynamic import: ${args.path}`);\n // Return a virtual module that exports an empty object\n return {\n path: args.path,\n namespace: 'lmnr-skip-dynamic-import',\n };\n }\n });\n\n // Provide empty module content for skipped dynamic imports\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n build.onLoad({ filter: /.*/, namespace: 'lmnr-skip-dynamic-import' }, (args) => ({\n contents: 'export default {};',\n loader: 'js',\n }));\n },\n});\n\nfunction loadModule({\n filename,\n moduleText,\n}: {\n filename: string;\n moduleText: string;\n}): Evaluation<any, any, any>[] {\n globalThis._evaluations = [];\n globalThis._set_global_evaluation = true;\n\n const __filename = filename;\n const __dirname = getDirname();\n\n // add some arguments for proper cjs/esm interop\n\n /* eslint-disable @typescript-eslint/no-implied-eval */\n new Function(\n \"require\",\n \"module\",\n \"__filename\",\n \"__dirname\",\n moduleText,\n )(\n require,\n module,\n __filename,\n __dirname,\n );\n /* eslint-enable @typescript-eslint/no-implied-eval */\n\n // Return the modified _evals global variable\n return globalThis._evaluations;\n}\n\nexport interface EvalCommandOptions {\n failOnError?: boolean;\n outputFile?: string;\n externalPackages?: string[];\n dynamicImportsToSkip?: string[];\n frontendPort?: number;\n}\n\nexport async function runEvaluation(\n files: string[],\n options: EvalCommandOptions,\n): Promise<void> {\n let evalFiles: string[];\n if (files && files.length > 0) {\n evalFiles = files.flatMap((file: string) => glob.sync(file));\n } else {\n // No files provided, use default pattern\n evalFiles = glob.sync('evals/**/*.eval.{ts,js}');\n }\n\n evalFiles.sort();\n\n if (evalFiles.length === 0) {\n logger.error(\"No evaluation files found. Please provide a file or \" +\n \"ensure there are eval files that are named like `*.eval.{ts,js}` in \" +\n \"the `evals` directory or its subdirectories.\");\n process.exit(1);\n }\n\n if (files.length === 0) {\n logger.info(`Located ${evalFiles.length} evaluation files in evals/`);\n } else {\n logger.info(`Running ${evalFiles.length} evaluation files.`);\n }\n\n const scores: {\n file: string,\n scores: Record<string, number>,\n url: string,\n evaluationId: string,\n }[] = [];\n\n for (const file of evalFiles) {\n logger.info(`Loading ${file}...`);\n const buildOptions = {\n bundle: true,\n platform: \"node\" as esbuild.Platform,\n entryPoints: [file],\n outfile: `tmp_out_${file}.js`,\n write: false, // will be loaded in memory as a temp file\n external: [\n \"@lmnr-ai/lmnr\",\n \"@lmnr-ai/lmnr/*\",\n \"@lmnr-ai/client\",\n \"@lmnr-ai/types\",\n \"esbuild\",\n \"fsevents\",\n \"playwright\",\n \"puppeteer\",\n \"puppeteer-core\",\n \"playwright-core\",\n ...(options.externalPackages ? options.externalPackages : []),\n ],\n plugins: [\n createSkipDynamicImportsPlugin(options.dynamicImportsToSkip || []),\n ],\n treeShaking: true,\n };\n\n const result = await esbuild.build(buildOptions);\n\n if (!result.outputFiles) {\n logger.error(\"Error when building: No output files found \" +\n \"it is likely that all eval files are not valid TypeScript or JavaScript files.\");\n if (options.failOnError) {\n process.exit(1);\n }\n continue;\n }\n\n const outputFileText = result.outputFiles[0].text;\n\n const evaluations = loadModule({\n filename: file,\n moduleText: outputFileText,\n });\n\n logger.info(`Loaded ${evaluations.length} evaluations from ${file}`);\n\n for (const evaluation of evaluations) {\n if (!evaluation?.run) {\n logger.error(`Evaluation ${file} does not properly call evaluate()`);\n if (options.failOnError) {\n process.exit(1);\n }\n continue;\n }\n\n if (options.frontendPort) {\n evaluation.setFrontendPort(options.frontendPort);\n }\n const evalResult = await evaluation.run();\n scores.push({\n file,\n scores: evalResult?.averageScores ?? {},\n url: evalResult?.url ?? '',\n evaluationId: evalResult?.evaluationId ?? '',\n });\n }\n }\n\n if (options.outputFile) {\n fs.writeFileSync(options.outputFile, JSON.stringify(scores, null, 2));\n }\n}\n\n","#!/usr/bin/env node\n\nimport { errorMessage } from \"@lmnr-ai/types\";\nimport { Command } from \"commander\";\n\nimport { version } from \"../../package.json\";\nimport { Evaluation } from \"../evaluations\";\nimport { initializeLogger } from \"../utils\";\nimport {\n handleDatasetsCreate,\n handleDatasetsList,\n handleDatasetsPull,\n handleDatasetsPush,\n} from \"./datasets\";\nimport { runEvaluation } from \"./evals\";\n\nconst logger = initializeLogger();\n\ndeclare global {\n var _evaluations: Evaluation<any, any, any>[] | undefined;\n var _set_global_evaluation: boolean;\n}\n\nasync function cli() {\n const program = new Command();\n\n program\n .name(\"lmnr\")\n .description(\"CLI for Laminar. Use `lmnr <subcommand> --help` for more information.\")\n .version(version, \"-v, --version\", \"display version number\");\n\n // Eval command\n program\n .command(\"eval\")\n .description(\"Run an evaluation\")\n .argument(\n \"[files...]\",\n \"A file or files containing the evaluation to run. If no file is provided, \" +\n \"the evaluation will run all `*.eval.ts|js` files in the `evals` directory. \" +\n \"If multiple files are provided, the evaluation will run each file in order.\",\n )\n .option(\n \"--fail-on-error\",\n \"Fail on error. If specified, will fail if encounters a file that cannot be run\",\n )\n .option(\n \"--output-file <file>\",\n \"Output file to write the results to. Outputs are written in JSON format.\",\n )\n .option(\n \"--external-packages <packages...>\",\n \"[ADVANCED] List of packages to pass as external to esbuild. This will not link \" +\n \"the packages directly into the eval file, but will instead require them at runtime. \" +\n \"Read more: https://esbuild.github.io/api/#external\",\n )\n .option(\n \"--dynamic-imports-to-skip <modules...>\",\n \"[ADVANCED] List of module names to skip when encountered as dynamic imports. \" +\n \"These dynamic imports will resolve to an empty module to prevent build failures. \" +\n \"This is meant to skip the imports that are not used in the evaluation itself.\",\n )\n .option(\n \"--frontend-port <port>\",\n \"Port for the Laminar frontend. Defaults to 5667\",\n (val) => parseInt(val, 10),\n )\n .action(async (files: string[], options) => {\n await runEvaluation(files, options);\n });\n\n const deprecatedDatasetsWarning =\n \"DeprecationWarning: `lmnr datasets` is deprecated and will be removed in a future version. \" +\n \"Use `lmnr-cli dataset` instead.\";\n\n // Datasets command with global options\n const datasetCmd = program\n .command(\"datasets\")\n .description(\"[DEPRECATED] Manage datasets. Use `lmnr-cli dataset` instead.\")\n .option(\n \"--project-api-key <key>\",\n \"Project API key. If not provided, reads from LMNR_PROJECT_API_KEY env variable\",\n )\n .option(\n \"--base-url <url>\",\n \"Base URL for the Laminar API. Defaults to https://api.lmnr.ai or LMNR_BASE_URL env variable\",\n )\n .option(\n \"--port <port>\",\n \"Port for the Laminar API. Defaults to 443\",\n (val) => parseInt(val, 10),\n );\n\n // Datasets list command\n datasetCmd\n .command(\"list\")\n .description(\"List all datasets\")\n .action(async (options, cmd) => {\n process.stderr.write(deprecatedDatasetsWarning + \"\\n\");\n const parentOpts = cmd.parent?.opts() || {};\n await handleDatasetsList({ ...parentOpts, ...options });\n });\n\n // Datasets push command\n datasetCmd\n .command(\"push\")\n .description(\"Push datapoints to an existing dataset\")\n .argument(\"<paths...>\", \"Paths to files or directories containing data to push\")\n .option(\"-n, --name <name>\", \"Name of the dataset (either name or id must be provided)\")\n .option(\"--id <id>\", \"ID of the dataset (either name or id must be provided)\")\n .option(\"-r, --recursive\", \"Recursively read files in directories\", false)\n .option(\n \"--batch-size <size>\",\n \"Batch size for pushing data\",\n (val) => parseInt(val, 10),\n 100,\n )\n .action(async (paths: string[], options, cmd) => {\n process.stderr.write(deprecatedDatasetsWarning + \"\\n\");\n const parentOpts = cmd.parent?.opts() || {};\n await handleDatasetsPush(paths, { ...parentOpts, ...options });\n });\n\n // Datasets pull command\n datasetCmd\n .command(\"pull\")\n .description(\"Pull data from a dataset\")\n .argument(\"[output-path]\", \"Path to save the data. If not provided, prints to console\")\n .option(\"-n, --name <name>\", \"Name of the dataset (either name or id must be provided)\")\n .option(\"--id <id>\", \"ID of the dataset (either name or id must be provided)\")\n .option(\n \"--output-format <format>\",\n \"Output format (json, csv, jsonl). Inferred from file extension if not provided\",\n )\n .option(\n \"--batch-size <size>\",\n \"Batch size for pulling data\",\n (val) => parseInt(val, 10),\n 100,\n )\n .option(\"--limit <limit>\", \"Limit number of datapoints to pull\", (val) => parseInt(val, 10))\n .option(\"--offset <offset>\", \"Offset for pagination\", (val) => parseInt(val, 10), 0)\n .action(async (outputPath: string | undefined, options, cmd) => {\n process.stderr.write(deprecatedDatasetsWarning + \"\\n\");\n const parentOpts = cmd.parent?.opts() || {};\n await handleDatasetsPull(outputPath, { ...parentOpts, ...options });\n });\n\n // Datasets create command\n datasetCmd\n .command(\"create\")\n .description(\"Create a dataset from input files\")\n .argument(\"<name>\", \"Name of the dataset to create\")\n .argument(\"<paths...>\", \"Paths to files or directories containing data to push\")\n .requiredOption(\"-o, --output-file <file>\", \"Path to save the pulled data\")\n .option(\n \"--output-format <format>\",\n \"Output format (json, csv, jsonl). Inferred from file extension if not provided\",\n )\n .option(\"-r, --recursive\", \"Recursively read files in directories\", false)\n .option(\n \"--batch-size <size>\",\n \"Batch size for pushing/pulling data\",\n (val) => parseInt(val, 10),\n 100,\n )\n .action(async (name: string, paths: string[], options, cmd) => {\n process.stderr.write(deprecatedDatasetsWarning + \"\\n\");\n const parentOpts = cmd.parent?.opts() || {};\n await handleDatasetsCreate(name, paths, { ...parentOpts, ...options });\n });\n\n // If no command provided, show help\n if (!process.argv.slice(2).length) {\n program.help();\n return;\n }\n\n await program.parseAsync();\n}\n\ncli().catch((err) => {\n logger.error(errorMessage(err));\n throw err;\n});\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli.cjs","names":["logger","initializeLogger","LaminarClient","errorMessage","loadFromPaths","writeToFile","logger","initializeLogger","getDirname","initializeLogger","Command","version","errorMessage"],"sources":["../src/cli/datasets.ts","../src/cli/evals.ts","../src/cli/index.ts"],"sourcesContent":["import { LaminarClient } from \"@lmnr-ai/client\";\nimport { errorMessage, type StringUUID } from \"@lmnr-ai/types\";\n\nimport { Datapoint } from \"../evaluations\";\nimport { initializeLogger } from \"../utils\";\nimport { loadFromPaths, printToConsole, writeToFile } from \"./file-utils\";\n\nconst logger = initializeLogger();\nconst DEFAULT_DATASET_PULL_BATCH_SIZE = 100;\nconst DEFAULT_DATASET_PUSH_BATCH_SIZE = 100;\n\ninterface DatasetCommandOptions {\n projectApiKey?: string;\n baseUrl?: string;\n port?: number;\n}\n\n/**\n * Pull all data from a dataset in batches.\n */\nconst pullAllData = async <D = any, T = any>(\n client: LaminarClient,\n identifier: { name?: string; id?: StringUUID },\n batchSize: number = DEFAULT_DATASET_PULL_BATCH_SIZE,\n offset: number = 0,\n limit?: number,\n): Promise<Datapoint<D, T>[]> => {\n let hasMore = true;\n let currentOffset = offset;\n const stopAt = limit !== undefined ? offset + limit : undefined;\n\n const result: Datapoint<D, T>[] = [];\n\n while (hasMore && (stopAt === undefined || currentOffset < stopAt)) {\n const data = await client.datasets.pull<D, T>({\n ...identifier,\n offset: currentOffset,\n limit: batchSize,\n });\n\n result.push(...data.items);\n\n // Stop if we received no items or fewer items than requested (end of data)\n if (data.items.length === 0 || data.items.length < batchSize) {\n hasMore = false;\n } else if (stopAt !== undefined && currentOffset + batchSize >= stopAt) {\n hasMore = false;\n } else if (data.totalCount !== undefined && currentOffset + batchSize >= data.totalCount) {\n hasMore = false;\n }\n\n currentOffset += batchSize;\n }\n\n if (limit !== undefined) {\n return result.slice(0, limit);\n }\n\n return result;\n};\n\n/**\n * Handle datasets list command.\n */\nexport const handleDatasetsList = async (\n options: DatasetCommandOptions,\n): Promise<void> => {\n const client = new LaminarClient({\n projectApiKey: options.projectApiKey,\n baseUrl: options.baseUrl,\n port: options.port,\n });\n\n try {\n const datasets = await client.datasets.listDatasets();\n\n if (datasets.length === 0) {\n console.log(\"No datasets found.\");\n return;\n }\n\n // Print table header\n const idWidth = 36; // UUID length\n const createdAtWidth = 19; // YYYY-MM-DD HH:MM:SS format\n\n console.log(`\\n${'ID'.padEnd(idWidth)} ${'Created At'.padEnd(createdAtWidth)} Name`);\n console.log(`${'-'.repeat(idWidth)} ${'-'.repeat(createdAtWidth)} ${'-'.repeat(20)}`);\n\n // Print each dataset row\n for (const dataset of datasets) {\n const createdAt = new Date(dataset.createdAt);\n const createdAtStr = createdAt.toISOString().replace('T', ' ').substring(0, 19);\n console.log(\n `${dataset.id.padEnd(idWidth)} ${createdAtStr.padEnd(createdAtWidth)} ${dataset.name}`,\n );\n }\n\n console.log(`\\nTotal: ${datasets.length} dataset(s)\\n`);\n } catch (error) {\n logger.error(\n `Failed to list datasets: ${errorMessage(error)}`,\n );\n }\n};\n\n/**\n * Handle datasets push command.\n */\nexport const handleDatasetsPush = async (\n paths: string[],\n options: DatasetCommandOptions & {\n name?: string;\n id?: StringUUID;\n recursive?: boolean;\n batchSize?: number;\n },\n): Promise<void> => {\n if (!options.name && !options.id) {\n logger.error(\"Either name or id must be provided\");\n return;\n }\n\n if (options.name && options.id) {\n logger.error(\"Only one of name or id must be provided\");\n return;\n }\n\n const client = new LaminarClient({\n projectApiKey: options.projectApiKey,\n baseUrl: options.baseUrl,\n port: options.port,\n });\n\n const data = await loadFromPaths(paths, options.recursive);\n\n if (data.length === 0) {\n logger.warn(\"No data to push. Skipping\");\n return;\n }\n\n const identifier = options.name ? { name: options.name } : { id: options.id };\n\n try {\n await client.datasets.push({\n points: data,\n ...identifier,\n batchSize: options.batchSize ?? DEFAULT_DATASET_PUSH_BATCH_SIZE,\n });\n logger.info(`Pushed ${data.length} data points to dataset ${options.name || options.id}`);\n } catch (error) {\n logger.error(\n `Failed to push dataset: ${errorMessage(error)}`,\n );\n }\n};\n\n/**\n * Handle datasets pull command.\n */\nexport const handleDatasetsPull = async (\n outputPath: string | undefined,\n options: DatasetCommandOptions & {\n name?: string;\n id?: StringUUID;\n outputFormat?: 'json' | 'csv' | 'jsonl';\n batchSize?: number;\n limit?: number;\n offset?: number;\n },\n): Promise<void> => {\n if (!options.name && !options.id) {\n logger.error(\"Either name or id must be provided\");\n return;\n }\n\n if (options.name && options.id) {\n logger.error(\"Only one of name or id must be provided\");\n return;\n }\n\n const client = new LaminarClient({\n projectApiKey: options.projectApiKey,\n baseUrl: options.baseUrl,\n port: options.port,\n });\n\n const identifier = options.name ? { name: options.name } : { id: options.id };\n\n try {\n const result = await pullAllData(\n client,\n identifier,\n options.batchSize ?? DEFAULT_DATASET_PULL_BATCH_SIZE,\n options.offset ?? 0,\n options.limit,\n );\n\n if (outputPath) {\n await writeToFile(outputPath, result, options.outputFormat);\n logger.info(`Successfully pulled ${result.length} data points to ${outputPath}`);\n } else {\n printToConsole(result, options.outputFormat ?? 'json');\n }\n } catch (error) {\n logger.error(\n `Failed to pull dataset: ${errorMessage(error)}`,\n );\n }\n};\n\n/**\n * Handle datasets create command.\n */\nexport const handleDatasetsCreate = async (\n name: string,\n paths: string[],\n options: DatasetCommandOptions & {\n outputFile: string;\n outputFormat?: 'json' | 'csv' | 'jsonl';\n recursive?: boolean;\n batchSize?: number;\n },\n): Promise<void> => {\n const client = new LaminarClient({\n projectApiKey: options.projectApiKey,\n baseUrl: options.baseUrl,\n port: options.port,\n });\n\n // Load data from input files\n const data = await loadFromPaths(paths, options.recursive);\n\n if (data.length === 0) {\n logger.warn(\"No data to push. Skipping\");\n return;\n }\n\n // Push data to create/populate the dataset\n logger.info(`Pushing ${data.length} data points to dataset '${name}'...`);\n\n try {\n await client.datasets.push({\n points: data,\n name,\n batchSize: options.batchSize ?? DEFAULT_DATASET_PUSH_BATCH_SIZE,\n createDataset: true,\n });\n logger.info(`Successfully pushed ${data.length} data points to dataset '${name}'`);\n } catch (error) {\n logger.error(\n `Failed to create dataset: ${errorMessage(error)}`,\n );\n return;\n }\n\n // Pull data back from the dataset\n logger.info(`Pulling data from dataset '${name}'...`);\n\n try {\n const result = await pullAllData(\n client,\n { name },\n options.batchSize ?? DEFAULT_DATASET_PULL_BATCH_SIZE,\n 0,\n undefined,\n );\n\n // Save to output file\n await writeToFile(options.outputFile, result, options.outputFormat);\n\n logger.info(\n `Successfully created dataset '${name}' `\n + `and saved ${result.length} datapoints to ${options.outputFile}`,\n );\n } catch (error) {\n logger.error(\n \"Failed to pull dataset after creation: \" + errorMessage(error),\n );\n }\n};\n\n","import * as esbuild from \"esbuild\";\nimport * as fs from \"fs\";\nimport * as glob from \"glob\";\n\nimport { Evaluation } from \"../evaluations\";\nimport { getDirname, initializeLogger } from \"../utils\";\n\nconst logger = initializeLogger();\n\n// esbuild plugin to skip dynamic imports\nconst createSkipDynamicImportsPlugin = (skipModules: string[]): esbuild.Plugin => ({\n name: 'skip-dynamic-imports',\n setup(build) {\n if (!skipModules || skipModules.length === 0) return;\n\n build.onResolve({ filter: /.*/ }, (args) => {\n // Only handle dynamic imports\n if (args.kind === 'dynamic-import' && skipModules.includes(args.path)) {\n logger.warn(`Skipping dynamic import: ${args.path}`);\n // Return a virtual module that exports an empty object\n return {\n path: args.path,\n namespace: 'lmnr-skip-dynamic-import',\n };\n }\n });\n\n // Provide empty module content for skipped dynamic imports\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n build.onLoad({ filter: /.*/, namespace: 'lmnr-skip-dynamic-import' }, (args) => ({\n contents: 'export default {};',\n loader: 'js',\n }));\n },\n});\n\nfunction loadModule({\n filename,\n moduleText,\n}: {\n filename: string;\n moduleText: string;\n}): Evaluation<any, any, any>[] {\n globalThis._evaluations = [];\n globalThis._set_global_evaluation = true;\n\n const __filename = filename;\n const __dirname = getDirname();\n\n // add some arguments for proper cjs/esm interop\n\n /* eslint-disable @typescript-eslint/no-implied-eval */\n new Function(\n \"require\",\n \"module\",\n \"__filename\",\n \"__dirname\",\n moduleText,\n )(\n require,\n module,\n __filename,\n __dirname,\n );\n /* eslint-enable @typescript-eslint/no-implied-eval */\n\n // Return the modified _evals global variable\n return globalThis._evaluations;\n}\n\nexport interface EvalCommandOptions {\n failOnError?: boolean;\n outputFile?: string;\n externalPackages?: string[];\n dynamicImportsToSkip?: string[];\n frontendPort?: number;\n}\n\nexport async function runEvaluation(\n files: string[],\n options: EvalCommandOptions,\n): Promise<void> {\n let evalFiles: string[];\n if (files && files.length > 0) {\n evalFiles = files.flatMap((file: string) => glob.sync(file));\n } else {\n // No files provided, use default pattern\n evalFiles = glob.sync('evals/**/*.eval.{ts,js}');\n }\n\n evalFiles.sort();\n\n if (evalFiles.length === 0) {\n logger.error(\"No evaluation files found. Please provide a file or \" +\n \"ensure there are eval files that are named like `*.eval.{ts,js}` in \" +\n \"the `evals` directory or its subdirectories.\");\n process.exit(1);\n }\n\n if (files.length === 0) {\n logger.info(`Located ${evalFiles.length} evaluation files in evals/`);\n } else {\n logger.info(`Running ${evalFiles.length} evaluation files.`);\n }\n\n const scores: {\n file: string,\n scores: Record<string, number>,\n url: string,\n evaluationId: string,\n }[] = [];\n\n for (const file of evalFiles) {\n logger.info(`Loading ${file}...`);\n const buildOptions = {\n bundle: true,\n platform: \"node\" as esbuild.Platform,\n entryPoints: [file],\n outfile: `tmp_out_${file}.js`,\n write: false, // will be loaded in memory as a temp file\n external: [\n \"@lmnr-ai/lmnr\",\n \"@lmnr-ai/lmnr/*\",\n \"@lmnr-ai/client\",\n \"@lmnr-ai/types\",\n \"esbuild\",\n \"fsevents\",\n \"playwright\",\n \"puppeteer\",\n \"puppeteer-core\",\n \"playwright-core\",\n ...(options.externalPackages ? options.externalPackages : []),\n ],\n plugins: [\n createSkipDynamicImportsPlugin(options.dynamicImportsToSkip || []),\n ],\n treeShaking: true,\n };\n\n const result = await esbuild.build(buildOptions);\n\n if (!result.outputFiles) {\n logger.error(\"Error when building: No output files found \" +\n \"it is likely that all eval files are not valid TypeScript or JavaScript files.\");\n if (options.failOnError) {\n process.exit(1);\n }\n continue;\n }\n\n const outputFileText = result.outputFiles[0].text;\n\n const evaluations = loadModule({\n filename: file,\n moduleText: outputFileText,\n });\n\n logger.info(`Loaded ${evaluations.length} evaluations from ${file}`);\n\n for (const evaluation of evaluations) {\n if (!evaluation?.run) {\n logger.error(`Evaluation ${file} does not properly call evaluate()`);\n if (options.failOnError) {\n process.exit(1);\n }\n continue;\n }\n\n if (options.frontendPort) {\n evaluation.setFrontendPort(options.frontendPort);\n }\n const evalResult = await evaluation.run();\n scores.push({\n file,\n scores: evalResult?.averageScores ?? {},\n url: evalResult?.url ?? '',\n evaluationId: evalResult?.evaluationId ?? '',\n });\n }\n }\n\n if (options.outputFile) {\n fs.writeFileSync(options.outputFile, JSON.stringify(scores, null, 2));\n }\n}\n\n","#!/usr/bin/env node\n\nimport { errorMessage } from \"@lmnr-ai/types\";\nimport { Command } from \"commander\";\n\nimport { version } from \"../../package.json\";\nimport { Evaluation } from \"../evaluations\";\nimport { initializeLogger } from \"../utils\";\nimport {\n handleDatasetsCreate,\n handleDatasetsList,\n handleDatasetsPull,\n handleDatasetsPush,\n} from \"./datasets\";\nimport { runEvaluation } from \"./evals\";\n\nconst logger = initializeLogger();\n\ndeclare global {\n var _evaluations: Evaluation<any, any, any>[] | undefined;\n var _set_global_evaluation: boolean;\n}\n\nasync function cli() {\n const program = new Command();\n\n program\n .name(\"lmnr\")\n .description(\"CLI for Laminar. Use `lmnr <subcommand> --help` for more information.\")\n .version(version, \"-v, --version\", \"display version number\");\n\n // Eval command\n program\n .command(\"eval\")\n .description(\"Run an evaluation\")\n .argument(\n \"[files...]\",\n \"A file or files containing the evaluation to run. If no file is provided, \" +\n \"the evaluation will run all `*.eval.ts|js` files in the `evals` directory. \" +\n \"If multiple files are provided, the evaluation will run each file in order.\",\n )\n .option(\n \"--fail-on-error\",\n \"Fail on error. If specified, will fail if encounters a file that cannot be run\",\n )\n .option(\n \"--output-file <file>\",\n \"Output file to write the results to. Outputs are written in JSON format.\",\n )\n .option(\n \"--external-packages <packages...>\",\n \"[ADVANCED] List of packages to pass as external to esbuild. This will not link \" +\n \"the packages directly into the eval file, but will instead require them at runtime. \" +\n \"Read more: https://esbuild.github.io/api/#external\",\n )\n .option(\n \"--dynamic-imports-to-skip <modules...>\",\n \"[ADVANCED] List of module names to skip when encountered as dynamic imports. \" +\n \"These dynamic imports will resolve to an empty module to prevent build failures. \" +\n \"This is meant to skip the imports that are not used in the evaluation itself.\",\n )\n .option(\n \"--frontend-port <port>\",\n \"Port for the Laminar frontend. Defaults to 5667\",\n (val) => parseInt(val, 10),\n )\n .action(async (files: string[], options) => {\n await runEvaluation(files, options);\n });\n\n const deprecatedDatasetsWarning =\n \"DeprecationWarning: `lmnr datasets` is deprecated and will be removed in a future version. \" +\n \"Use `lmnr-cli dataset` instead.\";\n\n // Datasets command with global options\n const datasetCmd = program\n .command(\"datasets\")\n .description(\"[DEPRECATED] Manage datasets. Use `lmnr-cli dataset` instead.\")\n .option(\n \"--project-api-key <key>\",\n \"Project API key. If not provided, reads from LMNR_PROJECT_API_KEY env variable\",\n )\n .option(\n \"--base-url <url>\",\n \"Base URL for the Laminar API. Defaults to https://api.lmnr.ai or LMNR_BASE_URL env variable\",\n )\n .option(\n \"--port <port>\",\n \"Port for the Laminar API. Defaults to 443\",\n (val) => parseInt(val, 10),\n );\n\n // Datasets list command\n datasetCmd\n .command(\"list\")\n .description(\"List all datasets\")\n .action(async (options, cmd) => {\n process.stderr.write(deprecatedDatasetsWarning + \"\\n\");\n const parentOpts = cmd.parent?.opts() || {};\n await handleDatasetsList({ ...parentOpts, ...options });\n });\n\n // Datasets push command\n datasetCmd\n .command(\"push\")\n .description(\"Push datapoints to an existing dataset\")\n .argument(\"<paths...>\", \"Paths to files or directories containing data to push\")\n .option(\"-n, --name <name>\", \"Name of the dataset (either name or id must be provided)\")\n .option(\"--id <id>\", \"ID of the dataset (either name or id must be provided)\")\n .option(\"-r, --recursive\", \"Recursively read files in directories\", false)\n .option(\n \"--batch-size <size>\",\n \"Batch size for pushing data\",\n (val) => parseInt(val, 10),\n 100,\n )\n .action(async (paths: string[], options, cmd) => {\n process.stderr.write(deprecatedDatasetsWarning + \"\\n\");\n const parentOpts = cmd.parent?.opts() || {};\n await handleDatasetsPush(paths, { ...parentOpts, ...options });\n });\n\n // Datasets pull command\n datasetCmd\n .command(\"pull\")\n .description(\"Pull data from a dataset\")\n .argument(\"[output-path]\", \"Path to save the data. If not provided, prints to console\")\n .option(\"-n, --name <name>\", \"Name of the dataset (either name or id must be provided)\")\n .option(\"--id <id>\", \"ID of the dataset (either name or id must be provided)\")\n .option(\n \"--output-format <format>\",\n \"Output format (json, csv, jsonl). Inferred from file extension if not provided\",\n )\n .option(\n \"--batch-size <size>\",\n \"Batch size for pulling data\",\n (val) => parseInt(val, 10),\n 100,\n )\n .option(\"--limit <limit>\", \"Limit number of datapoints to pull\", (val) => parseInt(val, 10))\n .option(\"--offset <offset>\", \"Offset for pagination\", (val) => parseInt(val, 10), 0)\n .action(async (outputPath: string | undefined, options, cmd) => {\n process.stderr.write(deprecatedDatasetsWarning + \"\\n\");\n const parentOpts = cmd.parent?.opts() || {};\n await handleDatasetsPull(outputPath, { ...parentOpts, ...options });\n });\n\n // Datasets create command\n datasetCmd\n .command(\"create\")\n .description(\"Create a dataset from input files\")\n .argument(\"<name>\", \"Name of the dataset to create\")\n .argument(\"<paths...>\", \"Paths to files or directories containing data to push\")\n .requiredOption(\"-o, --output-file <file>\", \"Path to save the pulled data\")\n .option(\n \"--output-format <format>\",\n \"Output format (json, csv, jsonl). Inferred from file extension if not provided\",\n )\n .option(\"-r, --recursive\", \"Recursively read files in directories\", false)\n .option(\n \"--batch-size <size>\",\n \"Batch size for pushing/pulling data\",\n (val) => parseInt(val, 10),\n 100,\n )\n .action(async (name: string, paths: string[], options, cmd) => {\n process.stderr.write(deprecatedDatasetsWarning + \"\\n\");\n const parentOpts = cmd.parent?.opts() || {};\n await handleDatasetsCreate(name, paths, { ...parentOpts, ...options });\n });\n\n // If no command provided, show help\n if (!process.argv.slice(2).length) {\n program.help();\n return;\n }\n\n await program.parseAsync();\n}\n\ncli().catch((err) => {\n logger.error(errorMessage(err));\n throw err;\n});\n\n"],"mappings":"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"}
package/dist/cli.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { n as Evaluation } from "./evaluations-DLNweSzE.cjs";
1
+ import { n as Evaluation } from "./evaluations-8E6Oxgoq.cjs";
2
2
 
3
3
  //#region src/cli/index.d.ts
4
4
  declare global {
package/dist/cli.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { n as Evaluation } from "./evaluations-fF1Y_olL.mjs";
1
+ import { n as Evaluation } from "./evaluations-HtzF0xSN.mjs";
2
2
 
3
3
  //#region src/cli/index.d.ts
4
4
  declare global {
package/dist/cli.mjs CHANGED
@@ -1,8 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { r as __require } from "./chunk-hT5z_Zn9.mjs";
3
- import { L as errorMessage, i as getDirname, s as initializeLogger } from "./utils-Bdv7YZH7.mjs";
4
- import { n as version, t as LaminarClient } from "./dist-DMgpr2Zn.mjs";
5
- import { i as writeToFile, n as loadFromPaths, r as printToConsole } from "./file-utils-CHgYB_Ei.mjs";
2
+ import { r as __require } from "./rolldown-runtime-2rV9d50f.mjs";
3
+ import { L as version, V as errorMessage, a as getDirname, c as initializeLogger, t as LaminarClient } from "./dist-DwtZd9Jy.mjs";
4
+ import { i as writeToFile, n as loadFromPaths, r as printToConsole } from "./file-utils-CjQ2Zw9n.mjs";
6
5
  import * as fs from "fs";
7
6
  import { Command } from "commander";
8
7
  import * as esbuild from "esbuild";
@@ -268,31 +267,30 @@ async function cli() {
268
267
  program.command("eval").description("Run an evaluation").argument("[files...]", "A file or files containing the evaluation to run. If no file is provided, the evaluation will run all `*.eval.ts|js` files in the `evals` directory. If multiple files are provided, the evaluation will run each file in order.").option("--fail-on-error", "Fail on error. If specified, will fail if encounters a file that cannot be run").option("--output-file <file>", "Output file to write the results to. Outputs are written in JSON format.").option("--external-packages <packages...>", "[ADVANCED] List of packages to pass as external to esbuild. This will not link the packages directly into the eval file, but will instead require them at runtime. Read more: https://esbuild.github.io/api/#external").option("--dynamic-imports-to-skip <modules...>", "[ADVANCED] List of module names to skip when encountered as dynamic imports. These dynamic imports will resolve to an empty module to prevent build failures. This is meant to skip the imports that are not used in the evaluation itself.").option("--frontend-port <port>", "Port for the Laminar frontend. Defaults to 5667", (val) => parseInt(val, 10)).action(async (files, options) => {
269
268
  await runEvaluation(files, options);
270
269
  });
271
- const deprecatedDatasetsWarning = "DeprecationWarning: `lmnr datasets` is deprecated and will be removed in a future version. Use `lmnr-cli dataset` instead.";
272
270
  const datasetCmd = program.command("datasets").description("[DEPRECATED] Manage datasets. Use `lmnr-cli dataset` instead.").option("--project-api-key <key>", "Project API key. If not provided, reads from LMNR_PROJECT_API_KEY env variable").option("--base-url <url>", "Base URL for the Laminar API. Defaults to https://api.lmnr.ai or LMNR_BASE_URL env variable").option("--port <port>", "Port for the Laminar API. Defaults to 443", (val) => parseInt(val, 10));
273
271
  datasetCmd.command("list").description("List all datasets").action(async (options, cmd) => {
274
- process.stderr.write(deprecatedDatasetsWarning + "\n");
272
+ process.stderr.write("DeprecationWarning: `lmnr datasets` is deprecated and will be removed in a future version. Use `lmnr-cli dataset` instead.\n");
275
273
  await handleDatasetsList({
276
274
  ...cmd.parent?.opts() || {},
277
275
  ...options
278
276
  });
279
277
  });
280
278
  datasetCmd.command("push").description("Push datapoints to an existing dataset").argument("<paths...>", "Paths to files or directories containing data to push").option("-n, --name <name>", "Name of the dataset (either name or id must be provided)").option("--id <id>", "ID of the dataset (either name or id must be provided)").option("-r, --recursive", "Recursively read files in directories", false).option("--batch-size <size>", "Batch size for pushing data", (val) => parseInt(val, 10), 100).action(async (paths, options, cmd) => {
281
- process.stderr.write(deprecatedDatasetsWarning + "\n");
279
+ process.stderr.write("DeprecationWarning: `lmnr datasets` is deprecated and will be removed in a future version. Use `lmnr-cli dataset` instead.\n");
282
280
  await handleDatasetsPush(paths, {
283
281
  ...cmd.parent?.opts() || {},
284
282
  ...options
285
283
  });
286
284
  });
287
285
  datasetCmd.command("pull").description("Pull data from a dataset").argument("[output-path]", "Path to save the data. If not provided, prints to console").option("-n, --name <name>", "Name of the dataset (either name or id must be provided)").option("--id <id>", "ID of the dataset (either name or id must be provided)").option("--output-format <format>", "Output format (json, csv, jsonl). Inferred from file extension if not provided").option("--batch-size <size>", "Batch size for pulling data", (val) => parseInt(val, 10), 100).option("--limit <limit>", "Limit number of datapoints to pull", (val) => parseInt(val, 10)).option("--offset <offset>", "Offset for pagination", (val) => parseInt(val, 10), 0).action(async (outputPath, options, cmd) => {
288
- process.stderr.write(deprecatedDatasetsWarning + "\n");
286
+ process.stderr.write("DeprecationWarning: `lmnr datasets` is deprecated and will be removed in a future version. Use `lmnr-cli dataset` instead.\n");
289
287
  await handleDatasetsPull(outputPath, {
290
288
  ...cmd.parent?.opts() || {},
291
289
  ...options
292
290
  });
293
291
  });
294
292
  datasetCmd.command("create").description("Create a dataset from input files").argument("<name>", "Name of the dataset to create").argument("<paths...>", "Paths to files or directories containing data to push").requiredOption("-o, --output-file <file>", "Path to save the pulled data").option("--output-format <format>", "Output format (json, csv, jsonl). Inferred from file extension if not provided").option("-r, --recursive", "Recursively read files in directories", false).option("--batch-size <size>", "Batch size for pushing/pulling data", (val) => parseInt(val, 10), 100).action(async (name, paths, options, cmd) => {
295
- process.stderr.write(deprecatedDatasetsWarning + "\n");
293
+ process.stderr.write("DeprecationWarning: `lmnr datasets` is deprecated and will be removed in a future version. Use `lmnr-cli dataset` instead.\n");
296
294
  await handleDatasetsCreate(name, paths, {
297
295
  ...cmd.parent?.opts() || {},
298
296
  ...options
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":["logger","logger"],"sources":["../src/cli/datasets.ts","../src/cli/evals.ts","../src/cli/index.ts"],"sourcesContent":["import { LaminarClient } from \"@lmnr-ai/client\";\nimport { errorMessage, type StringUUID } from \"@lmnr-ai/types\";\n\nimport { Datapoint } from \"../evaluations\";\nimport { initializeLogger } from \"../utils\";\nimport { loadFromPaths, printToConsole, writeToFile } from \"./file-utils\";\n\nconst logger = initializeLogger();\nconst DEFAULT_DATASET_PULL_BATCH_SIZE = 100;\nconst DEFAULT_DATASET_PUSH_BATCH_SIZE = 100;\n\ninterface DatasetCommandOptions {\n projectApiKey?: string;\n baseUrl?: string;\n port?: number;\n}\n\n/**\n * Pull all data from a dataset in batches.\n */\nconst pullAllData = async <D = any, T = any>(\n client: LaminarClient,\n identifier: { name?: string; id?: StringUUID },\n batchSize: number = DEFAULT_DATASET_PULL_BATCH_SIZE,\n offset: number = 0,\n limit?: number,\n): Promise<Datapoint<D, T>[]> => {\n let hasMore = true;\n let currentOffset = offset;\n const stopAt = limit !== undefined ? offset + limit : undefined;\n\n const result: Datapoint<D, T>[] = [];\n\n while (hasMore && (stopAt === undefined || currentOffset < stopAt)) {\n const data = await client.datasets.pull<D, T>({\n ...identifier,\n offset: currentOffset,\n limit: batchSize,\n });\n\n result.push(...data.items);\n\n // Stop if we received no items or fewer items than requested (end of data)\n if (data.items.length === 0 || data.items.length < batchSize) {\n hasMore = false;\n } else if (stopAt !== undefined && currentOffset + batchSize >= stopAt) {\n hasMore = false;\n } else if (data.totalCount !== undefined && currentOffset + batchSize >= data.totalCount) {\n hasMore = false;\n }\n\n currentOffset += batchSize;\n }\n\n if (limit !== undefined) {\n return result.slice(0, limit);\n }\n\n return result;\n};\n\n/**\n * Handle datasets list command.\n */\nexport const handleDatasetsList = async (\n options: DatasetCommandOptions,\n): Promise<void> => {\n const client = new LaminarClient({\n projectApiKey: options.projectApiKey,\n baseUrl: options.baseUrl,\n port: options.port,\n });\n\n try {\n const datasets = await client.datasets.listDatasets();\n\n if (datasets.length === 0) {\n console.log(\"No datasets found.\");\n return;\n }\n\n // Print table header\n const idWidth = 36; // UUID length\n const createdAtWidth = 19; // YYYY-MM-DD HH:MM:SS format\n\n console.log(`\\n${'ID'.padEnd(idWidth)} ${'Created At'.padEnd(createdAtWidth)} Name`);\n console.log(`${'-'.repeat(idWidth)} ${'-'.repeat(createdAtWidth)} ${'-'.repeat(20)}`);\n\n // Print each dataset row\n for (const dataset of datasets) {\n const createdAt = new Date(dataset.createdAt);\n const createdAtStr = createdAt.toISOString().replace('T', ' ').substring(0, 19);\n console.log(\n `${dataset.id.padEnd(idWidth)} ${createdAtStr.padEnd(createdAtWidth)} ${dataset.name}`,\n );\n }\n\n console.log(`\\nTotal: ${datasets.length} dataset(s)\\n`);\n } catch (error) {\n logger.error(\n `Failed to list datasets: ${errorMessage(error)}`,\n );\n }\n};\n\n/**\n * Handle datasets push command.\n */\nexport const handleDatasetsPush = async (\n paths: string[],\n options: DatasetCommandOptions & {\n name?: string;\n id?: StringUUID;\n recursive?: boolean;\n batchSize?: number;\n },\n): Promise<void> => {\n if (!options.name && !options.id) {\n logger.error(\"Either name or id must be provided\");\n return;\n }\n\n if (options.name && options.id) {\n logger.error(\"Only one of name or id must be provided\");\n return;\n }\n\n const client = new LaminarClient({\n projectApiKey: options.projectApiKey,\n baseUrl: options.baseUrl,\n port: options.port,\n });\n\n const data = await loadFromPaths(paths, options.recursive);\n\n if (data.length === 0) {\n logger.warn(\"No data to push. Skipping\");\n return;\n }\n\n const identifier = options.name ? { name: options.name } : { id: options.id };\n\n try {\n await client.datasets.push({\n points: data,\n ...identifier,\n batchSize: options.batchSize ?? DEFAULT_DATASET_PUSH_BATCH_SIZE,\n });\n logger.info(`Pushed ${data.length} data points to dataset ${options.name || options.id}`);\n } catch (error) {\n logger.error(\n `Failed to push dataset: ${errorMessage(error)}`,\n );\n }\n};\n\n/**\n * Handle datasets pull command.\n */\nexport const handleDatasetsPull = async (\n outputPath: string | undefined,\n options: DatasetCommandOptions & {\n name?: string;\n id?: StringUUID;\n outputFormat?: 'json' | 'csv' | 'jsonl';\n batchSize?: number;\n limit?: number;\n offset?: number;\n },\n): Promise<void> => {\n if (!options.name && !options.id) {\n logger.error(\"Either name or id must be provided\");\n return;\n }\n\n if (options.name && options.id) {\n logger.error(\"Only one of name or id must be provided\");\n return;\n }\n\n const client = new LaminarClient({\n projectApiKey: options.projectApiKey,\n baseUrl: options.baseUrl,\n port: options.port,\n });\n\n const identifier = options.name ? { name: options.name } : { id: options.id };\n\n try {\n const result = await pullAllData(\n client,\n identifier,\n options.batchSize ?? DEFAULT_DATASET_PULL_BATCH_SIZE,\n options.offset ?? 0,\n options.limit,\n );\n\n if (outputPath) {\n await writeToFile(outputPath, result, options.outputFormat);\n logger.info(`Successfully pulled ${result.length} data points to ${outputPath}`);\n } else {\n printToConsole(result, options.outputFormat ?? 'json');\n }\n } catch (error) {\n logger.error(\n `Failed to pull dataset: ${errorMessage(error)}`,\n );\n }\n};\n\n/**\n * Handle datasets create command.\n */\nexport const handleDatasetsCreate = async (\n name: string,\n paths: string[],\n options: DatasetCommandOptions & {\n outputFile: string;\n outputFormat?: 'json' | 'csv' | 'jsonl';\n recursive?: boolean;\n batchSize?: number;\n },\n): Promise<void> => {\n const client = new LaminarClient({\n projectApiKey: options.projectApiKey,\n baseUrl: options.baseUrl,\n port: options.port,\n });\n\n // Load data from input files\n const data = await loadFromPaths(paths, options.recursive);\n\n if (data.length === 0) {\n logger.warn(\"No data to push. Skipping\");\n return;\n }\n\n // Push data to create/populate the dataset\n logger.info(`Pushing ${data.length} data points to dataset '${name}'...`);\n\n try {\n await client.datasets.push({\n points: data,\n name,\n batchSize: options.batchSize ?? DEFAULT_DATASET_PUSH_BATCH_SIZE,\n createDataset: true,\n });\n logger.info(`Successfully pushed ${data.length} data points to dataset '${name}'`);\n } catch (error) {\n logger.error(\n `Failed to create dataset: ${errorMessage(error)}`,\n );\n return;\n }\n\n // Pull data back from the dataset\n logger.info(`Pulling data from dataset '${name}'...`);\n\n try {\n const result = await pullAllData(\n client,\n { name },\n options.batchSize ?? DEFAULT_DATASET_PULL_BATCH_SIZE,\n 0,\n undefined,\n );\n\n // Save to output file\n await writeToFile(options.outputFile, result, options.outputFormat);\n\n logger.info(\n `Successfully created dataset '${name}' `\n + `and saved ${result.length} datapoints to ${options.outputFile}`,\n );\n } catch (error) {\n logger.error(\n \"Failed to pull dataset after creation: \" + errorMessage(error),\n );\n }\n};\n\n","import * as esbuild from \"esbuild\";\nimport * as fs from \"fs\";\nimport * as glob from \"glob\";\n\nimport { Evaluation } from \"../evaluations\";\nimport { getDirname, initializeLogger } from \"../utils\";\n\nconst logger = initializeLogger();\n\n// esbuild plugin to skip dynamic imports\nconst createSkipDynamicImportsPlugin = (skipModules: string[]): esbuild.Plugin => ({\n name: 'skip-dynamic-imports',\n setup(build) {\n if (!skipModules || skipModules.length === 0) return;\n\n build.onResolve({ filter: /.*/ }, (args) => {\n // Only handle dynamic imports\n if (args.kind === 'dynamic-import' && skipModules.includes(args.path)) {\n logger.warn(`Skipping dynamic import: ${args.path}`);\n // Return a virtual module that exports an empty object\n return {\n path: args.path,\n namespace: 'lmnr-skip-dynamic-import',\n };\n }\n });\n\n // Provide empty module content for skipped dynamic imports\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n build.onLoad({ filter: /.*/, namespace: 'lmnr-skip-dynamic-import' }, (args) => ({\n contents: 'export default {};',\n loader: 'js',\n }));\n },\n});\n\nfunction loadModule({\n filename,\n moduleText,\n}: {\n filename: string;\n moduleText: string;\n}): Evaluation<any, any, any>[] {\n globalThis._evaluations = [];\n globalThis._set_global_evaluation = true;\n\n const __filename = filename;\n const __dirname = getDirname();\n\n // add some arguments for proper cjs/esm interop\n\n /* eslint-disable @typescript-eslint/no-implied-eval */\n new Function(\n \"require\",\n \"module\",\n \"__filename\",\n \"__dirname\",\n moduleText,\n )(\n require,\n module,\n __filename,\n __dirname,\n );\n /* eslint-enable @typescript-eslint/no-implied-eval */\n\n // Return the modified _evals global variable\n return globalThis._evaluations;\n}\n\nexport interface EvalCommandOptions {\n failOnError?: boolean;\n outputFile?: string;\n externalPackages?: string[];\n dynamicImportsToSkip?: string[];\n frontendPort?: number;\n}\n\nexport async function runEvaluation(\n files: string[],\n options: EvalCommandOptions,\n): Promise<void> {\n let evalFiles: string[];\n if (files && files.length > 0) {\n evalFiles = files.flatMap((file: string) => glob.sync(file));\n } else {\n // No files provided, use default pattern\n evalFiles = glob.sync('evals/**/*.eval.{ts,js}');\n }\n\n evalFiles.sort();\n\n if (evalFiles.length === 0) {\n logger.error(\"No evaluation files found. Please provide a file or \" +\n \"ensure there are eval files that are named like `*.eval.{ts,js}` in \" +\n \"the `evals` directory or its subdirectories.\");\n process.exit(1);\n }\n\n if (files.length === 0) {\n logger.info(`Located ${evalFiles.length} evaluation files in evals/`);\n } else {\n logger.info(`Running ${evalFiles.length} evaluation files.`);\n }\n\n const scores: {\n file: string,\n scores: Record<string, number>,\n url: string,\n evaluationId: string,\n }[] = [];\n\n for (const file of evalFiles) {\n logger.info(`Loading ${file}...`);\n const buildOptions = {\n bundle: true,\n platform: \"node\" as esbuild.Platform,\n entryPoints: [file],\n outfile: `tmp_out_${file}.js`,\n write: false, // will be loaded in memory as a temp file\n external: [\n \"@lmnr-ai/lmnr\",\n \"@lmnr-ai/lmnr/*\",\n \"@lmnr-ai/client\",\n \"@lmnr-ai/types\",\n \"esbuild\",\n \"fsevents\",\n \"playwright\",\n \"puppeteer\",\n \"puppeteer-core\",\n \"playwright-core\",\n ...(options.externalPackages ? options.externalPackages : []),\n ],\n plugins: [\n createSkipDynamicImportsPlugin(options.dynamicImportsToSkip || []),\n ],\n treeShaking: true,\n };\n\n const result = await esbuild.build(buildOptions);\n\n if (!result.outputFiles) {\n logger.error(\"Error when building: No output files found \" +\n \"it is likely that all eval files are not valid TypeScript or JavaScript files.\");\n if (options.failOnError) {\n process.exit(1);\n }\n continue;\n }\n\n const outputFileText = result.outputFiles[0].text;\n\n const evaluations = loadModule({\n filename: file,\n moduleText: outputFileText,\n });\n\n logger.info(`Loaded ${evaluations.length} evaluations from ${file}`);\n\n for (const evaluation of evaluations) {\n if (!evaluation?.run) {\n logger.error(`Evaluation ${file} does not properly call evaluate()`);\n if (options.failOnError) {\n process.exit(1);\n }\n continue;\n }\n\n if (options.frontendPort) {\n evaluation.setFrontendPort(options.frontendPort);\n }\n const evalResult = await evaluation.run();\n scores.push({\n file,\n scores: evalResult?.averageScores ?? {},\n url: evalResult?.url ?? '',\n evaluationId: evalResult?.evaluationId ?? '',\n });\n }\n }\n\n if (options.outputFile) {\n fs.writeFileSync(options.outputFile, JSON.stringify(scores, null, 2));\n }\n}\n\n","#!/usr/bin/env node\n\nimport { errorMessage } from \"@lmnr-ai/types\";\nimport { Command } from \"commander\";\n\nimport { version } from \"../../package.json\";\nimport { Evaluation } from \"../evaluations\";\nimport { initializeLogger } from \"../utils\";\nimport {\n handleDatasetsCreate,\n handleDatasetsList,\n handleDatasetsPull,\n handleDatasetsPush,\n} from \"./datasets\";\nimport { runEvaluation } from \"./evals\";\n\nconst logger = initializeLogger();\n\ndeclare global {\n var _evaluations: Evaluation<any, any, any>[] | undefined;\n var _set_global_evaluation: boolean;\n}\n\nasync function cli() {\n const program = new Command();\n\n program\n .name(\"lmnr\")\n .description(\"CLI for Laminar. Use `lmnr <subcommand> --help` for more information.\")\n .version(version, \"-v, --version\", \"display version number\");\n\n // Eval command\n program\n .command(\"eval\")\n .description(\"Run an evaluation\")\n .argument(\n \"[files...]\",\n \"A file or files containing the evaluation to run. If no file is provided, \" +\n \"the evaluation will run all `*.eval.ts|js` files in the `evals` directory. \" +\n \"If multiple files are provided, the evaluation will run each file in order.\",\n )\n .option(\n \"--fail-on-error\",\n \"Fail on error. If specified, will fail if encounters a file that cannot be run\",\n )\n .option(\n \"--output-file <file>\",\n \"Output file to write the results to. Outputs are written in JSON format.\",\n )\n .option(\n \"--external-packages <packages...>\",\n \"[ADVANCED] List of packages to pass as external to esbuild. This will not link \" +\n \"the packages directly into the eval file, but will instead require them at runtime. \" +\n \"Read more: https://esbuild.github.io/api/#external\",\n )\n .option(\n \"--dynamic-imports-to-skip <modules...>\",\n \"[ADVANCED] List of module names to skip when encountered as dynamic imports. \" +\n \"These dynamic imports will resolve to an empty module to prevent build failures. \" +\n \"This is meant to skip the imports that are not used in the evaluation itself.\",\n )\n .option(\n \"--frontend-port <port>\",\n \"Port for the Laminar frontend. Defaults to 5667\",\n (val) => parseInt(val, 10),\n )\n .action(async (files: string[], options) => {\n await runEvaluation(files, options);\n });\n\n const deprecatedDatasetsWarning =\n \"DeprecationWarning: `lmnr datasets` is deprecated and will be removed in a future version. \" +\n \"Use `lmnr-cli dataset` instead.\";\n\n // Datasets command with global options\n const datasetCmd = program\n .command(\"datasets\")\n .description(\"[DEPRECATED] Manage datasets. Use `lmnr-cli dataset` instead.\")\n .option(\n \"--project-api-key <key>\",\n \"Project API key. If not provided, reads from LMNR_PROJECT_API_KEY env variable\",\n )\n .option(\n \"--base-url <url>\",\n \"Base URL for the Laminar API. Defaults to https://api.lmnr.ai or LMNR_BASE_URL env variable\",\n )\n .option(\n \"--port <port>\",\n \"Port for the Laminar API. Defaults to 443\",\n (val) => parseInt(val, 10),\n );\n\n // Datasets list command\n datasetCmd\n .command(\"list\")\n .description(\"List all datasets\")\n .action(async (options, cmd) => {\n process.stderr.write(deprecatedDatasetsWarning + \"\\n\");\n const parentOpts = cmd.parent?.opts() || {};\n await handleDatasetsList({ ...parentOpts, ...options });\n });\n\n // Datasets push command\n datasetCmd\n .command(\"push\")\n .description(\"Push datapoints to an existing dataset\")\n .argument(\"<paths...>\", \"Paths to files or directories containing data to push\")\n .option(\"-n, --name <name>\", \"Name of the dataset (either name or id must be provided)\")\n .option(\"--id <id>\", \"ID of the dataset (either name or id must be provided)\")\n .option(\"-r, --recursive\", \"Recursively read files in directories\", false)\n .option(\n \"--batch-size <size>\",\n \"Batch size for pushing data\",\n (val) => parseInt(val, 10),\n 100,\n )\n .action(async (paths: string[], options, cmd) => {\n process.stderr.write(deprecatedDatasetsWarning + \"\\n\");\n const parentOpts = cmd.parent?.opts() || {};\n await handleDatasetsPush(paths, { ...parentOpts, ...options });\n });\n\n // Datasets pull command\n datasetCmd\n .command(\"pull\")\n .description(\"Pull data from a dataset\")\n .argument(\"[output-path]\", \"Path to save the data. If not provided, prints to console\")\n .option(\"-n, --name <name>\", \"Name of the dataset (either name or id must be provided)\")\n .option(\"--id <id>\", \"ID of the dataset (either name or id must be provided)\")\n .option(\n \"--output-format <format>\",\n \"Output format (json, csv, jsonl). Inferred from file extension if not provided\",\n )\n .option(\n \"--batch-size <size>\",\n \"Batch size for pulling data\",\n (val) => parseInt(val, 10),\n 100,\n )\n .option(\"--limit <limit>\", \"Limit number of datapoints to pull\", (val) => parseInt(val, 10))\n .option(\"--offset <offset>\", \"Offset for pagination\", (val) => parseInt(val, 10), 0)\n .action(async (outputPath: string | undefined, options, cmd) => {\n process.stderr.write(deprecatedDatasetsWarning + \"\\n\");\n const parentOpts = cmd.parent?.opts() || {};\n await handleDatasetsPull(outputPath, { ...parentOpts, ...options });\n });\n\n // Datasets create command\n datasetCmd\n .command(\"create\")\n .description(\"Create a dataset from input files\")\n .argument(\"<name>\", \"Name of the dataset to create\")\n .argument(\"<paths...>\", \"Paths to files or directories containing data to push\")\n .requiredOption(\"-o, --output-file <file>\", \"Path to save the pulled data\")\n .option(\n \"--output-format <format>\",\n \"Output format (json, csv, jsonl). Inferred from file extension if not provided\",\n )\n .option(\"-r, --recursive\", \"Recursively read files in directories\", false)\n .option(\n \"--batch-size <size>\",\n \"Batch size for pushing/pulling data\",\n (val) => parseInt(val, 10),\n 100,\n )\n .action(async (name: string, paths: string[], options, cmd) => {\n process.stderr.write(deprecatedDatasetsWarning + \"\\n\");\n const parentOpts = cmd.parent?.opts() || {};\n await handleDatasetsCreate(name, paths, { ...parentOpts, ...options });\n });\n\n // If no command provided, show help\n if (!process.argv.slice(2).length) {\n program.help();\n return;\n }\n\n await program.parseAsync();\n}\n\ncli().catch((err) => {\n logger.error(errorMessage(err));\n throw err;\n});\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli.mjs","names":["logger","logger"],"sources":["../src/cli/datasets.ts","../src/cli/evals.ts","../src/cli/index.ts"],"sourcesContent":["import { LaminarClient } from \"@lmnr-ai/client\";\nimport { errorMessage, type StringUUID } from \"@lmnr-ai/types\";\n\nimport { Datapoint } from \"../evaluations\";\nimport { initializeLogger } from \"../utils\";\nimport { loadFromPaths, printToConsole, writeToFile } from \"./file-utils\";\n\nconst logger = initializeLogger();\nconst DEFAULT_DATASET_PULL_BATCH_SIZE = 100;\nconst DEFAULT_DATASET_PUSH_BATCH_SIZE = 100;\n\ninterface DatasetCommandOptions {\n projectApiKey?: string;\n baseUrl?: string;\n port?: number;\n}\n\n/**\n * Pull all data from a dataset in batches.\n */\nconst pullAllData = async <D = any, T = any>(\n client: LaminarClient,\n identifier: { name?: string; id?: StringUUID },\n batchSize: number = DEFAULT_DATASET_PULL_BATCH_SIZE,\n offset: number = 0,\n limit?: number,\n): Promise<Datapoint<D, T>[]> => {\n let hasMore = true;\n let currentOffset = offset;\n const stopAt = limit !== undefined ? offset + limit : undefined;\n\n const result: Datapoint<D, T>[] = [];\n\n while (hasMore && (stopAt === undefined || currentOffset < stopAt)) {\n const data = await client.datasets.pull<D, T>({\n ...identifier,\n offset: currentOffset,\n limit: batchSize,\n });\n\n result.push(...data.items);\n\n // Stop if we received no items or fewer items than requested (end of data)\n if (data.items.length === 0 || data.items.length < batchSize) {\n hasMore = false;\n } else if (stopAt !== undefined && currentOffset + batchSize >= stopAt) {\n hasMore = false;\n } else if (data.totalCount !== undefined && currentOffset + batchSize >= data.totalCount) {\n hasMore = false;\n }\n\n currentOffset += batchSize;\n }\n\n if (limit !== undefined) {\n return result.slice(0, limit);\n }\n\n return result;\n};\n\n/**\n * Handle datasets list command.\n */\nexport const handleDatasetsList = async (\n options: DatasetCommandOptions,\n): Promise<void> => {\n const client = new LaminarClient({\n projectApiKey: options.projectApiKey,\n baseUrl: options.baseUrl,\n port: options.port,\n });\n\n try {\n const datasets = await client.datasets.listDatasets();\n\n if (datasets.length === 0) {\n console.log(\"No datasets found.\");\n return;\n }\n\n // Print table header\n const idWidth = 36; // UUID length\n const createdAtWidth = 19; // YYYY-MM-DD HH:MM:SS format\n\n console.log(`\\n${'ID'.padEnd(idWidth)} ${'Created At'.padEnd(createdAtWidth)} Name`);\n console.log(`${'-'.repeat(idWidth)} ${'-'.repeat(createdAtWidth)} ${'-'.repeat(20)}`);\n\n // Print each dataset row\n for (const dataset of datasets) {\n const createdAt = new Date(dataset.createdAt);\n const createdAtStr = createdAt.toISOString().replace('T', ' ').substring(0, 19);\n console.log(\n `${dataset.id.padEnd(idWidth)} ${createdAtStr.padEnd(createdAtWidth)} ${dataset.name}`,\n );\n }\n\n console.log(`\\nTotal: ${datasets.length} dataset(s)\\n`);\n } catch (error) {\n logger.error(\n `Failed to list datasets: ${errorMessage(error)}`,\n );\n }\n};\n\n/**\n * Handle datasets push command.\n */\nexport const handleDatasetsPush = async (\n paths: string[],\n options: DatasetCommandOptions & {\n name?: string;\n id?: StringUUID;\n recursive?: boolean;\n batchSize?: number;\n },\n): Promise<void> => {\n if (!options.name && !options.id) {\n logger.error(\"Either name or id must be provided\");\n return;\n }\n\n if (options.name && options.id) {\n logger.error(\"Only one of name or id must be provided\");\n return;\n }\n\n const client = new LaminarClient({\n projectApiKey: options.projectApiKey,\n baseUrl: options.baseUrl,\n port: options.port,\n });\n\n const data = await loadFromPaths(paths, options.recursive);\n\n if (data.length === 0) {\n logger.warn(\"No data to push. Skipping\");\n return;\n }\n\n const identifier = options.name ? { name: options.name } : { id: options.id };\n\n try {\n await client.datasets.push({\n points: data,\n ...identifier,\n batchSize: options.batchSize ?? DEFAULT_DATASET_PUSH_BATCH_SIZE,\n });\n logger.info(`Pushed ${data.length} data points to dataset ${options.name || options.id}`);\n } catch (error) {\n logger.error(\n `Failed to push dataset: ${errorMessage(error)}`,\n );\n }\n};\n\n/**\n * Handle datasets pull command.\n */\nexport const handleDatasetsPull = async (\n outputPath: string | undefined,\n options: DatasetCommandOptions & {\n name?: string;\n id?: StringUUID;\n outputFormat?: 'json' | 'csv' | 'jsonl';\n batchSize?: number;\n limit?: number;\n offset?: number;\n },\n): Promise<void> => {\n if (!options.name && !options.id) {\n logger.error(\"Either name or id must be provided\");\n return;\n }\n\n if (options.name && options.id) {\n logger.error(\"Only one of name or id must be provided\");\n return;\n }\n\n const client = new LaminarClient({\n projectApiKey: options.projectApiKey,\n baseUrl: options.baseUrl,\n port: options.port,\n });\n\n const identifier = options.name ? { name: options.name } : { id: options.id };\n\n try {\n const result = await pullAllData(\n client,\n identifier,\n options.batchSize ?? DEFAULT_DATASET_PULL_BATCH_SIZE,\n options.offset ?? 0,\n options.limit,\n );\n\n if (outputPath) {\n await writeToFile(outputPath, result, options.outputFormat);\n logger.info(`Successfully pulled ${result.length} data points to ${outputPath}`);\n } else {\n printToConsole(result, options.outputFormat ?? 'json');\n }\n } catch (error) {\n logger.error(\n `Failed to pull dataset: ${errorMessage(error)}`,\n );\n }\n};\n\n/**\n * Handle datasets create command.\n */\nexport const handleDatasetsCreate = async (\n name: string,\n paths: string[],\n options: DatasetCommandOptions & {\n outputFile: string;\n outputFormat?: 'json' | 'csv' | 'jsonl';\n recursive?: boolean;\n batchSize?: number;\n },\n): Promise<void> => {\n const client = new LaminarClient({\n projectApiKey: options.projectApiKey,\n baseUrl: options.baseUrl,\n port: options.port,\n });\n\n // Load data from input files\n const data = await loadFromPaths(paths, options.recursive);\n\n if (data.length === 0) {\n logger.warn(\"No data to push. Skipping\");\n return;\n }\n\n // Push data to create/populate the dataset\n logger.info(`Pushing ${data.length} data points to dataset '${name}'...`);\n\n try {\n await client.datasets.push({\n points: data,\n name,\n batchSize: options.batchSize ?? DEFAULT_DATASET_PUSH_BATCH_SIZE,\n createDataset: true,\n });\n logger.info(`Successfully pushed ${data.length} data points to dataset '${name}'`);\n } catch (error) {\n logger.error(\n `Failed to create dataset: ${errorMessage(error)}`,\n );\n return;\n }\n\n // Pull data back from the dataset\n logger.info(`Pulling data from dataset '${name}'...`);\n\n try {\n const result = await pullAllData(\n client,\n { name },\n options.batchSize ?? DEFAULT_DATASET_PULL_BATCH_SIZE,\n 0,\n undefined,\n );\n\n // Save to output file\n await writeToFile(options.outputFile, result, options.outputFormat);\n\n logger.info(\n `Successfully created dataset '${name}' `\n + `and saved ${result.length} datapoints to ${options.outputFile}`,\n );\n } catch (error) {\n logger.error(\n \"Failed to pull dataset after creation: \" + errorMessage(error),\n );\n }\n};\n\n","import * as esbuild from \"esbuild\";\nimport * as fs from \"fs\";\nimport * as glob from \"glob\";\n\nimport { Evaluation } from \"../evaluations\";\nimport { getDirname, initializeLogger } from \"../utils\";\n\nconst logger = initializeLogger();\n\n// esbuild plugin to skip dynamic imports\nconst createSkipDynamicImportsPlugin = (skipModules: string[]): esbuild.Plugin => ({\n name: 'skip-dynamic-imports',\n setup(build) {\n if (!skipModules || skipModules.length === 0) return;\n\n build.onResolve({ filter: /.*/ }, (args) => {\n // Only handle dynamic imports\n if (args.kind === 'dynamic-import' && skipModules.includes(args.path)) {\n logger.warn(`Skipping dynamic import: ${args.path}`);\n // Return a virtual module that exports an empty object\n return {\n path: args.path,\n namespace: 'lmnr-skip-dynamic-import',\n };\n }\n });\n\n // Provide empty module content for skipped dynamic imports\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n build.onLoad({ filter: /.*/, namespace: 'lmnr-skip-dynamic-import' }, (args) => ({\n contents: 'export default {};',\n loader: 'js',\n }));\n },\n});\n\nfunction loadModule({\n filename,\n moduleText,\n}: {\n filename: string;\n moduleText: string;\n}): Evaluation<any, any, any>[] {\n globalThis._evaluations = [];\n globalThis._set_global_evaluation = true;\n\n const __filename = filename;\n const __dirname = getDirname();\n\n // add some arguments for proper cjs/esm interop\n\n /* eslint-disable @typescript-eslint/no-implied-eval */\n new Function(\n \"require\",\n \"module\",\n \"__filename\",\n \"__dirname\",\n moduleText,\n )(\n require,\n module,\n __filename,\n __dirname,\n );\n /* eslint-enable @typescript-eslint/no-implied-eval */\n\n // Return the modified _evals global variable\n return globalThis._evaluations;\n}\n\nexport interface EvalCommandOptions {\n failOnError?: boolean;\n outputFile?: string;\n externalPackages?: string[];\n dynamicImportsToSkip?: string[];\n frontendPort?: number;\n}\n\nexport async function runEvaluation(\n files: string[],\n options: EvalCommandOptions,\n): Promise<void> {\n let evalFiles: string[];\n if (files && files.length > 0) {\n evalFiles = files.flatMap((file: string) => glob.sync(file));\n } else {\n // No files provided, use default pattern\n evalFiles = glob.sync('evals/**/*.eval.{ts,js}');\n }\n\n evalFiles.sort();\n\n if (evalFiles.length === 0) {\n logger.error(\"No evaluation files found. Please provide a file or \" +\n \"ensure there are eval files that are named like `*.eval.{ts,js}` in \" +\n \"the `evals` directory or its subdirectories.\");\n process.exit(1);\n }\n\n if (files.length === 0) {\n logger.info(`Located ${evalFiles.length} evaluation files in evals/`);\n } else {\n logger.info(`Running ${evalFiles.length} evaluation files.`);\n }\n\n const scores: {\n file: string,\n scores: Record<string, number>,\n url: string,\n evaluationId: string,\n }[] = [];\n\n for (const file of evalFiles) {\n logger.info(`Loading ${file}...`);\n const buildOptions = {\n bundle: true,\n platform: \"node\" as esbuild.Platform,\n entryPoints: [file],\n outfile: `tmp_out_${file}.js`,\n write: false, // will be loaded in memory as a temp file\n external: [\n \"@lmnr-ai/lmnr\",\n \"@lmnr-ai/lmnr/*\",\n \"@lmnr-ai/client\",\n \"@lmnr-ai/types\",\n \"esbuild\",\n \"fsevents\",\n \"playwright\",\n \"puppeteer\",\n \"puppeteer-core\",\n \"playwright-core\",\n ...(options.externalPackages ? options.externalPackages : []),\n ],\n plugins: [\n createSkipDynamicImportsPlugin(options.dynamicImportsToSkip || []),\n ],\n treeShaking: true,\n };\n\n const result = await esbuild.build(buildOptions);\n\n if (!result.outputFiles) {\n logger.error(\"Error when building: No output files found \" +\n \"it is likely that all eval files are not valid TypeScript or JavaScript files.\");\n if (options.failOnError) {\n process.exit(1);\n }\n continue;\n }\n\n const outputFileText = result.outputFiles[0].text;\n\n const evaluations = loadModule({\n filename: file,\n moduleText: outputFileText,\n });\n\n logger.info(`Loaded ${evaluations.length} evaluations from ${file}`);\n\n for (const evaluation of evaluations) {\n if (!evaluation?.run) {\n logger.error(`Evaluation ${file} does not properly call evaluate()`);\n if (options.failOnError) {\n process.exit(1);\n }\n continue;\n }\n\n if (options.frontendPort) {\n evaluation.setFrontendPort(options.frontendPort);\n }\n const evalResult = await evaluation.run();\n scores.push({\n file,\n scores: evalResult?.averageScores ?? {},\n url: evalResult?.url ?? '',\n evaluationId: evalResult?.evaluationId ?? '',\n });\n }\n }\n\n if (options.outputFile) {\n fs.writeFileSync(options.outputFile, JSON.stringify(scores, null, 2));\n }\n}\n\n","#!/usr/bin/env node\n\nimport { errorMessage } from \"@lmnr-ai/types\";\nimport { Command } from \"commander\";\n\nimport { version } from \"../../package.json\";\nimport { Evaluation } from \"../evaluations\";\nimport { initializeLogger } from \"../utils\";\nimport {\n handleDatasetsCreate,\n handleDatasetsList,\n handleDatasetsPull,\n handleDatasetsPush,\n} from \"./datasets\";\nimport { runEvaluation } from \"./evals\";\n\nconst logger = initializeLogger();\n\ndeclare global {\n var _evaluations: Evaluation<any, any, any>[] | undefined;\n var _set_global_evaluation: boolean;\n}\n\nasync function cli() {\n const program = new Command();\n\n program\n .name(\"lmnr\")\n .description(\"CLI for Laminar. Use `lmnr <subcommand> --help` for more information.\")\n .version(version, \"-v, --version\", \"display version number\");\n\n // Eval command\n program\n .command(\"eval\")\n .description(\"Run an evaluation\")\n .argument(\n \"[files...]\",\n \"A file or files containing the evaluation to run. If no file is provided, \" +\n \"the evaluation will run all `*.eval.ts|js` files in the `evals` directory. \" +\n \"If multiple files are provided, the evaluation will run each file in order.\",\n )\n .option(\n \"--fail-on-error\",\n \"Fail on error. If specified, will fail if encounters a file that cannot be run\",\n )\n .option(\n \"--output-file <file>\",\n \"Output file to write the results to. Outputs are written in JSON format.\",\n )\n .option(\n \"--external-packages <packages...>\",\n \"[ADVANCED] List of packages to pass as external to esbuild. This will not link \" +\n \"the packages directly into the eval file, but will instead require them at runtime. \" +\n \"Read more: https://esbuild.github.io/api/#external\",\n )\n .option(\n \"--dynamic-imports-to-skip <modules...>\",\n \"[ADVANCED] List of module names to skip when encountered as dynamic imports. \" +\n \"These dynamic imports will resolve to an empty module to prevent build failures. \" +\n \"This is meant to skip the imports that are not used in the evaluation itself.\",\n )\n .option(\n \"--frontend-port <port>\",\n \"Port for the Laminar frontend. Defaults to 5667\",\n (val) => parseInt(val, 10),\n )\n .action(async (files: string[], options) => {\n await runEvaluation(files, options);\n });\n\n const deprecatedDatasetsWarning =\n \"DeprecationWarning: `lmnr datasets` is deprecated and will be removed in a future version. \" +\n \"Use `lmnr-cli dataset` instead.\";\n\n // Datasets command with global options\n const datasetCmd = program\n .command(\"datasets\")\n .description(\"[DEPRECATED] Manage datasets. Use `lmnr-cli dataset` instead.\")\n .option(\n \"--project-api-key <key>\",\n \"Project API key. If not provided, reads from LMNR_PROJECT_API_KEY env variable\",\n )\n .option(\n \"--base-url <url>\",\n \"Base URL for the Laminar API. Defaults to https://api.lmnr.ai or LMNR_BASE_URL env variable\",\n )\n .option(\n \"--port <port>\",\n \"Port for the Laminar API. Defaults to 443\",\n (val) => parseInt(val, 10),\n );\n\n // Datasets list command\n datasetCmd\n .command(\"list\")\n .description(\"List all datasets\")\n .action(async (options, cmd) => {\n process.stderr.write(deprecatedDatasetsWarning + \"\\n\");\n const parentOpts = cmd.parent?.opts() || {};\n await handleDatasetsList({ ...parentOpts, ...options });\n });\n\n // Datasets push command\n datasetCmd\n .command(\"push\")\n .description(\"Push datapoints to an existing dataset\")\n .argument(\"<paths...>\", \"Paths to files or directories containing data to push\")\n .option(\"-n, --name <name>\", \"Name of the dataset (either name or id must be provided)\")\n .option(\"--id <id>\", \"ID of the dataset (either name or id must be provided)\")\n .option(\"-r, --recursive\", \"Recursively read files in directories\", false)\n .option(\n \"--batch-size <size>\",\n \"Batch size for pushing data\",\n (val) => parseInt(val, 10),\n 100,\n )\n .action(async (paths: string[], options, cmd) => {\n process.stderr.write(deprecatedDatasetsWarning + \"\\n\");\n const parentOpts = cmd.parent?.opts() || {};\n await handleDatasetsPush(paths, { ...parentOpts, ...options });\n });\n\n // Datasets pull command\n datasetCmd\n .command(\"pull\")\n .description(\"Pull data from a dataset\")\n .argument(\"[output-path]\", \"Path to save the data. If not provided, prints to console\")\n .option(\"-n, --name <name>\", \"Name of the dataset (either name or id must be provided)\")\n .option(\"--id <id>\", \"ID of the dataset (either name or id must be provided)\")\n .option(\n \"--output-format <format>\",\n \"Output format (json, csv, jsonl). Inferred from file extension if not provided\",\n )\n .option(\n \"--batch-size <size>\",\n \"Batch size for pulling data\",\n (val) => parseInt(val, 10),\n 100,\n )\n .option(\"--limit <limit>\", \"Limit number of datapoints to pull\", (val) => parseInt(val, 10))\n .option(\"--offset <offset>\", \"Offset for pagination\", (val) => parseInt(val, 10), 0)\n .action(async (outputPath: string | undefined, options, cmd) => {\n process.stderr.write(deprecatedDatasetsWarning + \"\\n\");\n const parentOpts = cmd.parent?.opts() || {};\n await handleDatasetsPull(outputPath, { ...parentOpts, ...options });\n });\n\n // Datasets create command\n datasetCmd\n .command(\"create\")\n .description(\"Create a dataset from input files\")\n .argument(\"<name>\", \"Name of the dataset to create\")\n .argument(\"<paths...>\", \"Paths to files or directories containing data to push\")\n .requiredOption(\"-o, --output-file <file>\", \"Path to save the pulled data\")\n .option(\n \"--output-format <format>\",\n \"Output format (json, csv, jsonl). Inferred from file extension if not provided\",\n )\n .option(\"-r, --recursive\", \"Recursively read files in directories\", false)\n .option(\n \"--batch-size <size>\",\n \"Batch size for pushing/pulling data\",\n (val) => parseInt(val, 10),\n 100,\n )\n .action(async (name: string, paths: string[], options, cmd) => {\n process.stderr.write(deprecatedDatasetsWarning + \"\\n\");\n const parentOpts = cmd.parent?.opts() || {};\n await handleDatasetsCreate(name, paths, { ...parentOpts, ...options });\n });\n\n // If no command provided, show help\n if (!process.argv.slice(2).length) {\n program.help();\n return;\n }\n\n await program.parseAsync();\n}\n\ncli().catch((err) => {\n logger.error(errorMessage(err));\n throw err;\n});\n\n"],"mappings":"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"}
@@ -9,4 +9,4 @@ const TRACEPARENT_HEADER = "traceparent";
9
9
  //#endregion
10
10
  export { TRACEPARENT_HEADER as n, LAMINAR_SPAN_CONTEXT_HEADER as t };
11
11
 
12
- //# sourceMappingURL=consts-ivIFfgfN.mjs.map
12
+ //# sourceMappingURL=consts-3AfXaMBI.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"consts-ivIFfgfN.mjs","names":[],"sources":["../src/opentelemetry-lib/instrumentation/temporal/consts.ts"],"sourcesContent":["/** Header key used to carry the serialized Laminar span context through Temporal. */\nexport const LAMINAR_SPAN_CONTEXT_HEADER = \"x-lmnr-span-context\";\n\n/**\n * W3C traceparent header key — written alongside `laminar-span-context` for\n * interop with non-Laminar clients/workers that understand W3C trace context.\n */\nexport const TRACEPARENT_HEADER = \"traceparent\";\n"],"mappings":";;AACA,MAAa,8BAA8B;;;;;AAM3C,MAAa,qBAAqB"}
1
+ {"version":3,"file":"consts-3AfXaMBI.mjs","names":[],"sources":["../src/opentelemetry-lib/instrumentation/temporal/consts.ts"],"sourcesContent":["/** Header key used to carry the serialized Laminar span context through Temporal. */\nexport const LAMINAR_SPAN_CONTEXT_HEADER = \"x-lmnr-span-context\";\n\n/**\n * W3C traceparent header key — written alongside `laminar-span-context` for\n * interop with non-Laminar clients/workers that understand W3C trace context.\n */\nexport const TRACEPARENT_HEADER = \"traceparent\";\n"],"mappings":";;AACA,MAAa,8BAA8B;;;;;AAM3C,MAAa,qBAAqB"}
@@ -20,4 +20,4 @@ Object.defineProperty(exports, "TRACEPARENT_HEADER", {
20
20
  }
21
21
  });
22
22
 
23
- //# sourceMappingURL=consts-Cx9iKRmq.cjs.map
23
+ //# sourceMappingURL=consts-DV6_Ea-8.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"consts-Cx9iKRmq.cjs","names":[],"sources":["../src/opentelemetry-lib/instrumentation/temporal/consts.ts"],"sourcesContent":["/** Header key used to carry the serialized Laminar span context through Temporal. */\nexport const LAMINAR_SPAN_CONTEXT_HEADER = \"x-lmnr-span-context\";\n\n/**\n * W3C traceparent header key — written alongside `laminar-span-context` for\n * interop with non-Laminar clients/workers that understand W3C trace context.\n */\nexport const TRACEPARENT_HEADER = \"traceparent\";\n"],"mappings":";;AACA,MAAa,8BAA8B;;;;;AAM3C,MAAa,qBAAqB"}
1
+ {"version":3,"file":"consts-DV6_Ea-8.cjs","names":[],"sources":["../src/opentelemetry-lib/instrumentation/temporal/consts.ts"],"sourcesContent":["/** Header key used to carry the serialized Laminar span context through Temporal. */\nexport const LAMINAR_SPAN_CONTEXT_HEADER = \"x-lmnr-span-context\";\n\n/**\n * W3C traceparent header key — written alongside `laminar-span-context` for\n * interop with non-Laminar clients/workers that understand W3C trace context.\n */\nexport const TRACEPARENT_HEADER = \"traceparent\";\n"],"mappings":";;AACA,MAAa,8BAA8B;;;;;AAM3C,MAAa,qBAAqB"}