@lmnr-ai/client 0.8.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["SDK_VERSION","logger","logger","response: PushDatapointsResponse | undefined","paramsObj: Record<string, string>","partialDatapoint: EvaluationDatapoint<D, T, any>","lastResponse: Response | null","payload: CreateEvaluatorScoreRequestWithTraceId | CreateEvaluatorScoreRequestWithSpanId"],"sources":["../package.json","../src/version.ts","../src/resources/index.ts","../src/resources/browser-events.ts","../src/utils.ts","../src/resources/datasets.ts","../src/resources/evals.ts","../src/resources/evaluators.ts","../src/resources/rollout-sessions.ts","../src/resources/sql.ts","../src/resources/tags.ts","../src/index.ts"],"sourcesContent":["","// Version detection for runtime environment\nexport function getLangVersion(): string | null {\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n return `node-${process.versions.node}`;\n }\n if (typeof navigator !== 'undefined' && navigator.userAgent) {\n return `browser-${navigator.userAgent}`;\n }\n return null;\n}\n","class BaseResource {\n protected readonly baseHttpUrl: string;\n protected readonly projectApiKey: string;\n\n constructor(baseHttpUrl: string, projectApiKey: string) {\n this.baseHttpUrl = baseHttpUrl;\n this.projectApiKey = projectApiKey;\n }\n\n protected headers() {\n return {\n Authorization: `Bearer ${this.projectApiKey}`,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n }\n\n protected async handleError(response: Response) {\n const errorMsg = await response.text();\n throw new Error(`${response.status} ${errorMsg}`);\n }\n}\n\nexport { BaseResource };\n","import { version as SDK_VERSION } from '../../package.json';\nimport { getLangVersion } from \"../version\";\nimport { BaseResource } from \"./index\";\n\nexport class BrowserEventsResource extends BaseResource {\n constructor(baseHttpUrl: string, projectApiKey: string) {\n super(baseHttpUrl, projectApiKey);\n }\n\n public async send({\n sessionId,\n traceId,\n events,\n }: {\n sessionId: string;\n traceId: string;\n events: Record<string, any>[];\n }): Promise<void> {\n const payload = {\n sessionId,\n traceId,\n events,\n source: getLangVersion() ?? 'javascript',\n sdkVersion: SDK_VERSION,\n };\n\n const jsonString = JSON.stringify(payload);\n const blob = new Blob([jsonString], { type: 'application/json' });\n const compressedStream = blob.stream().pipeThrough(new CompressionStream('gzip'));\n const compressedResponse = new Response(compressedStream);\n const compressedData = await compressedResponse.arrayBuffer();\n\n const response = await fetch(this.baseHttpUrl + \"/v1/browser-sessions/events\", {\n method: \"POST\",\n headers: {\n ...this.headers(),\n 'Content-Encoding': 'gzip',\n },\n body: compressedData,\n });\n\n if (!response.ok) {\n await this.handleError(response);\n }\n }\n}\n","import { type StringUUID } from '@lmnr-ai/types';\nimport { config } from 'dotenv';\nimport * as path from 'path';\nimport pino, { Level } from 'pino';\nimport { PinoPretty } from 'pino-pretty';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport function initializeLogger(options?: { colorize?: boolean; level?: Level }) {\n const colorize = options?.colorize ?? true;\n const level =\n options?.level ??\n (process.env.LMNR_LOG_LEVEL?.toLowerCase()?.trim() as Level) ??\n 'info';\n\n return pino(\n {\n level,\n },\n PinoPretty({\n colorize,\n minimumLevel: level,\n }),\n );\n}\n\nconst logger = initializeLogger();\n\nexport const isStringUUID = (id: string): id is StringUUID =>\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.test(id);\n\nexport const NIL_UUID: StringUUID = '00000000-0000-0000-0000-000000000000';\n\nexport const newUUID = (): StringUUID => {\n // crypto.randomUUID is available in most of the modern browsers and node,\n // but is not available in \"insecure\" contexts, e.g. not https, not localhost\n // so we fallback to uuidv4 in those cases, which is less secure, but works\n // just fine.\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n } else {\n return uuidv4() as `${string}-${string}-${string}-${string}-${string}`;\n }\n};\n\nexport const otelSpanIdToUUID = (spanId: string): string => {\n let id = spanId.toLowerCase();\n if (id.startsWith('0x')) {\n id = id.slice(2);\n }\n if (id.length !== 16) {\n logger.warn(\n `Span ID ${spanId} is not 16 hex chars long. ` +\n 'This is not a valid OpenTelemetry span ID.',\n );\n }\n\n if (!/^[0-9a-f]+$/.test(id)) {\n logger.error(\n `Span ID ${spanId} is not a valid hex string. ` +\n 'Generating a random UUID instead.',\n );\n return newUUID();\n }\n\n return id.padStart(32, '0').replace(\n /^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/,\n '$1-$2-$3-$4-$5',\n );\n};\n\nexport const otelTraceIdToUUID = (traceId: string): StringUUID => {\n let id = traceId.toLowerCase();\n if (id.startsWith('0x')) {\n id = id.slice(2);\n }\n if (id.length !== 32) {\n logger.warn(\n `Trace ID ${traceId} is not 32 hex chars long. ` +\n 'This is not a valid OpenTelemetry trace ID.',\n );\n }\n if (!/^[0-9a-f]+$/.test(id)) {\n logger.error(\n `Trace ID ${traceId} is not a valid hex string. ` +\n 'Generating a random UUID instead.',\n );\n return newUUID();\n }\n\n return id.replace(\n /^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/,\n '$1-$2-$3-$4-$5',\n ) as StringUUID;\n};\n\nexport const slicePayload = <T>(value: T, length: number) => {\n if (value === null || value === undefined) {\n return value;\n }\n\n const str = JSON.stringify(value);\n if (str.length <= length) {\n return value;\n }\n\n return str.slice(0, length) + '...';\n};\n\nexport const loadEnv = (\n options?: {\n quiet?: boolean;\n paths?: string[];\n },\n): void => {\n const nodeEnv = process.env.NODE_ENV || 'development';\n const envDir = process.cwd();\n\n // Files to load in order (lowest to highest priority)\n // Later files override earlier ones\n const envFiles = [\n '.env',\n '.env.local',\n `.env.${nodeEnv}`,\n `.env.${nodeEnv}.local`,\n ];\n\n const logLevel = process.env.LMNR_LOG_LEVEL ?? 'info';\n const verbose = ['debug', 'trace'].includes(logLevel.trim().toLowerCase());\n\n const quiet = options?.quiet ?? !verbose;\n\n config({\n path: options?.paths ?? envFiles.map((envFile) => path.resolve(envDir, envFile)),\n quiet,\n });\n};\n","import {\n type Datapoint,\n type Dataset,\n type GetDatapointsResponse,\n type PushDatapointsResponse,\n type StringUUID,\n} from \"@lmnr-ai/types\";\n\nimport { initializeLogger } from \"../utils\";\nimport { BaseResource } from \".\";\n\nconst logger = initializeLogger();\nconst DEFAULT_DATASET_PULL_LIMIT = 100;\nconst DEFAULT_DATASET_PUSH_BATCH_SIZE = 100;\n\nexport class DatasetsResource extends BaseResource {\n constructor(baseHttpUrl: string, projectApiKey: string) {\n super(baseHttpUrl, projectApiKey);\n }\n\n /**\n * List all datasets.\n *\n * @returns {Promise<Dataset[]>} Array of datasets\n */\n public async listDatasets(): Promise<Dataset[]> {\n const response = await fetch(this.baseHttpUrl + \"/v1/datasets\", {\n method: \"GET\",\n headers: this.headers(),\n });\n\n if (!response.ok) {\n await this.handleError(response);\n }\n\n return response.json() as Promise<Dataset[]>;\n }\n\n /**\n * Get a dataset by name.\n *\n * @param {string} name - Name of the dataset\n * @returns {Promise<Dataset[]>} Array of datasets with matching name\n */\n public async getDatasetByName(name: string): Promise<Dataset[]> {\n const params = new URLSearchParams({ name });\n const response = await fetch(\n this.baseHttpUrl + `/v1/datasets?${params.toString()}`,\n {\n method: \"GET\",\n headers: this.headers(),\n },\n );\n\n if (!response.ok) {\n await this.handleError(response);\n }\n\n return response.json() as Promise<Dataset[]>;\n }\n\n /**\n * Push datapoints to a dataset.\n *\n * @param {Object} options - Push options\n * @param {Datapoint<D, T>[]} options.points - Datapoints to push\n * @param {string} [options.name] - Name of the dataset (either name or id must be provided)\n * @param {StringUUID} [options.id] - ID of the dataset (either name or id must be provided)\n * @param {number} [options.batchSize] - Batch size for pushing (default: 100)\n * @param {boolean} [options.createDataset] - Whether to create the dataset if it doesn't exist\n * @returns {Promise<PushDatapointsResponse | undefined>}\n */\n public async push<D, T>({\n points,\n name,\n id,\n batchSize = DEFAULT_DATASET_PUSH_BATCH_SIZE,\n createDataset = false,\n }: {\n points: Datapoint<D, T>[];\n name?: string;\n id?: StringUUID;\n batchSize?: number;\n createDataset?: boolean;\n }): Promise<PushDatapointsResponse | undefined> {\n if (!name && !id) {\n throw new Error(\"Either name or id must be provided\");\n }\n\n if (name && id) {\n throw new Error(\"Only one of name or id must be provided\");\n }\n\n if (createDataset && !name) {\n throw new Error(\"Name must be provided when creating a new dataset\");\n }\n\n const identifier = name ? { name } : { datasetId: id! };\n const totalBatches = Math.ceil(points.length / batchSize);\n\n let response: PushDatapointsResponse | undefined;\n for (let i = 0; i < points.length; i += batchSize) {\n const batchNum = Math.floor(i / batchSize) + 1;\n logger.debug(`Pushing batch ${batchNum} of ${totalBatches}`);\n\n const batch = points.slice(i, i + batchSize);\n const fetchResponse = await fetch(\n this.baseHttpUrl + \"/v1/datasets/datapoints\",\n {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify({\n ...identifier,\n datapoints: batch.map((point) => ({\n data: point.data,\n target: point.target ?? {},\n metadata: point.metadata ?? {},\n })),\n createDataset,\n }),\n },\n );\n\n // 201 when creating a new dataset\n if (fetchResponse.status !== 200 && fetchResponse.status !== 201) {\n await this.handleError(fetchResponse);\n }\n\n response = (await fetchResponse.json()) as PushDatapointsResponse;\n }\n\n return response;\n }\n\n /**\n * Pull datapoints from a dataset.\n *\n * @param {Object} options - Pull options\n * @param {string} [options.name] - Name of the dataset (either name or id must be provided)\n * @param {StringUUID} [options.id] - ID of the dataset (either name or id must be provided)\n * @param {number} [options.limit] - Maximum number of datapoints to return (default: 100)\n * @param {number} [options.offset] - Offset for pagination (default: 0)\n * @returns {Promise<GetDatapointsResponse<D, T>>}\n */\n public async pull<D, T>({\n name,\n id,\n limit = DEFAULT_DATASET_PULL_LIMIT,\n offset = 0,\n }: {\n name?: string;\n id?: StringUUID;\n limit?: number;\n offset?: number;\n }): Promise<GetDatapointsResponse<D, T>> {\n if (!name && !id) {\n throw new Error(\"Either name or id must be provided\");\n }\n\n if (name && id) {\n throw new Error(\"Only one of name or id must be provided\");\n }\n\n const paramsObj: Record<string, string> = {\n offset: offset.toString(),\n limit: limit.toString(),\n };\n\n if (name) {\n paramsObj.name = name;\n } else {\n paramsObj.datasetId = id!;\n }\n\n const params = new URLSearchParams(paramsObj);\n\n const response = await fetch(\n this.baseHttpUrl + `/v1/datasets/datapoints?${params.toString()}`,\n {\n method: \"GET\",\n headers: this.headers(),\n },\n );\n\n if (!response.ok) {\n await this.handleError(response);\n }\n\n return response.json() as Promise<GetDatapointsResponse<D, T>>;\n }\n}\n","import {\n type EvaluationDatapoint,\n type GetDatapointsResponse,\n type InitEvaluationResponse,\n type StringUUID,\n} from \"@lmnr-ai/types\";\n\nimport { initializeLogger, newUUID, slicePayload } from \"../utils\";\nimport { BaseResource } from \".\";\n\nconst logger = initializeLogger();\nconst INITIAL_EVALUATION_DATAPOINT_MAX_DATA_LENGTH = 16_000_000; // 16MB\n\nexport class EvalsResource extends BaseResource {\n constructor(baseHttpUrl: string, projectApiKey: string) {\n super(baseHttpUrl, projectApiKey);\n }\n\n /**\n * Initialize an evaluation.\n *\n * @param {string} name - Name of the evaluation\n * @param {string} groupName - Group name of the evaluation\n * @param {Record<string, any>} metadata - Optional metadata\n * @returns {Promise<InitEvaluationResponse>} Response from the evaluation initialization\n */\n public async init(\n name?: string,\n groupName?: string,\n metadata?: Record<string, any>,\n ): Promise<InitEvaluationResponse> {\n const response = await fetch(this.baseHttpUrl + \"/v1/evals\", {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify({\n name: name ?? null,\n groupName: groupName ?? null,\n metadata: metadata ?? null,\n }),\n });\n\n if (!response.ok) {\n await this.handleError(response);\n }\n\n return response.json() as Promise<InitEvaluationResponse>;\n }\n\n /**\n * Create a new evaluation and return its ID.\n *\n * @param {string} [name] - Optional name of the evaluation\n * @param {string} [groupName] - An identifier to group evaluations\n * @param {Record<string, any>} [metadata] - Optional metadata\n * @returns {Promise<StringUUID>} The evaluation ID\n */\n\n public async create(args?: {\n name?: string, groupName?: string, metadata?: Record<string, any>\n }): Promise<StringUUID> {\n const evaluation = await this.init(args?.name, args?.groupName, args?.metadata);\n return evaluation.id;\n }\n\n /**\n * Create a new evaluation and return its ID.\n * @deprecated use `create` instead.\n */\n public async createEvaluation(\n name?: string,\n groupName?: string,\n metadata?: Record<string, any>,\n ): Promise<StringUUID> {\n const evaluation = await this.init(name, groupName, metadata);\n return evaluation.id;\n }\n\n /**\n * Create a datapoint for an evaluation.\n *\n * @param {Object} options - Create datapoint options\n * @param {string} options.evalId - The evaluation ID\n * @param {D} options.data - The input data for the executor\n * @param {T} [options.target] - The target/expected output for evaluators\n * @param {Record<string, any>} [options.metadata] - Optional metadata\n * @param {number} [options.index] - Optional index of the datapoint\n * @param {string} [options.traceId] - Optional trace ID\n * @returns {Promise<StringUUID>} The datapoint ID\n */\n public async createDatapoint<D, T>({\n evalId,\n data,\n target,\n metadata,\n index,\n traceId,\n }: {\n evalId: string;\n data: D;\n target?: T;\n metadata?: Record<string, any>;\n index?: number;\n traceId?: string;\n }): Promise<StringUUID> {\n const datapointId = newUUID();\n\n const partialDatapoint: EvaluationDatapoint<D, T, any> = {\n id: datapointId,\n data,\n target,\n index: index ?? 0,\n traceId: traceId ?? newUUID(),\n executorSpanId: newUUID(),\n metadata,\n };\n\n await this.saveDatapoints({\n evalId,\n datapoints: [partialDatapoint],\n });\n\n return datapointId;\n }\n\n /**\n * Update a datapoint with evaluation results.\n *\n * @param {Object} options - Update datapoint options\n * @param {string} options.evalId - The evaluation ID\n * @param {string} options.datapointId - The datapoint ID\n * @param {Record<string, number>} options.scores - The scores\n * @param {O} [options.executorOutput] - The executor output\n * @returns {Promise<void>}\n */\n public async updateDatapoint<O>({\n evalId,\n datapointId,\n scores,\n executorOutput,\n }: {\n evalId: string;\n datapointId: string;\n scores: Record<string, number>;\n executorOutput?: O;\n }): Promise<void> {\n const response = await fetch(\n this.baseHttpUrl + `/v1/evals/${evalId}/datapoints/${datapointId}`,\n {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify({\n executorOutput,\n scores,\n }),\n },\n );\n\n if (!response.ok) {\n await this.handleError(response);\n }\n }\n\n /**\n * Save evaluation datapoints.\n *\n * @param {Object} options - Save datapoints options\n * @param {string} options.evalId - ID of the evaluation\n * @param {EvaluationDatapoint<D, T, O>[]} options.datapoints - Datapoint to add\n * @param {string} [options.groupName] - Group name of the evaluation\n * @returns {Promise<void>} Response from the datapoint addition\n */\n public async saveDatapoints<D, T, O>({\n evalId,\n datapoints,\n groupName,\n }: {\n evalId: string;\n datapoints: EvaluationDatapoint<D, T, O>[];\n groupName?: string;\n }): Promise<void> {\n const response = await fetch(this.baseHttpUrl + `/v1/evals/${evalId}/datapoints`, {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify({\n points: datapoints.map((d) => (\n {\n ...d,\n data: slicePayload(d.data, INITIAL_EVALUATION_DATAPOINT_MAX_DATA_LENGTH),\n target: slicePayload(d.target, INITIAL_EVALUATION_DATAPOINT_MAX_DATA_LENGTH),\n executorOutput: slicePayload(\n d.executorOutput,\n INITIAL_EVALUATION_DATAPOINT_MAX_DATA_LENGTH,\n ),\n })),\n groupName: groupName ?? null,\n }),\n });\n\n if (response.status === 413) {\n return await this.retrySaveDatapoints({\n evalId,\n datapoints,\n groupName,\n });\n }\n\n if (!response.ok) {\n await this.handleError(response);\n }\n }\n\n /**\n * Get evaluation datapoints.\n *\n * @deprecated Use `client.datasets.pull()` instead.\n * @param {Object} options - Get datapoints options\n * @param {string} options.datasetName - Name of the dataset\n * @param {number} options.offset - Offset at which to start the query\n * @param {number} options.limit - Maximum number of datapoints to return\n * @returns {Promise<GetDatapointsResponse>} Response from the datapoint retrieval\n */\n public async getDatapoints<D, T>({\n datasetName,\n offset,\n limit,\n }: {\n datasetName: string;\n offset: number;\n limit: number;\n }): Promise<GetDatapointsResponse<D, T>> {\n logger.warn(\n 'evals.getDatapoints() is deprecated. Use client.datasets.pull() instead.',\n );\n\n const params = new URLSearchParams({\n name: datasetName,\n offset: offset.toString(),\n limit: limit.toString(),\n });\n const response = await fetch(\n this.baseHttpUrl + `/v1/datasets/datapoints?${params.toString()}`,\n {\n method: \"GET\",\n headers: this.headers(),\n },\n );\n\n if (!response.ok) {\n await this.handleError(response);\n }\n\n return (await response.json()) as GetDatapointsResponse<D, T>;\n }\n\n private async retrySaveDatapoints<D, T, O>({\n evalId,\n datapoints,\n groupName,\n maxRetries = 25,\n initialLength = INITIAL_EVALUATION_DATAPOINT_MAX_DATA_LENGTH,\n }: {\n evalId: string;\n datapoints: EvaluationDatapoint<D, T, O>[];\n groupName?: string;\n maxRetries?: number;\n initialLength?: number;\n }): Promise<void> {\n let length = initialLength;\n let lastResponse: Response | null = null;\n for (let i = 0; i < maxRetries; i++) {\n logger.debug(`Retrying save datapoints... ${i + 1} of ${maxRetries}, length: ${length}`);\n const response = await fetch(this.baseHttpUrl + `/v1/evals/${evalId}/datapoints`, {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify({\n points: datapoints.map((d) => (\n {\n ...d,\n data: slicePayload(d.data, length),\n target: slicePayload(d.target, length),\n executorOutput: slicePayload(d.executorOutput, length),\n })),\n groupName: groupName ?? null,\n }),\n });\n lastResponse = response;\n length = Math.floor(length / 2);\n if (response.status !== 413) {\n break;\n }\n }\n if (lastResponse && !lastResponse.ok) {\n await this.handleError(lastResponse);\n }\n }\n}\n","import { type StringUUID } from \"@lmnr-ai/types\";\n\nimport { isStringUUID, otelSpanIdToUUID, otelTraceIdToUUID } from \"../utils\";\nimport { BaseResource } from \".\";\n\nenum EvaluatorScoreSourceType {\n Evaluator = \"Evaluator\",\n Code = \"Code\",\n}\n\ninterface CreateEvaluatorScoreBase {\n name: string;\n metadata?: Record<string, any>;\n score: number;\n source: EvaluatorScoreSourceType;\n}\n\ninterface CreateEvaluatorScoreRequestWithTraceId extends CreateEvaluatorScoreBase {\n traceId: string;\n}\n\ninterface CreateEvaluatorScoreRequestWithSpanId extends CreateEvaluatorScoreBase {\n spanId: string;\n}\n\ntype ScoreOptions =\n | { name: string; metadata?: Record<string, any>; score: number; traceId: string; }\n | { name: string; metadata?: Record<string, any>; score: number; spanId: string; };\n\n/**\n * Resource for creating evaluator scores\n */\nexport class EvaluatorsResource extends BaseResource {\n constructor(baseHttpUrl: string, projectApiKey: string) {\n super(baseHttpUrl, projectApiKey);\n }\n\n /**\n * Create a score for a span or trace\n *\n * @param {ScoreOptions} options - Score creation options\n * @param {string} options.name - Name of the score\n * @param {string} [options.traceId] - The trace ID to score (will be attached to top-level span)\n * @param {string} [options.spanId] - The span ID to score\n * @param {Record<string, any>} [options.metadata] - Additional metadata\n * @param {number} options.score - The score value (float)\n * @returns {Promise<void>}\n *\n * @example\n * // Score by trace ID (will attach to root span)\n * await evaluators.score({\n * name: \"quality\",\n * traceId: \"trace-id-here\",\n * score: 0.95,\n * metadata: { model: \"gpt-4\" }\n * });\n *\n * @example\n * // Score by span ID\n * await evaluators.score({\n * name: \"relevance\",\n * spanId: \"span-id-here\",\n * score: 0.87\n * });\n */\n public async score(options: ScoreOptions): Promise<void> {\n const { name, metadata, score } = options;\n\n let payload: CreateEvaluatorScoreRequestWithTraceId | CreateEvaluatorScoreRequestWithSpanId;\n\n if ('traceId' in options && options.traceId) {\n const formattedTraceId = isStringUUID(options.traceId)\n ? options.traceId\n : otelTraceIdToUUID(options.traceId);\n\n payload = {\n name,\n metadata,\n score,\n source: EvaluatorScoreSourceType.Code,\n traceId: formattedTraceId,\n };\n } else if ('spanId' in options && options.spanId) {\n const formattedSpanId = isStringUUID(options.spanId)\n ? options.spanId\n : otelSpanIdToUUID(options.spanId) as StringUUID;\n\n payload = {\n name,\n metadata,\n score,\n source: EvaluatorScoreSourceType.Code,\n spanId: formattedSpanId,\n };\n } else {\n throw new Error(\"Either 'traceId' or 'spanId' must be provided.\");\n }\n\n const response = await fetch(this.baseHttpUrl + \"/v1/evaluators/score\", {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n await this.handleError(response);\n }\n }\n}\n","import { type RolloutParam, type SpanType } from \"@lmnr-ai/types\";\n\nimport { otelSpanIdToUUID, otelTraceIdToUUID } from \"../utils\";\nimport { BaseResource } from \"./index\";\n\nexport class RolloutSessionsResource extends BaseResource {\n constructor(baseHttpUrl: string, projectApiKey: string) {\n super(baseHttpUrl, projectApiKey);\n }\n\n /**\n * Connects to the SSE stream for rollout debugging sessions\n * Returns the Response object for streaming SSE events\n */\n public async connect({\n sessionId,\n name,\n params,\n signal,\n }: {\n sessionId: string;\n params: RolloutParam[];\n name: string;\n signal?: AbortSignal;\n }): Promise<Response> {\n const response = await fetch(`${this.baseHttpUrl}/v1/rollouts/${sessionId}`, {\n method: \"POST\",\n headers: {\n ...this.headers(),\n 'Accept': 'text/event-stream',\n },\n body: JSON.stringify({ name, params }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`SSE connection failed: ${response.status} ${response.statusText}`);\n }\n\n if (!response.body) {\n throw new Error('No response body');\n }\n\n return response;\n }\n\n public async delete({\n sessionId,\n }: {\n sessionId: string;\n }) {\n const response = await fetch(`${this.baseHttpUrl}/v1/rollouts/${sessionId}`, {\n method: \"DELETE\",\n headers: this.headers(),\n });\n\n if (!response.ok) {\n await this.handleError(response);\n }\n }\n\n public async setStatus({\n sessionId,\n status,\n }: {\n sessionId: string;\n status: 'PENDING' | 'RUNNING' | 'FINISHED' | 'STOPPED';\n }) {\n const response = await fetch(`${this.baseHttpUrl}/v1/rollouts/${sessionId}/status`, {\n method: \"PATCH\",\n headers: this.headers(),\n body: JSON.stringify({ status }),\n });\n\n if (!response.ok) {\n await this.handleError(response);\n }\n }\n\n public async sendSpanUpdate({\n sessionId,\n span,\n }: {\n sessionId: string;\n span: {\n name: string;\n startTime: string;\n spanId: string;\n traceId: string;\n parentSpanId: string | undefined;\n attributes: Record<string, any>;\n spanType: SpanType;\n };\n }) {\n const response = await fetch(`${this.baseHttpUrl}/v1/rollouts/${sessionId}/update`, {\n method: \"PATCH\",\n headers: this.headers(),\n body: JSON.stringify({\n type: \"spanStart\",\n spanId: otelSpanIdToUUID(span.spanId),\n traceId: otelTraceIdToUUID(span.traceId),\n parentSpanId: span.parentSpanId ? otelSpanIdToUUID(span.parentSpanId) : undefined,\n attributes: span.attributes,\n startTime: span.startTime,\n name: span.name,\n spanType: span.spanType,\n }),\n });\n\n if (!response.ok) {\n await this.handleError(response);\n }\n }\n}\n","import { BaseResource } from \"./index\";\n\nexport class SqlResource extends BaseResource {\n constructor(baseHttpUrl: string, projectApiKey: string) {\n super(baseHttpUrl, projectApiKey);\n }\n\n public async query(\n sql: string,\n parameters: Record<string, any> = {},\n ): Promise<Array<Record<string, any>>> {\n const response = await fetch(`${this.baseHttpUrl}/v1/sql/query`, {\n method: \"POST\",\n headers: {\n ...this.headers(),\n },\n body: JSON.stringify({\n query: sql,\n parameters,\n }),\n });\n\n if (!response.ok) {\n await this.handleError(response);\n }\n\n return (await response.json()).data as Array<Record<string, any>>;\n }\n}\n","/** Resource for tagging traces. */\n\n\nimport { isStringUUID, otelTraceIdToUUID } from \"../utils\";\nimport { BaseResource } from \"./index\";\n\nexport class TagsResource extends BaseResource {\n /** Resource for tagging traces. */\n constructor(baseHttpUrl: string, projectApiKey: string) {\n super(baseHttpUrl, projectApiKey);\n }\n\n /**\n * Tag a trace with a list of tags. Note that the trace must be ended before\n * tagging it. You may want to call `await Laminar.flush()` after the trace\n * that you want to tag.\n *\n * @param {string | StringUUID} trace_id - The trace id to tag.\n * @param {string[] | string} tags - The tag or list of tags to add to the trace.\n * @returns {Promise<any>} The response from the server.\n * @example\n * ```javascript\n * import { Laminar, observe, LaminarClient } from \"@lmnr-ai/lmnr\";\n * Laminar.initialize();\n * const client = new LaminarClient();\n * let traceId: StringUUID | null = null;\n * // Make sure this is called outside of traced context.\n * await observe(\n * {\n * name: \"my-trace\",\n * },\n * async () => {\n * traceId = await Laminar.getTraceId();\n * await foo();\n * },\n * );\n *\n * // or make sure the trace is ended by this point.\n * await Laminar.flush();\n * if (traceId) {\n * await client.tags.tag(traceId, [\"tag1\", \"tag2\"]);\n * }\n * ```\n */\n public async tag(\n trace_id: string,\n tags: string[] | string,\n ): Promise<any> {\n const traceTags = Array.isArray(tags) ? tags : [tags];\n const formattedTraceId = isStringUUID(trace_id)\n ? trace_id\n : otelTraceIdToUUID(trace_id);\n\n const url = this.baseHttpUrl + \"/v1/tag\";\n const payload = {\n \"traceId\": formattedTraceId,\n \"names\": traceTags,\n };\n const response = await fetch(\n url,\n {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify(payload),\n },\n );\n if (!response.ok) {\n await this.handleError(response);\n }\n return response.json();\n }\n}\n","import { BrowserEventsResource } from \"./resources/browser-events\";\nimport { DatasetsResource } from \"./resources/datasets\";\nimport { EvalsResource } from \"./resources/evals\";\nimport { EvaluatorsResource } from \"./resources/evaluators\";\nimport { RolloutSessionsResource } from \"./resources/rollout-sessions\";\nimport { SqlResource } from \"./resources/sql\";\nimport { TagsResource } from \"./resources/tags\";\nimport { loadEnv } from \"./utils\";\n\nexport class LaminarClient {\n private baseUrl: string;\n private projectApiKey: string;\n private _browserEvents: BrowserEventsResource;\n private _datasets: DatasetsResource;\n private _evals: EvalsResource;\n private _evaluators: EvaluatorsResource;\n private _rolloutSessions: RolloutSessionsResource;\n private _sql: SqlResource;\n private _tags: TagsResource;\n\n constructor({\n baseUrl,\n projectApiKey,\n port,\n }: {\n baseUrl?: string,\n projectApiKey?: string,\n port?: number,\n } = {}) {\n loadEnv();\n this.projectApiKey = projectApiKey ?? process.env.LMNR_PROJECT_API_KEY!;\n const httpPort = port ?? (\n baseUrl?.match(/:\\d{1,5}$/g)\n ? parseInt(baseUrl.match(/:\\d{1,5}$/g)![0].slice(1))\n : 443);\n const baseUrlNoPort = (baseUrl ?? process.env.LMNR_BASE_URL)\n ?.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n this.baseUrl = `${baseUrlNoPort ?? 'https://api.lmnr.ai'}:${httpPort}`;\n this._browserEvents = new BrowserEventsResource(this.baseUrl, this.projectApiKey);\n this._datasets = new DatasetsResource(this.baseUrl, this.projectApiKey);\n this._evals = new EvalsResource(this.baseUrl, this.projectApiKey);\n this._evaluators = new EvaluatorsResource(this.baseUrl, this.projectApiKey);\n this._rolloutSessions = new RolloutSessionsResource(this.baseUrl, this.projectApiKey);\n this._sql = new SqlResource(this.baseUrl, this.projectApiKey);\n this._tags = new TagsResource(this.baseUrl, this.projectApiKey);\n }\n\n public get browserEvents() {\n return this._browserEvents;\n }\n\n public get datasets() {\n return this._datasets;\n }\n\n public get evals() {\n return this._evals;\n }\n\n public get evaluators() {\n return this._evaluators;\n }\n\n public get rolloutSessions() {\n return this._rolloutSessions;\n }\n\n public get sql() {\n return this._sql;\n }\n\n public get tags() {\n return this._tags;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,381 @@
1
+ import { Datapoint, Dataset, EvaluationDatapoint, GetDatapointsResponse, InitEvaluationResponse, PushDatapointsResponse, RolloutParam, SpanType, StringUUID } from "@lmnr-ai/types";
2
+
3
+ //#region src/resources/index.d.ts
4
+ declare class BaseResource {
5
+ protected readonly baseHttpUrl: string;
6
+ protected readonly projectApiKey: string;
7
+ constructor(baseHttpUrl: string, projectApiKey: string);
8
+ protected headers(): {
9
+ Authorization: string;
10
+ "Content-Type": string;
11
+ Accept: string;
12
+ };
13
+ protected handleError(response: Response): Promise<void>;
14
+ }
15
+ //#endregion
16
+ //#region src/resources/browser-events.d.ts
17
+ declare class BrowserEventsResource extends BaseResource {
18
+ constructor(baseHttpUrl: string, projectApiKey: string);
19
+ send({
20
+ sessionId,
21
+ traceId,
22
+ events
23
+ }: {
24
+ sessionId: string;
25
+ traceId: string;
26
+ events: Record<string, any>[];
27
+ }): Promise<void>;
28
+ }
29
+ //#endregion
30
+ //#region src/resources/datasets.d.ts
31
+ declare class DatasetsResource extends BaseResource {
32
+ constructor(baseHttpUrl: string, projectApiKey: string);
33
+ /**
34
+ * List all datasets.
35
+ *
36
+ * @returns {Promise<Dataset[]>} Array of datasets
37
+ */
38
+ listDatasets(): Promise<Dataset[]>;
39
+ /**
40
+ * Get a dataset by name.
41
+ *
42
+ * @param {string} name - Name of the dataset
43
+ * @returns {Promise<Dataset[]>} Array of datasets with matching name
44
+ */
45
+ getDatasetByName(name: string): Promise<Dataset[]>;
46
+ /**
47
+ * Push datapoints to a dataset.
48
+ *
49
+ * @param {Object} options - Push options
50
+ * @param {Datapoint<D, T>[]} options.points - Datapoints to push
51
+ * @param {string} [options.name] - Name of the dataset (either name or id must be provided)
52
+ * @param {StringUUID} [options.id] - ID of the dataset (either name or id must be provided)
53
+ * @param {number} [options.batchSize] - Batch size for pushing (default: 100)
54
+ * @param {boolean} [options.createDataset] - Whether to create the dataset if it doesn't exist
55
+ * @returns {Promise<PushDatapointsResponse | undefined>}
56
+ */
57
+ push<D, T>({
58
+ points,
59
+ name,
60
+ id,
61
+ batchSize,
62
+ createDataset
63
+ }: {
64
+ points: Datapoint<D, T>[];
65
+ name?: string;
66
+ id?: StringUUID;
67
+ batchSize?: number;
68
+ createDataset?: boolean;
69
+ }): Promise<PushDatapointsResponse | undefined>;
70
+ /**
71
+ * Pull datapoints from a dataset.
72
+ *
73
+ * @param {Object} options - Pull options
74
+ * @param {string} [options.name] - Name of the dataset (either name or id must be provided)
75
+ * @param {StringUUID} [options.id] - ID of the dataset (either name or id must be provided)
76
+ * @param {number} [options.limit] - Maximum number of datapoints to return (default: 100)
77
+ * @param {number} [options.offset] - Offset for pagination (default: 0)
78
+ * @returns {Promise<GetDatapointsResponse<D, T>>}
79
+ */
80
+ pull<D, T>({
81
+ name,
82
+ id,
83
+ limit,
84
+ offset
85
+ }: {
86
+ name?: string;
87
+ id?: StringUUID;
88
+ limit?: number;
89
+ offset?: number;
90
+ }): Promise<GetDatapointsResponse<D, T>>;
91
+ }
92
+ //#endregion
93
+ //#region src/resources/evals.d.ts
94
+ declare class EvalsResource extends BaseResource {
95
+ constructor(baseHttpUrl: string, projectApiKey: string);
96
+ /**
97
+ * Initialize an evaluation.
98
+ *
99
+ * @param {string} name - Name of the evaluation
100
+ * @param {string} groupName - Group name of the evaluation
101
+ * @param {Record<string, any>} metadata - Optional metadata
102
+ * @returns {Promise<InitEvaluationResponse>} Response from the evaluation initialization
103
+ */
104
+ init(name?: string, groupName?: string, metadata?: Record<string, any>): Promise<InitEvaluationResponse>;
105
+ /**
106
+ * Create a new evaluation and return its ID.
107
+ *
108
+ * @param {string} [name] - Optional name of the evaluation
109
+ * @param {string} [groupName] - An identifier to group evaluations
110
+ * @param {Record<string, any>} [metadata] - Optional metadata
111
+ * @returns {Promise<StringUUID>} The evaluation ID
112
+ */
113
+ create(args?: {
114
+ name?: string;
115
+ groupName?: string;
116
+ metadata?: Record<string, any>;
117
+ }): Promise<StringUUID>;
118
+ /**
119
+ * Create a new evaluation and return its ID.
120
+ * @deprecated use `create` instead.
121
+ */
122
+ createEvaluation(name?: string, groupName?: string, metadata?: Record<string, any>): Promise<StringUUID>;
123
+ /**
124
+ * Create a datapoint for an evaluation.
125
+ *
126
+ * @param {Object} options - Create datapoint options
127
+ * @param {string} options.evalId - The evaluation ID
128
+ * @param {D} options.data - The input data for the executor
129
+ * @param {T} [options.target] - The target/expected output for evaluators
130
+ * @param {Record<string, any>} [options.metadata] - Optional metadata
131
+ * @param {number} [options.index] - Optional index of the datapoint
132
+ * @param {string} [options.traceId] - Optional trace ID
133
+ * @returns {Promise<StringUUID>} The datapoint ID
134
+ */
135
+ createDatapoint<D, T>({
136
+ evalId,
137
+ data,
138
+ target,
139
+ metadata,
140
+ index,
141
+ traceId
142
+ }: {
143
+ evalId: string;
144
+ data: D;
145
+ target?: T;
146
+ metadata?: Record<string, any>;
147
+ index?: number;
148
+ traceId?: string;
149
+ }): Promise<StringUUID>;
150
+ /**
151
+ * Update a datapoint with evaluation results.
152
+ *
153
+ * @param {Object} options - Update datapoint options
154
+ * @param {string} options.evalId - The evaluation ID
155
+ * @param {string} options.datapointId - The datapoint ID
156
+ * @param {Record<string, number>} options.scores - The scores
157
+ * @param {O} [options.executorOutput] - The executor output
158
+ * @returns {Promise<void>}
159
+ */
160
+ updateDatapoint<O>({
161
+ evalId,
162
+ datapointId,
163
+ scores,
164
+ executorOutput
165
+ }: {
166
+ evalId: string;
167
+ datapointId: string;
168
+ scores: Record<string, number>;
169
+ executorOutput?: O;
170
+ }): Promise<void>;
171
+ /**
172
+ * Save evaluation datapoints.
173
+ *
174
+ * @param {Object} options - Save datapoints options
175
+ * @param {string} options.evalId - ID of the evaluation
176
+ * @param {EvaluationDatapoint<D, T, O>[]} options.datapoints - Datapoint to add
177
+ * @param {string} [options.groupName] - Group name of the evaluation
178
+ * @returns {Promise<void>} Response from the datapoint addition
179
+ */
180
+ saveDatapoints<D, T, O>({
181
+ evalId,
182
+ datapoints,
183
+ groupName
184
+ }: {
185
+ evalId: string;
186
+ datapoints: EvaluationDatapoint<D, T, O>[];
187
+ groupName?: string;
188
+ }): Promise<void>;
189
+ /**
190
+ * Get evaluation datapoints.
191
+ *
192
+ * @deprecated Use `client.datasets.pull()` instead.
193
+ * @param {Object} options - Get datapoints options
194
+ * @param {string} options.datasetName - Name of the dataset
195
+ * @param {number} options.offset - Offset at which to start the query
196
+ * @param {number} options.limit - Maximum number of datapoints to return
197
+ * @returns {Promise<GetDatapointsResponse>} Response from the datapoint retrieval
198
+ */
199
+ getDatapoints<D, T>({
200
+ datasetName,
201
+ offset,
202
+ limit
203
+ }: {
204
+ datasetName: string;
205
+ offset: number;
206
+ limit: number;
207
+ }): Promise<GetDatapointsResponse<D, T>>;
208
+ private retrySaveDatapoints;
209
+ }
210
+ //#endregion
211
+ //#region src/resources/evaluators.d.ts
212
+ type ScoreOptions = {
213
+ name: string;
214
+ metadata?: Record<string, any>;
215
+ score: number;
216
+ traceId: string;
217
+ } | {
218
+ name: string;
219
+ metadata?: Record<string, any>;
220
+ score: number;
221
+ spanId: string;
222
+ };
223
+ /**
224
+ * Resource for creating evaluator scores
225
+ */
226
+ declare class EvaluatorsResource extends BaseResource {
227
+ constructor(baseHttpUrl: string, projectApiKey: string);
228
+ /**
229
+ * Create a score for a span or trace
230
+ *
231
+ * @param {ScoreOptions} options - Score creation options
232
+ * @param {string} options.name - Name of the score
233
+ * @param {string} [options.traceId] - The trace ID to score (will be attached to top-level span)
234
+ * @param {string} [options.spanId] - The span ID to score
235
+ * @param {Record<string, any>} [options.metadata] - Additional metadata
236
+ * @param {number} options.score - The score value (float)
237
+ * @returns {Promise<void>}
238
+ *
239
+ * @example
240
+ * // Score by trace ID (will attach to root span)
241
+ * await evaluators.score({
242
+ * name: "quality",
243
+ * traceId: "trace-id-here",
244
+ * score: 0.95,
245
+ * metadata: { model: "gpt-4" }
246
+ * });
247
+ *
248
+ * @example
249
+ * // Score by span ID
250
+ * await evaluators.score({
251
+ * name: "relevance",
252
+ * spanId: "span-id-here",
253
+ * score: 0.87
254
+ * });
255
+ */
256
+ score(options: ScoreOptions): Promise<void>;
257
+ }
258
+ //#endregion
259
+ //#region src/resources/rollout-sessions.d.ts
260
+ declare class RolloutSessionsResource extends BaseResource {
261
+ constructor(baseHttpUrl: string, projectApiKey: string);
262
+ /**
263
+ * Connects to the SSE stream for rollout debugging sessions
264
+ * Returns the Response object for streaming SSE events
265
+ */
266
+ connect({
267
+ sessionId,
268
+ name,
269
+ params,
270
+ signal
271
+ }: {
272
+ sessionId: string;
273
+ params: RolloutParam[];
274
+ name: string;
275
+ signal?: AbortSignal;
276
+ }): Promise<Response>;
277
+ delete({
278
+ sessionId
279
+ }: {
280
+ sessionId: string;
281
+ }): Promise<void>;
282
+ setStatus({
283
+ sessionId,
284
+ status
285
+ }: {
286
+ sessionId: string;
287
+ status: 'PENDING' | 'RUNNING' | 'FINISHED' | 'STOPPED';
288
+ }): Promise<void>;
289
+ sendSpanUpdate({
290
+ sessionId,
291
+ span
292
+ }: {
293
+ sessionId: string;
294
+ span: {
295
+ name: string;
296
+ startTime: string;
297
+ spanId: string;
298
+ traceId: string;
299
+ parentSpanId: string | undefined;
300
+ attributes: Record<string, any>;
301
+ spanType: SpanType;
302
+ };
303
+ }): Promise<void>;
304
+ }
305
+ //#endregion
306
+ //#region src/resources/sql.d.ts
307
+ declare class SqlResource extends BaseResource {
308
+ constructor(baseHttpUrl: string, projectApiKey: string);
309
+ query(sql: string, parameters?: Record<string, any>): Promise<Array<Record<string, any>>>;
310
+ }
311
+ //#endregion
312
+ //#region src/resources/tags.d.ts
313
+ declare class TagsResource extends BaseResource {
314
+ /** Resource for tagging traces. */
315
+ constructor(baseHttpUrl: string, projectApiKey: string);
316
+ /**
317
+ * Tag a trace with a list of tags. Note that the trace must be ended before
318
+ * tagging it. You may want to call `await Laminar.flush()` after the trace
319
+ * that you want to tag.
320
+ *
321
+ * @param {string | StringUUID} trace_id - The trace id to tag.
322
+ * @param {string[] | string} tags - The tag or list of tags to add to the trace.
323
+ * @returns {Promise<any>} The response from the server.
324
+ * @example
325
+ * ```javascript
326
+ * import { Laminar, observe, LaminarClient } from "@lmnr-ai/lmnr";
327
+ * Laminar.initialize();
328
+ * const client = new LaminarClient();
329
+ * let traceId: StringUUID | null = null;
330
+ * // Make sure this is called outside of traced context.
331
+ * await observe(
332
+ * {
333
+ * name: "my-trace",
334
+ * },
335
+ * async () => {
336
+ * traceId = await Laminar.getTraceId();
337
+ * await foo();
338
+ * },
339
+ * );
340
+ *
341
+ * // or make sure the trace is ended by this point.
342
+ * await Laminar.flush();
343
+ * if (traceId) {
344
+ * await client.tags.tag(traceId, ["tag1", "tag2"]);
345
+ * }
346
+ * ```
347
+ */
348
+ tag(trace_id: string, tags: string[] | string): Promise<any>;
349
+ }
350
+ //#endregion
351
+ //#region src/index.d.ts
352
+ declare class LaminarClient {
353
+ private baseUrl;
354
+ private projectApiKey;
355
+ private _browserEvents;
356
+ private _datasets;
357
+ private _evals;
358
+ private _evaluators;
359
+ private _rolloutSessions;
360
+ private _sql;
361
+ private _tags;
362
+ constructor({
363
+ baseUrl,
364
+ projectApiKey,
365
+ port
366
+ }?: {
367
+ baseUrl?: string;
368
+ projectApiKey?: string;
369
+ port?: number;
370
+ });
371
+ get browserEvents(): BrowserEventsResource;
372
+ get datasets(): DatasetsResource;
373
+ get evals(): EvalsResource;
374
+ get evaluators(): EvaluatorsResource;
375
+ get rolloutSessions(): RolloutSessionsResource;
376
+ get sql(): SqlResource;
377
+ get tags(): TagsResource;
378
+ }
379
+ //#endregion
380
+ export { LaminarClient };
381
+ //# sourceMappingURL=index.d.cts.map