@lmnr-ai/lmnr 0.8.54 → 0.8.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +2 -2
- package/dist/cli.d.cts +1 -1
- package/dist/cli.d.mts +1 -1
- package/dist/cli.mjs +2 -2
- package/dist/{evaluations-B9P6Cwtc.d.mts → evaluations-Bz4AjiEN.d.mts} +67 -16
- package/dist/{evaluations-DlkR2rgE.d.cts → evaluations-CAossFsy.d.cts} +67 -16
- package/dist/{file-utils-CX7M4l2B.cjs → file-utils-DvRb07ah.cjs} +2 -2
- package/dist/{file-utils-CX7M4l2B.cjs.map → file-utils-DvRb07ah.cjs.map} +1 -1
- package/dist/{file-utils-Fmv3u6xe.mjs → file-utils-qSiXXrPa.mjs} +2 -2
- package/dist/{file-utils-Fmv3u6xe.mjs.map → file-utils-qSiXXrPa.mjs.map} +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +2 -2
- package/dist/{utils-vPUG3osG.mjs → utils-B7IKRw5F.mjs} +117 -42
- package/dist/utils-B7IKRw5F.mjs.map +1 -0
- package/dist/{utils-B7tGH5vO.cjs → utils-C3QuhVGE.cjs} +117 -42
- package/dist/utils-C3QuhVGE.cjs.map +1 -0
- package/package.json +3 -3
- package/dist/utils-B7tGH5vO.cjs.map +0 -1
- package/dist/utils-vPUG3osG.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-utils-Fmv3u6xe.mjs","names":["csv","mkConfig","generateCsv","asString"],"sources":["../../../node_modules/.pnpm/csv-parser@3.2.1/node_modules/csv-parser/index.js","../../../node_modules/.pnpm/export-to-csv@1.4.0/node_modules/export-to-csv/output/index.js","../src/cli/file-utils.ts"],"sourcesContent":["const { Transform } = require('stream')\n\nconst [cr] = Buffer.from('\\r')\nconst [nl] = Buffer.from('\\n')\nconst defaults = {\n escape: '\"',\n headers: null,\n mapHeaders: ({ header }) => header,\n mapValues: ({ value }) => value,\n newline: '\\n',\n quote: '\"',\n raw: false,\n separator: ',',\n skipComments: false,\n skipLines: null,\n maxRowBytes: Number.MAX_SAFE_INTEGER,\n strict: false,\n outputByteOffset: false\n}\n\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\n\nfunction sanitizeHeader(header) {\n if (typeof header !== 'string') {\n return null\n }\n\n if (DANGEROUS_KEYS.has(header)) {\n return null\n }\n\n return header\n}\n\nclass CsvParser extends Transform {\n constructor (opts = {}) {\n super({ objectMode: true, highWaterMark: 16 })\n\n if (Array.isArray(opts)) opts = { headers: opts }\n\n const options = Object.assign({}, defaults, opts)\n\n options.customNewline = options.newline !== defaults.newline\n\n for (const key of ['newline', 'quote', 'separator']) {\n if (typeof options[key] !== 'undefined') {\n ([options[key]] = Buffer.from(options[key]))\n }\n }\n\n // if escape is not defined on the passed options, use the end value of quote\n options.escape = (opts || {}).escape ? Buffer.from(options.escape)[0] : options.quote\n\n this.state = {\n empty: options.raw ? Buffer.alloc(0) : '',\n escaped: false,\n first: true,\n lineNumber: 0,\n previousEnd: 0,\n rowLength: 0,\n quoted: false\n }\n\n this._prev = null\n\n if (options.headers === false) {\n // enforce, as the column length check will fail if headers:false\n options.strict = false\n }\n\n if (options.headers || options.headers === false) {\n this.state.first = false\n }\n\n this.options = options\n this.headers = options.headers\n this.bytesRead = 0\n }\n\n parseCell (buffer, start, end) {\n const { escape, quote } = this.options\n // remove quotes from quoted cells\n if (buffer[start] === quote && buffer[end - 1] === quote) {\n start++\n end--\n }\n\n let y = start\n\n for (let i = start; i < end; i++) {\n // check for escape characters and skip them\n if (buffer[i] === escape && i + 1 < end && buffer[i + 1] === quote) {\n i++\n }\n\n if (y !== i) {\n buffer[y] = buffer[i]\n }\n y++\n }\n\n return this.parseValue(buffer, start, y)\n }\n\n parseLine (buffer, start, end) {\n const { customNewline, escape, mapHeaders, mapValues, quote, separator, skipComments, skipLines } = this.options\n\n end-- // trim newline\n if (!customNewline && buffer.length && buffer[end - 1] === cr) {\n end--\n }\n\n const comma = separator\n const cells = []\n let isQuoted = false\n let offset = start\n\n if (skipComments) {\n const char = typeof skipComments === 'string' ? skipComments : '#'\n if (buffer[start] === Buffer.from(char)[0]) {\n return\n }\n }\n\n const mapValue = (value) => {\n if (this.state.first) {\n return value\n }\n\n const index = cells.length\n const header = this.headers[index]\n\n return mapValues({ header, index, value })\n }\n\n for (let i = start; i < end; i++) {\n const isStartingQuote = !isQuoted && buffer[i] === quote\n const isEndingQuote = isQuoted && buffer[i] === quote && i + 1 <= end && buffer[i + 1] === comma\n const isEscape = isQuoted && buffer[i] === escape && i + 1 < end && buffer[i + 1] === quote\n\n if (isStartingQuote || isEndingQuote) {\n isQuoted = !isQuoted\n continue\n } else if (isEscape) {\n i++\n continue\n }\n\n if (buffer[i] === comma && !isQuoted) {\n let value = this.parseCell(buffer, offset, i)\n value = mapValue(value)\n cells.push(value)\n offset = i + 1\n }\n }\n\n if (offset < end) {\n let value = this.parseCell(buffer, offset, end)\n value = mapValue(value)\n cells.push(value)\n }\n\n if (buffer[end - 1] === comma) {\n cells.push(mapValue(this.state.empty))\n }\n\n const skip = skipLines && skipLines > this.state.lineNumber\n this.state.lineNumber++\n\n if (this.state.first && !skip) {\n this.state.first = false\n this.headers = cells.map((header, index) => {\n const mapped = mapHeaders({ header, index })\n\n if (mapped === null) {\n return null\n }\n\n return sanitizeHeader(mapped)\n })\n\n this.emit('headers', this.headers)\n return\n }\n\n if (!skip && this.options.strict && cells.length !== this.headers.length) {\n const e = new RangeError('Row length does not match headers')\n this.emit('error', e)\n } else {\n if (!skip) {\n const byteOffset = this.bytesRead - buffer.length + start\n this.writeRow(cells, byteOffset)\n }\n }\n }\n\n parseValue (buffer, start, end) {\n if (this.options.raw) {\n return buffer.slice(start, end)\n }\n\n return buffer.toString('utf-8', start, end)\n }\n\n writeRow (cells, byteOffset) {\n const headers = (this.headers === false) ? cells.map((value, index) => index) : this.headers\n\n const row = cells.reduce((o, cell, index) => {\n const header = headers[index]\n if (header === null) return o // skip columns\n if (header !== undefined) {\n o[header] = cell\n } else {\n o[`_${index}`] = cell\n }\n return o\n }, {})\n\n if (this.options.outputByteOffset) {\n this.push({ row, byteOffset })\n } else {\n this.push(row)\n }\n }\n\n _flush (cb) {\n if (this.state.escaped || !this._prev) return cb()\n this.parseLine(this._prev, this.state.previousEnd, this._prev.length + 1) // plus since online -1s\n cb()\n }\n\n _transform (data, enc, cb) {\n if (typeof data === 'string') {\n data = Buffer.from(data)\n }\n\n const { escape, quote } = this.options\n let start = 0\n let buffer = data\n this.bytesRead += data.byteLength\n\n if (this._prev) {\n start = this._prev.length\n buffer = Buffer.concat([this._prev, data])\n this._prev = null\n }\n\n const bufferLength = buffer.length\n\n for (let i = start; i < bufferLength; i++) {\n const chr = buffer[i]\n const nextChr = i + 1 < bufferLength ? buffer[i + 1] : null\n\n this.state.rowLength++\n if (this.state.rowLength > this.options.maxRowBytes) {\n return cb(new Error('Row exceeds the maximum size'))\n }\n\n if (!this.state.escaped && chr === escape && nextChr === quote && i !== start) {\n this.state.escaped = true\n continue\n } else if (chr === quote) {\n if (this.state.escaped) {\n this.state.escaped = false\n // non-escaped quote (quoting the cell)\n } else {\n this.state.quoted = !this.state.quoted\n }\n continue\n }\n\n if (!this.state.quoted) {\n if (this.state.first && !this.options.customNewline) {\n if (chr === nl) {\n this.options.newline = nl\n } else if (chr === cr) {\n if (nextChr !== nl) {\n this.options.newline = cr\n }\n }\n }\n\n if (chr === this.options.newline) {\n this.parseLine(buffer, this.state.previousEnd, i + 1)\n this.state.previousEnd = i + 1\n this.state.rowLength = 0\n }\n }\n }\n\n if (this.state.previousEnd === bufferLength) {\n this.state.previousEnd = 0\n return cb()\n }\n\n if (bufferLength - this.state.previousEnd < data.length) {\n this._prev = data\n this.state.previousEnd -= (bufferLength - data.length)\n return cb()\n }\n\n this._prev = buffer\n cb()\n }\n}\n\nmodule.exports = (opts) => new CsvParser(opts)\n","var q;(function(x){x[\"csv\"]=\"text/csv\";x[\"tsv\"]=\"text/tab-separated-values\";x[\"plain\"]=\"text/plain\"})(q||(q={}));var X=(W)=>W,z=(W)=>W,Z=X,_=X,Y=X,N=X,V=X;var h={fieldSeparator:\",\",decimalSeparator:\".\",quoteStrings:!0,quoteCharacter:'\"',showTitle:!1,title:\"My Generated Report\",filename:\"generated\",showColumnHeaders:!0,useTextFile:!1,fileExtension:\"csv\",mediaType:q.csv,useBom:!0,columnHeaders:[],useKeysAsHeaders:!1,boolDisplay:{true:\"TRUE\",false:\"FALSE\"},replaceUndefinedWith:\"\"},F=\"\\r\\n\",R=\"\\uFEFF\",G=(W)=>Object.assign({},h,W);class K extends Error{constructor(W){super(W);this.name=\"CsvGenerationError\"}}class B extends Error{constructor(W){super(W);this.name=\"EmptyHeadersError\"}}class L extends Error{constructor(W){super(W);this.name=\"CsvDownloadEnvironmentError\"}}class P extends Error{constructor(W){super(W);this.name=\"UnsupportedDataFormatError\"}}var s=function(W,$){if($=='\"'&&W.indexOf('\"')>-1)return W.replace(/\"/g,'\"\"');return W},w=(W)=>typeof W===\"object\"?N(W.key):N(W),y=(W)=>typeof W===\"object\"?V(W.displayLabel):V(W),T=(W,...$)=>$.reduce((j,x)=>x(j),W),E=(W)=>($)=>W.useBom?_(z($)+R):$,M=(W)=>($)=>W.showTitle?S(_(z($)+W.title))(Y(\"\")):$,S=(W)=>($)=>_(z(W)+z($)+F),O=(W)=>($,j)=>l(W)(Y(z($)+z(j))),l=(W)=>($)=>X(z($)+W.fieldSeparator),b=(W,$)=>(j)=>{if(!W.showColumnHeaders)return j;if($.length<1)throw new B(\"Option to show headers but none supplied. Make sure there are keys in your collection or that you've supplied headers through the config options.\");let x=Y(\"\");for(let A=0;A<$.length;A++){const J=y($[A]);x=O(W)(x,v(W,z(J)))}return x=Y(z(x).slice(0,-1)),S(j)(x)},C=(W,$,j)=>(x)=>{let A=x;for(var J=0;J<j.length;J++){let I=Y(\"\");for(let U=0;U<$.length;U++){const H=w($[U]),D=j[J][z(H)];I=O(W)(I,v(W,D))}I=Y(z(I).slice(0,-1)),A=S(A)(I)}return A},k=z,m=(W)=>+W===W&&(!isFinite(W)||Boolean(W%1)),p=(W,$)=>{if(m($)){if(W.decimalSeparator===\"locale\")return Z($.toLocaleString());if(W.decimalSeparator)return Z($.toString().replace(\".\",W.decimalSeparator))}return Z($.toString())},Q=(W,$)=>{let j=$;if(W.quoteStrings||W.fieldSeparator&&$.indexOf(W.fieldSeparator)>-1||W.quoteCharacter&&$.indexOf(W.quoteCharacter)>-1||$.indexOf(\"\\n\")>-1||$.indexOf(\"\\r\")>-1)j=W.quoteCharacter+s($,W.quoteCharacter)+W.quoteCharacter;return Z(j)},g=(W,$)=>{const j=$?\"true\":\"false\";return Z(W.boolDisplay[j])},r=(W,$)=>{if(typeof $===\"undefined\"&&W.replaceUndefinedWith!==void 0)return Q(W,W.replaceUndefinedWith+\"\");if($===null)return Q(W,\"null\");return Q(W,\"\")},v=(W,$)=>{if(typeof $===\"number\")return p(W,$);if(typeof $===\"string\")return Q(W,$);if(typeof $===\"boolean\"&&W.boolDisplay)return g(W,$);if($===null||typeof $===\"undefined\")return r(W,$);throw new P(`\n typeof ${typeof $} isn't supported. Only number, string, boolean, null and undefined are supported.\n Please convert the data in your object to one of those before generating the CSV.\n `)};var BW=(W)=>($)=>{const j=G(W),x=j.useKeysAsHeaders?Object.keys($[0]):j.columnHeaders;let A=T(_(\"\"),E(j),M(j),b(j,x),C(j,x,$));if(z(A).length<1)throw new K(\"Output is empty. Is your data formatted correctly?\");return A},f=(W)=>($)=>{const j=G(W),x=z($),A=j.useTextFile?\"text/plain\":j.mediaType;return new Blob([x],{type:`${A};charset=utf8;`})},LW=(W)=>($)=>{if(!window)throw new L(\"Downloading only supported in a browser environment.\");const j=f(W)($),x=G(W),A=x.useTextFile?\"txt\":x.fileExtension,J=`${x.filename}.${A}`,I=document.createElement(\"a\");I.download=J,I.href=URL.createObjectURL(j),I.setAttribute(\"visibility\",\"hidden\"),document.body.appendChild(I),I.click(),document.body.removeChild(I)};export{G as mkConfig,BW as generateCsv,LW as download,k as asString,f as asBlob,q as MediaType};\n","import { errorMessage } from \"@lmnr-ai/types\";\nimport csv from \"csv-parser\";\nimport { asString, generateCsv, mkConfig } from \"export-to-csv\";\nimport { createReadStream } from \"fs\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nimport { Datapoint } from \"../evaluations\";\nimport { initializeLogger } from \"../utils\";\n\nconst logger = initializeLogger();\n\n/**\n * Check if a file has a supported extension.\n */\nconst isSupportedFile = (file: string): boolean => {\n const ext = path.extname(file).toLowerCase();\n return [\".json\", \".csv\", \".jsonl\"].includes(ext);\n};\n\n/**\n * Collect all supported files from the given paths.\n * Handles both files and directories.\n */\nexport const collectFiles = async (\n paths: string[],\n recursive: boolean = false,\n): Promise<string[]> => {\n const collectedFiles: string[] = [];\n\n for (const filepath of paths) {\n try {\n const stats = await fs.stat(filepath);\n\n if (stats.isFile()) {\n if (isSupportedFile(filepath)) {\n collectedFiles.push(filepath);\n } else {\n logger.warn(`Skipping unsupported file type: ${filepath}`);\n }\n } else if (stats.isDirectory()) {\n const entries = await fs.readdir(filepath);\n\n for (const entry of entries) {\n const fullPath = path.join(filepath, entry);\n const entryStats = await fs.stat(fullPath);\n\n if (entryStats.isFile() && isSupportedFile(fullPath)) {\n collectedFiles.push(fullPath);\n } else if (recursive && entryStats.isDirectory()) {\n const subFiles = await collectFiles([fullPath], true);\n collectedFiles.push(...subFiles);\n }\n }\n }\n } catch (error) {\n logger.warn(\n `Path does not exist or is not accessible: ${filepath}. ` +\n `Error: ${errorMessage(error)}`,\n );\n }\n }\n\n return collectedFiles;\n};\n\n/**\n * Read a JSON file and return its contents.\n */\nconst readJsonFile = async (filepath: string): Promise<any[]> => {\n const content = await fs.readFile(filepath, \"utf-8\");\n const parsed = JSON.parse(content);\n return Array.isArray(parsed) ? parsed : [parsed];\n};\n\n/**\n * Try to parse a string as JSON. If it fails, return the original string.\n */\nconst tryParseJson = (content: string): any => {\n // Don't try to parse if it's not a string or doesn't look like JSON\n if (typeof content !== \"string\") {\n return content;\n }\n\n // If it doesn't start with { or [, it's probably not JSON\n const trimmed = content.trim();\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) {\n return content;\n }\n\n try {\n return JSON.parse(content);\n } catch (error) {\n logger.debug(`Error parsing JSON: ${errorMessage(error)}`);\n return content;\n }\n};\n\n/**\n * Parse each field in a CSV row, attempting to convert JSON strings back to objects.\n */\nconst parseCsvRow = (row: Record<string, string>): any => {\n const parsed: any = {};\n for (const [key, value] of Object.entries(row)) {\n parsed[key] = tryParseJson(value);\n }\n return parsed;\n};\n\n/**\n * Read a CSV file and return its contents as an array of objects.\n */\nconst readCsvFile = async (filepath: string): Promise<any[]> =>\n new Promise((resolve, reject) => {\n const results: any[] = [];\n createReadStream(filepath)\n .pipe(csv())\n .on(\"data\", (data) => results.push(parseCsvRow(data)))\n .on(\"end\", () => resolve(results))\n .on(\"error\", reject);\n });\n\n/**\n * Read a JSONL file and return its contents as an array of objects.\n */\nasync function readJsonlFile(filepath: string): Promise<any[]> {\n const content = await fs.readFile(filepath, \"utf-8\");\n const lines = content.split(\"\\n\").filter((line) => line.trim());\n return lines.map((line) => JSON.parse(line));\n}\n\n/**\n * Read a single file and return its contents.\n */\nasync function readFile(filepath: string): Promise<any[]> {\n const ext = path.extname(filepath).toLowerCase();\n\n if (ext === \".json\") {\n return readJsonFile(filepath);\n } else if (ext === \".csv\") {\n return readCsvFile(filepath);\n } else if (ext === \".jsonl\") {\n return readJsonlFile(filepath);\n } else {\n throw new Error(`Unsupported file type: ${ext}`);\n }\n}\n\n/**\n * Load data from all files in the specified paths.\n */\nexport const loadFromPaths = async <D = any, T = any>(\n paths: string[],\n recursive: boolean = false,\n): Promise<Datapoint<D, T>[]> => {\n const files = await collectFiles(paths, recursive);\n\n if (files.length === 0) {\n logger.warn(\"No supported files found in the specified paths\");\n return [];\n }\n\n logger.info(`Found ${files.length} file(s) to read`);\n\n const result: Datapoint<D, T>[] = [];\n\n for (const file of files) {\n try {\n const data = await readFile(file);\n result.push(...data);\n logger.info(`Read ${data.length} record(s) from ${file}`);\n } catch (error) {\n logger.error(`Error reading file ${file}: ${errorMessage(error)}`);\n throw error;\n }\n }\n\n return result;\n};\n\n/**\n * Write data to a JSON file.\n */\nconst writeJsonFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n const content = JSON.stringify(data, null, 2);\n await fs.writeFile(filepath, content, \"utf-8\");\n};\n\n/**\n * Write data to a CSV file.\n */\nconst writeCsvFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n if (data.length === 0) {\n throw new Error(\"No data to write to CSV\");\n }\n\n const formattedData = data.map((item) =>\n Object.fromEntries(\n Object.entries(item).map(([key, value]) => [key, stringifyForCsv(value)]),\n ),\n );\n\n const csvConfig = mkConfig({ useKeysAsHeaders: true });\n\n const csvOutput = generateCsv(csvConfig)(formattedData);\n const csvString = asString(csvOutput);\n\n await fs.writeFile(filepath, csvString, \"utf-8\");\n};\n\n/**\n * Write data to a JSONL file.\n */\nconst writeJsonlFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n const lines = data.map((item) => JSON.stringify(item)).join(\"\\n\");\n await fs.writeFile(filepath, lines + \"\\n\", \"utf-8\");\n};\n\n/**\n * Write data to a file based on the file extension.\n */\nexport const writeToFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n format?: \"json\" | \"csv\" | \"jsonl\",\n): Promise<void> => {\n // Create parent directories if they don't exist\n const dir = path.dirname(filepath);\n await fs.mkdir(dir, { recursive: true });\n\n // Determine the format\n const ext = format ?? path.extname(filepath).slice(1);\n\n if (format && format !== path.extname(filepath).slice(1)) {\n logger.warn(\n `Output format ${format} does not match file extension ${path.extname(filepath).slice(1)}`,\n );\n }\n\n if (ext === \"json\") {\n await writeJsonFile(filepath, data);\n } else if (ext === \"csv\") {\n await writeCsvFile(filepath, data);\n } else if (ext === \"jsonl\") {\n await writeJsonlFile(filepath, data);\n } else {\n throw new Error(`Unsupported output format: ${ext}`);\n }\n};\n\n/**\n * Convert a value to a CSV-safe string.\n * - Strings and numbers pass through\n * - null/undefined become empty strings\n * - Objects and arrays are stringified to JSON\n */\nconst stringifyForCsv = (value: any): string => {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n // For objects and arrays, stringify to JSON\n return JSON.stringify(value);\n};\n\n/**\n * Print data to console in the specified format.\n */\nexport const printToConsole = <D, T>(\n data: Datapoint<D, T>[],\n format: \"json\" | \"csv\" | \"jsonl\" = \"json\",\n) => {\n if (format === \"json\") {\n console.log(JSON.stringify(data, null, 2));\n } else if (format === \"csv\") {\n if (data.length === 0) {\n logger.error(\"No data to print\");\n return;\n }\n\n const formattedData = data.map((item) =>\n Object.fromEntries(\n Object.entries(item).map(([key, value]) => [\n key,\n stringifyForCsv(value),\n ]),\n ),\n );\n\n const csvConfig = mkConfig({ useKeysAsHeaders: true });\n\n const csvOutput = generateCsv(csvConfig)(formattedData);\n const csvString = asString(csvOutput);\n console.log(csvString);\n } else if (format === \"jsonl\") {\n data.forEach((item) => console.log(JSON.stringify(item)));\n } else {\n throw new Error(\n `Unsupported output format: ${String(format)}. ` +\n \"(supported formats: json, csv, jsonl)\",\n );\n }\n};\n"],"ignoreList":[0,1],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file-utils-qSiXXrPa.mjs","names":["csv","mkConfig","generateCsv","asString"],"sources":["../../../node_modules/.pnpm/csv-parser@3.2.1/node_modules/csv-parser/index.js","../../../node_modules/.pnpm/export-to-csv@1.4.0/node_modules/export-to-csv/output/index.js","../src/cli/file-utils.ts"],"sourcesContent":["const { Transform } = require('stream')\n\nconst [cr] = Buffer.from('\\r')\nconst [nl] = Buffer.from('\\n')\nconst defaults = {\n escape: '\"',\n headers: null,\n mapHeaders: ({ header }) => header,\n mapValues: ({ value }) => value,\n newline: '\\n',\n quote: '\"',\n raw: false,\n separator: ',',\n skipComments: false,\n skipLines: null,\n maxRowBytes: Number.MAX_SAFE_INTEGER,\n strict: false,\n outputByteOffset: false\n}\n\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\n\nfunction sanitizeHeader(header) {\n if (typeof header !== 'string') {\n return null\n }\n\n if (DANGEROUS_KEYS.has(header)) {\n return null\n }\n\n return header\n}\n\nclass CsvParser extends Transform {\n constructor (opts = {}) {\n super({ objectMode: true, highWaterMark: 16 })\n\n if (Array.isArray(opts)) opts = { headers: opts }\n\n const options = Object.assign({}, defaults, opts)\n\n options.customNewline = options.newline !== defaults.newline\n\n for (const key of ['newline', 'quote', 'separator']) {\n if (typeof options[key] !== 'undefined') {\n ([options[key]] = Buffer.from(options[key]))\n }\n }\n\n // if escape is not defined on the passed options, use the end value of quote\n options.escape = (opts || {}).escape ? Buffer.from(options.escape)[0] : options.quote\n\n this.state = {\n empty: options.raw ? Buffer.alloc(0) : '',\n escaped: false,\n first: true,\n lineNumber: 0,\n previousEnd: 0,\n rowLength: 0,\n quoted: false\n }\n\n this._prev = null\n\n if (options.headers === false) {\n // enforce, as the column length check will fail if headers:false\n options.strict = false\n }\n\n if (options.headers || options.headers === false) {\n this.state.first = false\n }\n\n this.options = options\n this.headers = options.headers\n this.bytesRead = 0\n }\n\n parseCell (buffer, start, end) {\n const { escape, quote } = this.options\n // remove quotes from quoted cells\n if (buffer[start] === quote && buffer[end - 1] === quote) {\n start++\n end--\n }\n\n let y = start\n\n for (let i = start; i < end; i++) {\n // check for escape characters and skip them\n if (buffer[i] === escape && i + 1 < end && buffer[i + 1] === quote) {\n i++\n }\n\n if (y !== i) {\n buffer[y] = buffer[i]\n }\n y++\n }\n\n return this.parseValue(buffer, start, y)\n }\n\n parseLine (buffer, start, end) {\n const { customNewline, escape, mapHeaders, mapValues, quote, separator, skipComments, skipLines } = this.options\n\n end-- // trim newline\n if (!customNewline && buffer.length && buffer[end - 1] === cr) {\n end--\n }\n\n const comma = separator\n const cells = []\n let isQuoted = false\n let offset = start\n\n if (skipComments) {\n const char = typeof skipComments === 'string' ? skipComments : '#'\n if (buffer[start] === Buffer.from(char)[0]) {\n return\n }\n }\n\n const mapValue = (value) => {\n if (this.state.first) {\n return value\n }\n\n const index = cells.length\n const header = this.headers[index]\n\n return mapValues({ header, index, value })\n }\n\n for (let i = start; i < end; i++) {\n const isStartingQuote = !isQuoted && buffer[i] === quote\n const isEndingQuote = isQuoted && buffer[i] === quote && i + 1 <= end && buffer[i + 1] === comma\n const isEscape = isQuoted && buffer[i] === escape && i + 1 < end && buffer[i + 1] === quote\n\n if (isStartingQuote || isEndingQuote) {\n isQuoted = !isQuoted\n continue\n } else if (isEscape) {\n i++\n continue\n }\n\n if (buffer[i] === comma && !isQuoted) {\n let value = this.parseCell(buffer, offset, i)\n value = mapValue(value)\n cells.push(value)\n offset = i + 1\n }\n }\n\n if (offset < end) {\n let value = this.parseCell(buffer, offset, end)\n value = mapValue(value)\n cells.push(value)\n }\n\n if (buffer[end - 1] === comma) {\n cells.push(mapValue(this.state.empty))\n }\n\n const skip = skipLines && skipLines > this.state.lineNumber\n this.state.lineNumber++\n\n if (this.state.first && !skip) {\n this.state.first = false\n this.headers = cells.map((header, index) => {\n const mapped = mapHeaders({ header, index })\n\n if (mapped === null) {\n return null\n }\n\n return sanitizeHeader(mapped)\n })\n\n this.emit('headers', this.headers)\n return\n }\n\n if (!skip && this.options.strict && cells.length !== this.headers.length) {\n const e = new RangeError('Row length does not match headers')\n this.emit('error', e)\n } else {\n if (!skip) {\n const byteOffset = this.bytesRead - buffer.length + start\n this.writeRow(cells, byteOffset)\n }\n }\n }\n\n parseValue (buffer, start, end) {\n if (this.options.raw) {\n return buffer.slice(start, end)\n }\n\n return buffer.toString('utf-8', start, end)\n }\n\n writeRow (cells, byteOffset) {\n const headers = (this.headers === false) ? cells.map((value, index) => index) : this.headers\n\n const row = cells.reduce((o, cell, index) => {\n const header = headers[index]\n if (header === null) return o // skip columns\n if (header !== undefined) {\n o[header] = cell\n } else {\n o[`_${index}`] = cell\n }\n return o\n }, {})\n\n if (this.options.outputByteOffset) {\n this.push({ row, byteOffset })\n } else {\n this.push(row)\n }\n }\n\n _flush (cb) {\n if (this.state.escaped || !this._prev) return cb()\n this.parseLine(this._prev, this.state.previousEnd, this._prev.length + 1) // plus since online -1s\n cb()\n }\n\n _transform (data, enc, cb) {\n if (typeof data === 'string') {\n data = Buffer.from(data)\n }\n\n const { escape, quote } = this.options\n let start = 0\n let buffer = data\n this.bytesRead += data.byteLength\n\n if (this._prev) {\n start = this._prev.length\n buffer = Buffer.concat([this._prev, data])\n this._prev = null\n }\n\n const bufferLength = buffer.length\n\n for (let i = start; i < bufferLength; i++) {\n const chr = buffer[i]\n const nextChr = i + 1 < bufferLength ? buffer[i + 1] : null\n\n this.state.rowLength++\n if (this.state.rowLength > this.options.maxRowBytes) {\n return cb(new Error('Row exceeds the maximum size'))\n }\n\n if (!this.state.escaped && chr === escape && nextChr === quote && i !== start) {\n this.state.escaped = true\n continue\n } else if (chr === quote) {\n if (this.state.escaped) {\n this.state.escaped = false\n // non-escaped quote (quoting the cell)\n } else {\n this.state.quoted = !this.state.quoted\n }\n continue\n }\n\n if (!this.state.quoted) {\n if (this.state.first && !this.options.customNewline) {\n if (chr === nl) {\n this.options.newline = nl\n } else if (chr === cr) {\n if (nextChr !== nl) {\n this.options.newline = cr\n }\n }\n }\n\n if (chr === this.options.newline) {\n this.parseLine(buffer, this.state.previousEnd, i + 1)\n this.state.previousEnd = i + 1\n this.state.rowLength = 0\n }\n }\n }\n\n if (this.state.previousEnd === bufferLength) {\n this.state.previousEnd = 0\n return cb()\n }\n\n if (bufferLength - this.state.previousEnd < data.length) {\n this._prev = data\n this.state.previousEnd -= (bufferLength - data.length)\n return cb()\n }\n\n this._prev = buffer\n cb()\n }\n}\n\nmodule.exports = (opts) => new CsvParser(opts)\n","var q;(function(x){x[\"csv\"]=\"text/csv\";x[\"tsv\"]=\"text/tab-separated-values\";x[\"plain\"]=\"text/plain\"})(q||(q={}));var X=(W)=>W,z=(W)=>W,Z=X,_=X,Y=X,N=X,V=X;var h={fieldSeparator:\",\",decimalSeparator:\".\",quoteStrings:!0,quoteCharacter:'\"',showTitle:!1,title:\"My Generated Report\",filename:\"generated\",showColumnHeaders:!0,useTextFile:!1,fileExtension:\"csv\",mediaType:q.csv,useBom:!0,columnHeaders:[],useKeysAsHeaders:!1,boolDisplay:{true:\"TRUE\",false:\"FALSE\"},replaceUndefinedWith:\"\"},F=\"\\r\\n\",R=\"\\uFEFF\",G=(W)=>Object.assign({},h,W);class K extends Error{constructor(W){super(W);this.name=\"CsvGenerationError\"}}class B extends Error{constructor(W){super(W);this.name=\"EmptyHeadersError\"}}class L extends Error{constructor(W){super(W);this.name=\"CsvDownloadEnvironmentError\"}}class P extends Error{constructor(W){super(W);this.name=\"UnsupportedDataFormatError\"}}var s=function(W,$){if($=='\"'&&W.indexOf('\"')>-1)return W.replace(/\"/g,'\"\"');return W},w=(W)=>typeof W===\"object\"?N(W.key):N(W),y=(W)=>typeof W===\"object\"?V(W.displayLabel):V(W),T=(W,...$)=>$.reduce((j,x)=>x(j),W),E=(W)=>($)=>W.useBom?_(z($)+R):$,M=(W)=>($)=>W.showTitle?S(_(z($)+W.title))(Y(\"\")):$,S=(W)=>($)=>_(z(W)+z($)+F),O=(W)=>($,j)=>l(W)(Y(z($)+z(j))),l=(W)=>($)=>X(z($)+W.fieldSeparator),b=(W,$)=>(j)=>{if(!W.showColumnHeaders)return j;if($.length<1)throw new B(\"Option to show headers but none supplied. Make sure there are keys in your collection or that you've supplied headers through the config options.\");let x=Y(\"\");for(let A=0;A<$.length;A++){const J=y($[A]);x=O(W)(x,v(W,z(J)))}return x=Y(z(x).slice(0,-1)),S(j)(x)},C=(W,$,j)=>(x)=>{let A=x;for(var J=0;J<j.length;J++){let I=Y(\"\");for(let U=0;U<$.length;U++){const H=w($[U]),D=j[J][z(H)];I=O(W)(I,v(W,D))}I=Y(z(I).slice(0,-1)),A=S(A)(I)}return A},k=z,m=(W)=>+W===W&&(!isFinite(W)||Boolean(W%1)),p=(W,$)=>{if(m($)){if(W.decimalSeparator===\"locale\")return Z($.toLocaleString());if(W.decimalSeparator)return Z($.toString().replace(\".\",W.decimalSeparator))}return Z($.toString())},Q=(W,$)=>{let j=$;if(W.quoteStrings||W.fieldSeparator&&$.indexOf(W.fieldSeparator)>-1||W.quoteCharacter&&$.indexOf(W.quoteCharacter)>-1||$.indexOf(\"\\n\")>-1||$.indexOf(\"\\r\")>-1)j=W.quoteCharacter+s($,W.quoteCharacter)+W.quoteCharacter;return Z(j)},g=(W,$)=>{const j=$?\"true\":\"false\";return Z(W.boolDisplay[j])},r=(W,$)=>{if(typeof $===\"undefined\"&&W.replaceUndefinedWith!==void 0)return Q(W,W.replaceUndefinedWith+\"\");if($===null)return Q(W,\"null\");return Q(W,\"\")},v=(W,$)=>{if(typeof $===\"number\")return p(W,$);if(typeof $===\"string\")return Q(W,$);if(typeof $===\"boolean\"&&W.boolDisplay)return g(W,$);if($===null||typeof $===\"undefined\")return r(W,$);throw new P(`\n typeof ${typeof $} isn't supported. Only number, string, boolean, null and undefined are supported.\n Please convert the data in your object to one of those before generating the CSV.\n `)};var BW=(W)=>($)=>{const j=G(W),x=j.useKeysAsHeaders?Object.keys($[0]):j.columnHeaders;let A=T(_(\"\"),E(j),M(j),b(j,x),C(j,x,$));if(z(A).length<1)throw new K(\"Output is empty. Is your data formatted correctly?\");return A},f=(W)=>($)=>{const j=G(W),x=z($),A=j.useTextFile?\"text/plain\":j.mediaType;return new Blob([x],{type:`${A};charset=utf8;`})},LW=(W)=>($)=>{if(!window)throw new L(\"Downloading only supported in a browser environment.\");const j=f(W)($),x=G(W),A=x.useTextFile?\"txt\":x.fileExtension,J=`${x.filename}.${A}`,I=document.createElement(\"a\");I.download=J,I.href=URL.createObjectURL(j),I.setAttribute(\"visibility\",\"hidden\"),document.body.appendChild(I),I.click(),document.body.removeChild(I)};export{G as mkConfig,BW as generateCsv,LW as download,k as asString,f as asBlob,q as MediaType};\n","import { errorMessage } from \"@lmnr-ai/types\";\nimport csv from \"csv-parser\";\nimport { asString, generateCsv, mkConfig } from \"export-to-csv\";\nimport { createReadStream } from \"fs\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nimport { Datapoint } from \"../evaluations\";\nimport { initializeLogger } from \"../utils\";\n\nconst logger = initializeLogger();\n\n/**\n * Check if a file has a supported extension.\n */\nconst isSupportedFile = (file: string): boolean => {\n const ext = path.extname(file).toLowerCase();\n return [\".json\", \".csv\", \".jsonl\"].includes(ext);\n};\n\n/**\n * Collect all supported files from the given paths.\n * Handles both files and directories.\n */\nexport const collectFiles = async (\n paths: string[],\n recursive: boolean = false,\n): Promise<string[]> => {\n const collectedFiles: string[] = [];\n\n for (const filepath of paths) {\n try {\n const stats = await fs.stat(filepath);\n\n if (stats.isFile()) {\n if (isSupportedFile(filepath)) {\n collectedFiles.push(filepath);\n } else {\n logger.warn(`Skipping unsupported file type: ${filepath}`);\n }\n } else if (stats.isDirectory()) {\n const entries = await fs.readdir(filepath);\n\n for (const entry of entries) {\n const fullPath = path.join(filepath, entry);\n const entryStats = await fs.stat(fullPath);\n\n if (entryStats.isFile() && isSupportedFile(fullPath)) {\n collectedFiles.push(fullPath);\n } else if (recursive && entryStats.isDirectory()) {\n const subFiles = await collectFiles([fullPath], true);\n collectedFiles.push(...subFiles);\n }\n }\n }\n } catch (error) {\n logger.warn(\n `Path does not exist or is not accessible: ${filepath}. ` +\n `Error: ${errorMessage(error)}`,\n );\n }\n }\n\n return collectedFiles;\n};\n\n/**\n * Read a JSON file and return its contents.\n */\nconst readJsonFile = async (filepath: string): Promise<any[]> => {\n const content = await fs.readFile(filepath, \"utf-8\");\n const parsed = JSON.parse(content);\n return Array.isArray(parsed) ? parsed : [parsed];\n};\n\n/**\n * Try to parse a string as JSON. If it fails, return the original string.\n */\nconst tryParseJson = (content: string): any => {\n // Don't try to parse if it's not a string or doesn't look like JSON\n if (typeof content !== \"string\") {\n return content;\n }\n\n // If it doesn't start with { or [, it's probably not JSON\n const trimmed = content.trim();\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) {\n return content;\n }\n\n try {\n return JSON.parse(content);\n } catch (error) {\n logger.debug(`Error parsing JSON: ${errorMessage(error)}`);\n return content;\n }\n};\n\n/**\n * Parse each field in a CSV row, attempting to convert JSON strings back to objects.\n */\nconst parseCsvRow = (row: Record<string, string>): any => {\n const parsed: any = {};\n for (const [key, value] of Object.entries(row)) {\n parsed[key] = tryParseJson(value);\n }\n return parsed;\n};\n\n/**\n * Read a CSV file and return its contents as an array of objects.\n */\nconst readCsvFile = async (filepath: string): Promise<any[]> =>\n new Promise((resolve, reject) => {\n const results: any[] = [];\n createReadStream(filepath)\n .pipe(csv())\n .on(\"data\", (data) => results.push(parseCsvRow(data)))\n .on(\"end\", () => resolve(results))\n .on(\"error\", reject);\n });\n\n/**\n * Read a JSONL file and return its contents as an array of objects.\n */\nasync function readJsonlFile(filepath: string): Promise<any[]> {\n const content = await fs.readFile(filepath, \"utf-8\");\n const lines = content.split(\"\\n\").filter((line) => line.trim());\n return lines.map((line) => JSON.parse(line));\n}\n\n/**\n * Read a single file and return its contents.\n */\nasync function readFile(filepath: string): Promise<any[]> {\n const ext = path.extname(filepath).toLowerCase();\n\n if (ext === \".json\") {\n return readJsonFile(filepath);\n } else if (ext === \".csv\") {\n return readCsvFile(filepath);\n } else if (ext === \".jsonl\") {\n return readJsonlFile(filepath);\n } else {\n throw new Error(`Unsupported file type: ${ext}`);\n }\n}\n\n/**\n * Load data from all files in the specified paths.\n */\nexport const loadFromPaths = async <D = any, T = any>(\n paths: string[],\n recursive: boolean = false,\n): Promise<Datapoint<D, T>[]> => {\n const files = await collectFiles(paths, recursive);\n\n if (files.length === 0) {\n logger.warn(\"No supported files found in the specified paths\");\n return [];\n }\n\n logger.info(`Found ${files.length} file(s) to read`);\n\n const result: Datapoint<D, T>[] = [];\n\n for (const file of files) {\n try {\n const data = await readFile(file);\n result.push(...data);\n logger.info(`Read ${data.length} record(s) from ${file}`);\n } catch (error) {\n logger.error(`Error reading file ${file}: ${errorMessage(error)}`);\n throw error;\n }\n }\n\n return result;\n};\n\n/**\n * Write data to a JSON file.\n */\nconst writeJsonFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n const content = JSON.stringify(data, null, 2);\n await fs.writeFile(filepath, content, \"utf-8\");\n};\n\n/**\n * Write data to a CSV file.\n */\nconst writeCsvFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n if (data.length === 0) {\n throw new Error(\"No data to write to CSV\");\n }\n\n const formattedData = data.map((item) =>\n Object.fromEntries(\n Object.entries(item).map(([key, value]) => [key, stringifyForCsv(value)]),\n ),\n );\n\n const csvConfig = mkConfig({ useKeysAsHeaders: true });\n\n const csvOutput = generateCsv(csvConfig)(formattedData);\n const csvString = asString(csvOutput);\n\n await fs.writeFile(filepath, csvString, \"utf-8\");\n};\n\n/**\n * Write data to a JSONL file.\n */\nconst writeJsonlFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n const lines = data.map((item) => JSON.stringify(item)).join(\"\\n\");\n await fs.writeFile(filepath, lines + \"\\n\", \"utf-8\");\n};\n\n/**\n * Write data to a file based on the file extension.\n */\nexport const writeToFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n format?: \"json\" | \"csv\" | \"jsonl\",\n): Promise<void> => {\n // Create parent directories if they don't exist\n const dir = path.dirname(filepath);\n await fs.mkdir(dir, { recursive: true });\n\n // Determine the format\n const ext = format ?? path.extname(filepath).slice(1);\n\n if (format && format !== path.extname(filepath).slice(1)) {\n logger.warn(\n `Output format ${format} does not match file extension ${path.extname(filepath).slice(1)}`,\n );\n }\n\n if (ext === \"json\") {\n await writeJsonFile(filepath, data);\n } else if (ext === \"csv\") {\n await writeCsvFile(filepath, data);\n } else if (ext === \"jsonl\") {\n await writeJsonlFile(filepath, data);\n } else {\n throw new Error(`Unsupported output format: ${ext}`);\n }\n};\n\n/**\n * Convert a value to a CSV-safe string.\n * - Strings and numbers pass through\n * - null/undefined become empty strings\n * - Objects and arrays are stringified to JSON\n */\nconst stringifyForCsv = (value: any): string => {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n // For objects and arrays, stringify to JSON\n return JSON.stringify(value);\n};\n\n/**\n * Print data to console in the specified format.\n */\nexport const printToConsole = <D, T>(\n data: Datapoint<D, T>[],\n format: \"json\" | \"csv\" | \"jsonl\" = \"json\",\n) => {\n if (format === \"json\") {\n console.log(JSON.stringify(data, null, 2));\n } else if (format === \"csv\") {\n if (data.length === 0) {\n logger.error(\"No data to print\");\n return;\n }\n\n const formattedData = data.map((item) =>\n Object.fromEntries(\n Object.entries(item).map(([key, value]) => [\n key,\n stringifyForCsv(value),\n ]),\n ),\n );\n\n const csvConfig = mkConfig({ useKeysAsHeaders: true });\n\n const csvOutput = generateCsv(csvConfig)(formattedData);\n const csvString = asString(csvOutput);\n console.log(csvString);\n } else if (format === \"jsonl\") {\n data.forEach((item) => console.log(JSON.stringify(item)));\n } else {\n throw new Error(\n `Unsupported output format: ${String(format)}. ` +\n \"(supported formats: json, csv, jsonl)\",\n );\n }\n};\n"],"ignoreList":[0,1],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_rolldown_runtime = require("./rolldown-runtime-C-fzZZTt.cjs");
|
|
3
|
-
const require_utils = require("./utils-
|
|
3
|
+
const require_utils = require("./utils-C3QuhVGE.cjs");
|
|
4
4
|
const require_consts = require("./consts-X-pnRGD0.cjs");
|
|
5
5
|
let path = require("path");
|
|
6
6
|
path = require_rolldown_runtime.__toESM(path);
|
|
@@ -208,7 +208,7 @@ var LaminarDataset = class extends EvaluationDataset {
|
|
|
208
208
|
*/
|
|
209
209
|
async push(paths, recursive = false) {
|
|
210
210
|
if (!this.client) throw new Error("Client not set");
|
|
211
|
-
const { loadFromPaths } = await Promise.resolve().then(() => require("./file-utils-
|
|
211
|
+
const { loadFromPaths } = await Promise.resolve().then(() => require("./file-utils-DvRb07ah.cjs")).then((n) => n.file_utils_exports);
|
|
212
212
|
const data = await loadFromPaths(Array.isArray(paths) ? paths : [paths], recursive);
|
|
213
213
|
if (data.length === 0) {
|
|
214
214
|
console.warn("No data to push. Skipping");
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as TracingLevel, _ as MaskInputOptions, a as HumanEvaluator, b as SpanType, c as InitializeOptions, d as LaminarClient, f as Dataset, g as LaminarSpanContext, h as Event, i as EvaluatorFunctionReturn, l as EvaluationDataset, m as EvaluationDatapointDatasetLink, o as evaluate, p as EvaluationDatapoint, r as EvaluatorFunction, s as StringUUID, t as Datapoint, u as LaminarDataset, v as PushDatapointsResponse, x as TraceType, y as SessionRecordingOptions } from "./evaluations-
|
|
1
|
+
import { S as TracingLevel, _ as MaskInputOptions, a as HumanEvaluator, b as SpanType, c as InitializeOptions, d as LaminarClient, f as Dataset, g as LaminarSpanContext, h as Event, i as EvaluatorFunctionReturn, l as EvaluationDataset, m as EvaluationDatapointDatasetLink, o as evaluate, p as EvaluationDatapoint, r as EvaluatorFunction, s as StringUUID, t as Datapoint, u as LaminarDataset, v as PushDatapointsResponse, x as TraceType, y as SessionRecordingOptions } from "./evaluations-CAossFsy.cjs";
|
|
2
2
|
import { ServerResponse } from "node:http";
|
|
3
3
|
import { ReadableSpan, SpanExporter, SpanProcessor, TimedEvent } from "@opentelemetry/sdk-trace-base";
|
|
4
4
|
import { AttributeValue, Attributes, Context, Exception, HrTime, Link, Span, Span as Span$1, SpanContext, SpanKind, SpanStatus, TimeInput, Tracer, TracerProvider } from "@opentelemetry/api";
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as TracingLevel, _ as MaskInputOptions, a as HumanEvaluator, b as SpanType, c as InitializeOptions, d as LaminarClient, f as Dataset, g as LaminarSpanContext, h as Event, i as EvaluatorFunctionReturn, l as EvaluationDataset, m as EvaluationDatapointDatasetLink, o as evaluate, p as EvaluationDatapoint, r as EvaluatorFunction, s as StringUUID, t as Datapoint, u as LaminarDataset, v as PushDatapointsResponse, x as TraceType, y as SessionRecordingOptions } from "./evaluations-
|
|
1
|
+
import { S as TracingLevel, _ as MaskInputOptions, a as HumanEvaluator, b as SpanType, c as InitializeOptions, d as LaminarClient, f as Dataset, g as LaminarSpanContext, h as Event, i as EvaluatorFunctionReturn, l as EvaluationDataset, m as EvaluationDatapointDatasetLink, o as evaluate, p as EvaluationDatapoint, r as EvaluatorFunction, s as StringUUID, t as Datapoint, u as LaminarDataset, v as PushDatapointsResponse, x as TraceType, y as SessionRecordingOptions } from "./evaluations-Bz4AjiEN.mjs";
|
|
2
2
|
import { AttributeValue, Attributes, Context, Exception, HrTime, Link, Span, Span as Span$1, SpanContext, SpanKind, SpanStatus, TimeInput, Tracer, TracerProvider } from "@opentelemetry/api";
|
|
3
3
|
import { Instrumentation, InstrumentationBase } from "@opentelemetry/instrumentation";
|
|
4
4
|
import { ReadableSpan, SpanExporter, SpanProcessor, TimedEvent } from "@opentelemetry/sdk-trace-base";
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as __require } from "./rolldown-runtime-DYf_mQCB.mjs";
|
|
2
|
-
import { A as PARENT_SPAN_PATH, B as SPAN_RELEASE, C as ASSOCIATION_PROPERTIES_OVERRIDES, D as HUMAN_EVALUATOR_OPTIONS, E as GEN_AI_TOOL_DEFINITIONS, F as SPAN_INSTRUMENTATION_SCOPE_VERSION, G as USER_ID, H as SPAN_TYPE, I as SPAN_INSTRUMENTATION_SOURCE, J as DEBUG_SESSION_DIR, K as version, L as SPAN_LANGUAGE_VERSION, M as SPAN_IDS_PATH, N as SPAN_INPUT, O as LaminarAttributes, P as SPAN_INSTRUMENTATION_SCOPE_NAME, Q as hasOwn, R as SPAN_OUTPUT, S as ASSOCIATION_PROPERTIES, T as GEN_AI_OUTPUT_MESSAGES, U as TRACE_HAS_BROWSER_SESSION, V as SPAN_SDK_VERSION, W as TRACE_TYPE, X as TracingLevel, Y as DEBUG_SESSION_FILE, Z as errorMessage, _ as toJson, a as getFrontendUrl, b as tryToOtelSpanContext, c as loadEnv, d as normalizeOtelSpanId, f as normalizeOtelTraceId, g as parseOtelHeaders, h as parseJson, j as SESSION_ID$1, k as PARENT_SPAN_IDS_PATH, l as metadataToAttributes, m as otelTraceIdToUUID, n as Semaphore, o as getOtelEnvVar, p as otelSpanIdToUUID, q as LaminarClient, r as deserializeLaminarSpanContext, s as initializeLogger, t as NIL_UUID, u as newUUID, v as toJsonOrString, w as GEN_AI_INPUT_MESSAGES, x as validateTracingConfig, y as truncateSpanPayload, z as SPAN_PATH } from "./utils-
|
|
2
|
+
import { A as PARENT_SPAN_PATH, B as SPAN_RELEASE, C as ASSOCIATION_PROPERTIES_OVERRIDES, D as HUMAN_EVALUATOR_OPTIONS, E as GEN_AI_TOOL_DEFINITIONS, F as SPAN_INSTRUMENTATION_SCOPE_VERSION, G as USER_ID, H as SPAN_TYPE, I as SPAN_INSTRUMENTATION_SOURCE, J as DEBUG_SESSION_DIR, K as version, L as SPAN_LANGUAGE_VERSION, M as SPAN_IDS_PATH, N as SPAN_INPUT, O as LaminarAttributes, P as SPAN_INSTRUMENTATION_SCOPE_NAME, Q as hasOwn, R as SPAN_OUTPUT, S as ASSOCIATION_PROPERTIES, T as GEN_AI_OUTPUT_MESSAGES, U as TRACE_HAS_BROWSER_SESSION, V as SPAN_SDK_VERSION, W as TRACE_TYPE, X as TracingLevel, Y as DEBUG_SESSION_FILE, Z as errorMessage, _ as toJson, a as getFrontendUrl, b as tryToOtelSpanContext, c as loadEnv, d as normalizeOtelSpanId, f as normalizeOtelTraceId, g as parseOtelHeaders, h as parseJson, j as SESSION_ID$1, k as PARENT_SPAN_IDS_PATH, l as metadataToAttributes, m as otelTraceIdToUUID, n as Semaphore, o as getOtelEnvVar, p as otelSpanIdToUUID, q as LaminarClient, r as deserializeLaminarSpanContext, s as initializeLogger, t as NIL_UUID, u as newUUID, v as toJsonOrString, w as GEN_AI_INPUT_MESSAGES, x as validateTracingConfig, y as truncateSpanPayload, z as SPAN_PATH } from "./utils-B7IKRw5F.mjs";
|
|
3
3
|
import { n as TRACEPARENT_HEADER, t as LAMINAR_SPAN_CONTEXT_HEADER } from "./consts-r67THnT9.mjs";
|
|
4
4
|
import { createRequire } from "node:module";
|
|
5
5
|
import * as path$1 from "path";
|
|
@@ -199,7 +199,7 @@ var LaminarDataset = class extends EvaluationDataset {
|
|
|
199
199
|
*/
|
|
200
200
|
async push(paths, recursive = false) {
|
|
201
201
|
if (!this.client) throw new Error("Client not set");
|
|
202
|
-
const { loadFromPaths } = await import("./file-utils-
|
|
202
|
+
const { loadFromPaths } = await import("./file-utils-qSiXXrPa.mjs").then((n) => n.t);
|
|
203
203
|
const data = await loadFromPaths(Array.isArray(paths) ? paths : [paths], recursive);
|
|
204
204
|
if (data.length === 0) {
|
|
205
205
|
console.warn("No data to push. Skipping");
|
|
@@ -28,7 +28,7 @@ const errorMessage = (error) => error instanceof Error ? error.message : String(
|
|
|
28
28
|
* `"constructor" in {}`). `Object.hasOwn` is ES2022. */
|
|
29
29
|
const hasOwn = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key);
|
|
30
30
|
// ../client/dist/index.mjs
|
|
31
|
-
var version$1 = "0.8.
|
|
31
|
+
var version$1 = "0.8.55";
|
|
32
32
|
function getLangVersion() {
|
|
33
33
|
if (typeof process !== "undefined" && process.versions && process.versions.node) return `node-${process.versions.node}`;
|
|
34
34
|
if (typeof navigator !== "undefined" && navigator.userAgent) return `browser-${navigator.userAgent}`;
|
|
@@ -56,6 +56,20 @@ var BaseResource = class {
|
|
|
56
56
|
const errorMsg = await response.text();
|
|
57
57
|
throw new Error(`${response.status} ${errorMsg}`);
|
|
58
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* For routes that answer errors as `{error: "<message>"}` with user-facing
|
|
61
|
+
* text: raise that message instead of the raw JSON body, falling back to the
|
|
62
|
+
* body when it isn't that shape (a proxy error page, a plain-text 413).
|
|
63
|
+
*/
|
|
64
|
+
async handleErrorMessage(response) {
|
|
65
|
+
const body = await response.text();
|
|
66
|
+
let message = body;
|
|
67
|
+
try {
|
|
68
|
+
const parsed = JSON.parse(body);
|
|
69
|
+
if (typeof parsed?.error === "string" && parsed.error.length > 0) message = parsed.error;
|
|
70
|
+
} catch {}
|
|
71
|
+
throw new Error(`${response.status} ${message}`);
|
|
72
|
+
}
|
|
59
73
|
};
|
|
60
74
|
var BrowserEventsResource = class extends BaseResource {
|
|
61
75
|
constructor(baseHttpUrl, auth) {
|
|
@@ -608,6 +622,89 @@ var EvaluatorsResource = class extends BaseResource {
|
|
|
608
622
|
}
|
|
609
623
|
};
|
|
610
624
|
/**
|
|
625
|
+
* Hosted evals: Harbor evals with trials in Laminar-managed sandboxes.
|
|
626
|
+
*
|
|
627
|
+
* - Images: `missingLayers` / `uploadLayer` / `createImage` push an image built
|
|
628
|
+
* locally (layers named by their `diff_id`); trials start from it.
|
|
629
|
+
* - Remote runs: `upload` the `.tar.gz` of the evals folder, then `startRun`
|
|
630
|
+
* to orchestrate it in a Laminar sandbox. Results land in the project as
|
|
631
|
+
* regular evaluations; v0 returns no run status.
|
|
632
|
+
*/
|
|
633
|
+
var HostedEvalsResource = class extends BaseResource {
|
|
634
|
+
constructor(baseHttpUrl, auth) {
|
|
635
|
+
super(baseHttpUrl, auth);
|
|
636
|
+
}
|
|
637
|
+
/** The image layers (by `diff_id`) the project hasn't uploaded yet. */
|
|
638
|
+
async missingLayers(diffIds) {
|
|
639
|
+
const response = await fetch(this.url("/images/layers/missing"), {
|
|
640
|
+
method: "POST",
|
|
641
|
+
headers: this.headers(),
|
|
642
|
+
body: JSON.stringify({ diffIds })
|
|
643
|
+
});
|
|
644
|
+
if (!response.ok) await this.handleErrorMessage(response);
|
|
645
|
+
return (await response.json()).missing;
|
|
646
|
+
}
|
|
647
|
+
/**
|
|
648
|
+
* Upload one image layer, gzip-compressed. `diffId` is the digest of its
|
|
649
|
+
* uncompressed tar, as listed in the image config's `rootfs.diff_ids`.
|
|
650
|
+
*/
|
|
651
|
+
async uploadLayer(diffId, gzipped) {
|
|
652
|
+
const response = await fetch(this.url(`/images/layers/${diffId}`), {
|
|
653
|
+
method: "PUT",
|
|
654
|
+
headers: {
|
|
655
|
+
...this.headers(),
|
|
656
|
+
"Content-Type": "application/gzip"
|
|
657
|
+
},
|
|
658
|
+
body: gzipped,
|
|
659
|
+
duplex: "half"
|
|
660
|
+
});
|
|
661
|
+
if (!response.ok) await this.handleErrorMessage(response);
|
|
662
|
+
return await response.json();
|
|
663
|
+
}
|
|
664
|
+
/**
|
|
665
|
+
* Push the image described by `config` (its config JSON, byte for byte) once
|
|
666
|
+
* its layers are uploaded. Returns the manifest digest trials start from.
|
|
667
|
+
*/
|
|
668
|
+
async createImage(config) {
|
|
669
|
+
const response = await fetch(this.url("/images"), {
|
|
670
|
+
method: "POST",
|
|
671
|
+
headers: this.headers(),
|
|
672
|
+
body: JSON.stringify({ config })
|
|
673
|
+
});
|
|
674
|
+
if (!response.ok) await this.handleErrorMessage(response);
|
|
675
|
+
return await response.json();
|
|
676
|
+
}
|
|
677
|
+
/**
|
|
678
|
+
* Upload a `.tar.gz` of the `evals/` folder's contents (suites at the archive
|
|
679
|
+
* root). Sent as the raw request body; the server caps it at 1 GiB.
|
|
680
|
+
*/
|
|
681
|
+
async upload(archive) {
|
|
682
|
+
const response = await fetch(this.url("/uploads"), {
|
|
683
|
+
method: "POST",
|
|
684
|
+
headers: {
|
|
685
|
+
...this.headers(),
|
|
686
|
+
"Content-Type": "application/gzip"
|
|
687
|
+
},
|
|
688
|
+
body: archive
|
|
689
|
+
});
|
|
690
|
+
if (!response.ok) await this.handleErrorMessage(response);
|
|
691
|
+
return await response.json();
|
|
692
|
+
}
|
|
693
|
+
/** Start a remote run. Returns once its orchestrator sandbox has started. */
|
|
694
|
+
async startRun(options) {
|
|
695
|
+
const response = await fetch(this.url("/runs"), {
|
|
696
|
+
method: "POST",
|
|
697
|
+
headers: this.headers(),
|
|
698
|
+
body: JSON.stringify(options)
|
|
699
|
+
});
|
|
700
|
+
if (!response.ok) await this.handleErrorMessage(response);
|
|
701
|
+
return await response.json();
|
|
702
|
+
}
|
|
703
|
+
url(path) {
|
|
704
|
+
return `${this.baseHttpUrl}${this.apiPrefix}/hosted-evals${path}`;
|
|
705
|
+
}
|
|
706
|
+
};
|
|
707
|
+
/**
|
|
611
708
|
* Workspace LLM profile CRUD over the CLI user-token surface
|
|
612
709
|
* (`/v1/cli/llm-profiles`). Validation is entirely server-side; error messages
|
|
613
710
|
* come back user-ready. Self-hosted only: on Laminar Cloud every route 404s
|
|
@@ -617,27 +714,13 @@ var LlmProfilesResource = class extends BaseResource {
|
|
|
617
714
|
constructor(baseHttpUrl, auth) {
|
|
618
715
|
super(baseHttpUrl, auth);
|
|
619
716
|
}
|
|
620
|
-
/**
|
|
621
|
-
* Errors come back as `{error: string}` (matches the signals surface) with
|
|
622
|
-
* user-facing text, so unwrap the envelope before raising rather than
|
|
623
|
-
* showing the raw JSON body.
|
|
624
|
-
*/
|
|
625
|
-
async raiseLlmProfileError(response) {
|
|
626
|
-
const body = await response.text();
|
|
627
|
-
let message = body;
|
|
628
|
-
try {
|
|
629
|
-
const parsed = JSON.parse(body);
|
|
630
|
-
if (typeof parsed?.error === "string" && parsed.error.length > 0) message = parsed.error;
|
|
631
|
-
} catch {}
|
|
632
|
-
throw new Error(`${response.status} ${message}`);
|
|
633
|
-
}
|
|
634
717
|
async request(method, path, body) {
|
|
635
718
|
const response = await fetch(`${this.baseHttpUrl}${this.apiPrefix}/llm-profiles${path}`, {
|
|
636
719
|
method,
|
|
637
720
|
headers: this.headers(),
|
|
638
721
|
...body !== void 0 ? { body: JSON.stringify(body) } : {}
|
|
639
722
|
});
|
|
640
|
-
if (!response.ok) await this.
|
|
723
|
+
if (!response.ok) await this.handleErrorMessage(response);
|
|
641
724
|
return response;
|
|
642
725
|
}
|
|
643
726
|
/**
|
|
@@ -853,34 +936,22 @@ var RolloutSessionsResource = class extends BaseResource {
|
|
|
853
936
|
if (!response.ok) await this.handleError(response);
|
|
854
937
|
}
|
|
855
938
|
};
|
|
856
|
-
/**
|
|
939
|
+
/**
|
|
940
|
+
* Signals CRUD over the CLI user-token surface (`/v1/cli/signals`). Errors come
|
|
941
|
+
* back as `{error}` with user-facing text (e.g. "A signal named X already
|
|
942
|
+
* exists in this project"), raised verbatim by `handleErrorMessage`.
|
|
943
|
+
*/
|
|
857
944
|
var SignalsResource = class extends BaseResource {
|
|
858
945
|
constructor(baseHttpUrl, auth) {
|
|
859
946
|
super(baseHttpUrl, auth);
|
|
860
947
|
}
|
|
861
|
-
/**
|
|
862
|
-
* Every signal route answers errors as `{ error: "<message>" }`, and those
|
|
863
|
-
* messages are written to be shown to the user verbatim (e.g. "A signal named
|
|
864
|
-
* X already exists in this project"). The shared `handleError` would surface
|
|
865
|
-
* the raw JSON body, so unwrap the envelope here and fall back to it when the
|
|
866
|
-
* body isn't the expected shape.
|
|
867
|
-
*/
|
|
868
|
-
async raiseSignalError(response) {
|
|
869
|
-
const body = await response.text();
|
|
870
|
-
let message = body;
|
|
871
|
-
try {
|
|
872
|
-
const parsed = JSON.parse(body);
|
|
873
|
-
if (typeof parsed?.error === "string" && parsed.error.length > 0) message = parsed.error;
|
|
874
|
-
} catch {}
|
|
875
|
-
throw new Error(`${response.status} ${message}`);
|
|
876
|
-
}
|
|
877
948
|
async list(name) {
|
|
878
949
|
const query = name ? `?${new URLSearchParams({ name }).toString()}` : "";
|
|
879
950
|
const response = await fetch(`${this.baseHttpUrl}${this.apiPrefix}/signals${query}`, {
|
|
880
951
|
method: "GET",
|
|
881
952
|
headers: this.headers()
|
|
882
953
|
});
|
|
883
|
-
if (!response.ok) await this.
|
|
954
|
+
if (!response.ok) await this.handleErrorMessage(response);
|
|
884
955
|
const body = await response.json();
|
|
885
956
|
return Array.isArray(body?.signals) ? body.signals : [];
|
|
886
957
|
}
|
|
@@ -889,7 +960,7 @@ var SignalsResource = class extends BaseResource {
|
|
|
889
960
|
method: "GET",
|
|
890
961
|
headers: this.headers()
|
|
891
962
|
});
|
|
892
|
-
if (!response.ok) await this.
|
|
963
|
+
if (!response.ok) await this.handleErrorMessage(response);
|
|
893
964
|
return response.json();
|
|
894
965
|
}
|
|
895
966
|
/**
|
|
@@ -903,7 +974,7 @@ var SignalsResource = class extends BaseResource {
|
|
|
903
974
|
method: "GET",
|
|
904
975
|
headers: this.headers()
|
|
905
976
|
});
|
|
906
|
-
if (!response.ok) await this.
|
|
977
|
+
if (!response.ok) await this.handleErrorMessage(response);
|
|
907
978
|
const body = await response.json();
|
|
908
979
|
return Array.isArray(body?.versions) ? body.versions : [];
|
|
909
980
|
}
|
|
@@ -913,7 +984,7 @@ var SignalsResource = class extends BaseResource {
|
|
|
913
984
|
headers: this.headers(),
|
|
914
985
|
body: JSON.stringify(options)
|
|
915
986
|
});
|
|
916
|
-
if (!response.ok) await this.
|
|
987
|
+
if (!response.ok) await this.handleErrorMessage(response);
|
|
917
988
|
return response.json();
|
|
918
989
|
}
|
|
919
990
|
/**
|
|
@@ -927,7 +998,7 @@ var SignalsResource = class extends BaseResource {
|
|
|
927
998
|
headers: this.headers(),
|
|
928
999
|
body: JSON.stringify(options)
|
|
929
1000
|
});
|
|
930
|
-
if (!response.ok) await this.
|
|
1001
|
+
if (!response.ok) await this.handleErrorMessage(response);
|
|
931
1002
|
return response.json();
|
|
932
1003
|
}
|
|
933
1004
|
/** Deletes the signal, its triggers, its alerts, and its ClickHouse events. */
|
|
@@ -936,7 +1007,7 @@ var SignalsResource = class extends BaseResource {
|
|
|
936
1007
|
method: "DELETE",
|
|
937
1008
|
headers: this.headers()
|
|
938
1009
|
});
|
|
939
|
-
if (!response.ok) await this.
|
|
1010
|
+
if (!response.ok) await this.handleErrorMessage(response);
|
|
940
1011
|
return response.json();
|
|
941
1012
|
}
|
|
942
1013
|
/**
|
|
@@ -950,7 +1021,7 @@ var SignalsResource = class extends BaseResource {
|
|
|
950
1021
|
headers: this.headers(),
|
|
951
1022
|
body: JSON.stringify({ traceIds })
|
|
952
1023
|
});
|
|
953
|
-
if (!response.ok) await this.
|
|
1024
|
+
if (!response.ok) await this.handleErrorMessage(response);
|
|
954
1025
|
return response.json();
|
|
955
1026
|
}
|
|
956
1027
|
};
|
|
@@ -1131,6 +1202,7 @@ var LaminarClient = class LaminarClient {
|
|
|
1131
1202
|
this._datasets = new DatasetsResource(this.baseUrl, this.auth);
|
|
1132
1203
|
this._evals = new EvalsResource(this.baseUrl, this.auth);
|
|
1133
1204
|
this._evaluators = new EvaluatorsResource(this.baseUrl, this.auth);
|
|
1205
|
+
this._hostedEvals = new HostedEvalsResource(this.baseUrl, this.auth);
|
|
1134
1206
|
this._llmProfiles = new LlmProfilesResource(this.baseUrl, this.auth);
|
|
1135
1207
|
this._rolloutSessions = new RolloutSessionsResource(this.baseUrl, this.auth);
|
|
1136
1208
|
this._signals = new SignalsResource(this.baseUrl, this.auth);
|
|
@@ -1202,6 +1274,9 @@ var LaminarClient = class LaminarClient {
|
|
|
1202
1274
|
get evaluators() {
|
|
1203
1275
|
return this._evaluators;
|
|
1204
1276
|
}
|
|
1277
|
+
get hostedEvals() {
|
|
1278
|
+
return this._hostedEvals;
|
|
1279
|
+
}
|
|
1205
1280
|
get llmProfiles() {
|
|
1206
1281
|
return this._llmProfiles;
|
|
1207
1282
|
}
|
|
@@ -1222,7 +1297,7 @@ var LaminarClient = class LaminarClient {
|
|
|
1222
1297
|
}
|
|
1223
1298
|
};
|
|
1224
1299
|
// package.json
|
|
1225
|
-
var version = "0.8.
|
|
1300
|
+
var version = "0.8.55";
|
|
1226
1301
|
// src/opentelemetry-lib/tracing/attributes.ts
|
|
1227
1302
|
const SPAN_INPUT = "lmnr.span.input";
|
|
1228
1303
|
const SPAN_OUTPUT = "lmnr.span.output";
|
|
@@ -1617,4 +1692,4 @@ const getFrontendUrl = (baseUrl, frontendPort) => {
|
|
|
1617
1692
|
};
|
|
1618
1693
|
export { PARENT_SPAN_PATH as A, SPAN_RELEASE as B, ASSOCIATION_PROPERTIES_OVERRIDES as C, HUMAN_EVALUATOR_OPTIONS as D, GEN_AI_TOOL_DEFINITIONS as E, SPAN_INSTRUMENTATION_SCOPE_VERSION as F, USER_ID as G, SPAN_TYPE as H, SPAN_INSTRUMENTATION_SOURCE as I, DEBUG_SESSION_DIR as J, version as K, SPAN_LANGUAGE_VERSION as L, SPAN_IDS_PATH as M, SPAN_INPUT as N, LaminarAttributes as O, SPAN_INSTRUMENTATION_SCOPE_NAME as P, hasOwn as Q, SPAN_OUTPUT as R, ASSOCIATION_PROPERTIES as S, GEN_AI_OUTPUT_MESSAGES as T, TRACE_HAS_BROWSER_SESSION as U, SPAN_SDK_VERSION as V, TRACE_TYPE as W, TracingLevel as X, DEBUG_SESSION_FILE as Y, errorMessage as Z, toJson as _, getFrontendUrl as a, tryToOtelSpanContext as b, loadEnv as c, normalizeOtelSpanId as d, normalizeOtelTraceId as f, parseOtelHeaders as g, parseJson as h, getDirname as i, SESSION_ID as j, PARENT_SPAN_IDS_PATH as k, metadataToAttributes as l, otelTraceIdToUUID as m, Semaphore as n, getOtelEnvVar as o, otelSpanIdToUUID as p, LaminarClient as q, deserializeLaminarSpanContext as r, initializeLogger as s, NIL_UUID as t, newUUID as u, toJsonOrString as v, GEN_AI_INPUT_MESSAGES as w, validateTracingConfig as x, truncateSpanPayload as y, SPAN_PATH as z };
|
|
1619
1694
|
|
|
1620
|
-
//# sourceMappingURL=utils-
|
|
1695
|
+
//# sourceMappingURL=utils-B7IKRw5F.mjs.map
|