@lmnr-ai/lmnr 0.7.14 → 0.7.15

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  const require_utils = require('./utils-CjvkrXaI.cjs');
3
- const require_client = require('./client-Vr5R1_VP.cjs');
3
+ const require_client = require('./client-DOx_EuBb.cjs');
4
4
  let path = require("path");
5
5
  path = require_utils.__toESM(path);
6
6
  let commander = require("commander");
package/dist/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { f as __require, r as version, t as LaminarClient } from "./client-BaOYuI3V.mjs";
2
+ import { f as __require, r as version, t as LaminarClient } from "./client-Bp0oS3Ur.mjs";
3
3
  import { i as getDirname, o as initializeLogger } from "./utils-ChSbRj0P.mjs";
4
4
  import * as path from "path";
5
5
  import { Command } from "commander";
@@ -587,7 +587,7 @@ var AgentResource = class extends BaseResource {
587
587
 
588
588
  //#endregion
589
589
  //#region package.json
590
- var version = "0.7.14";
590
+ var version = "0.7.15";
591
591
 
592
592
  //#endregion
593
593
  //#region src/version.ts
@@ -1075,4 +1075,4 @@ var LaminarClient = class {
1075
1075
 
1076
1076
  //#endregion
1077
1077
  export { CONTEXT_SPAN_PATH_KEY as a, createResource as c, TracingLevel as d, __require as f, ASSOCIATION_PROPERTIES_KEY as i, getParentSpanId as l, getLangVersion as n, LaminarContextManager as o, version as r, LaminarSpan as s, LaminarClient as t, makeSpanOtelV2Compatible as u };
1078
- //# sourceMappingURL=client-BaOYuI3V.mjs.map
1078
+ //# sourceMappingURL=client-Bp0oS3Ur.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-BaOYuI3V.mjs","names":["logger","spanPath: string[]","spanIdsPath: StringUUID[]","metadata: Record<string, AttributeValue>","properties: Record<string, any>","metadata: Record<string, any>","context","contextApi","logger","request: RunAgentRequest","finalChunk: RunAgentResponseChunk | null","errorChunk: RunAgentErrorChunk | null","getLangVersion: () => string | undefined","SDK_VERSION","logger","response: PushDatapointsResponse | undefined","paramsObj: Record<string, string>","partialDatapoint: EvaluationDatapoint<D, T, any>","lastResponse: Response | null","payload: CreateEvaluatorScoreRequestWithTraceId | CreateEvaluatorScoreRequestWithSpanId"],"sources":["../src/types.ts","../src/opentelemetry-lib/tracing/compat.ts","../src/opentelemetry-lib/tracing/span.ts","../src/opentelemetry-lib/tracing/context.ts","../src/client/resources/index.ts","../src/client/resources/agent.ts","../package.json","../src/version.ts","../src/client/resources/browser-events.ts","../src/client/resources/datasets.ts","../src/client/resources/evals.ts","../src/client/resources/evaluators.ts","../src/client/resources/tags.ts","../src/client/index.ts"],"sourcesContent":["import { type Datapoint } from \"./evaluations\";\nimport { StringUUID } from \"./utils\";\n\nexport type Event = {\n id: StringUUID;\n templateName: string;\n timestamp: Date;\n spanId: StringUUID;\n value: number | string | null; // number\n};\n\nexport type InitEvaluationResponse = {\n id: StringUUID,\n createdAt: Date,\n groupId: string,\n name: string,\n projectId: StringUUID,\n};\n\nexport type Dataset = {\n id: StringUUID;\n name: string;\n createdAt: string;\n};\n\nexport type PushDatapointsResponse = {\n datasetId: StringUUID;\n};\n\nexport type EvaluationDatapointDatasetLink = {\n datasetId: StringUUID;\n datapointId: StringUUID;\n createdAt: string;\n};\n\nexport type EvaluationDatapoint<D, T, O> = {\n id: StringUUID;\n data: D;\n target?: T;\n metadata?: Record<string, any>;\n executorOutput?: O;\n scores?: Record<string, number | null>;\n traceId: string;\n index: number;\n executorSpanId?: string;\n datasetLink?: EvaluationDatapointDatasetLink;\n};\n\nexport type GetDatapointsResponse<D, T> = {\n items: Datapoint<D, T>[];\n totalCount: number;\n anyInProject: boolean;\n};\n\nexport type SemanticSearchResult = {\n datasetId: StringUUID;\n data: Record<string, any>;\n content: string;\n score: number;\n};\n\nexport type SemanticSearchResponse = {\n results: SemanticSearchResult[];\n};\n\n/**\n * Span types to categorize spans.\n *\n * LLM spans are auto-instrumented LLM spans.\n * Pipeline spans are top-level spans created by the pipeline runner.\n * Executor and evaluator spans are top-level spans added automatically when doing evaluations.\n */\nexport type SpanType = 'DEFAULT'\n | 'LLM'\n | 'EXECUTOR'\n | 'EVALUATOR'\n | 'HUMAN_EVALUATOR'\n | 'EVALUATION'\n | 'TOOL';\n\n\n/**\n * Trace types to categorize traces.\n * They are used as association properties passed to all spans in a trace.\n *\n */\nexport type TraceType = 'DEFAULT' | 'EVALUATION';\n\n\n/**\n * Tracing levels to conditionally disable tracing.\n *\n * OFF - No tracing is sent.\n * META_ONLY - Only metadata is sent (e.g. tokens, costs, etc.).\n * ALL - All data is sent.\n */\nexport enum TracingLevel {\n OFF = 'off',\n META_ONLY = 'meta_only',\n ALL = 'all',\n}\n\n/**\n * Laminar representation of an OpenTelemetry span context.\n *\n * spanId - The ID of the span.\n * traceId - The ID of the trace.\n * isRemote - Whether the span is remote.\n * spanPath - The span path (span names) leading to this span.\n * spanIdsPath - The span IDs path leading to this span.\n */\nexport type LaminarSpanContext = {\n spanId: StringUUID;\n traceId: StringUUID;\n isRemote: boolean;\n spanPath?: string[];\n spanIdsPath?: StringUUID[];\n userId?: string;\n sessionId?: string;\n metadata?: Record<string, any>;\n traceType?: TraceType;\n tracingLevel?: TracingLevel;\n};\n\n/**\n * Options for masking different types of input fields during browser session recording.\n */\nexport interface MaskInputOptions {\n textarea?: boolean;\n text?: boolean;\n number?: boolean;\n select?: boolean;\n email?: boolean;\n tel?: boolean;\n}\n\n/**\n * Options for browser session recording configuration.\n */\nexport interface SessionRecordingOptions {\n maskInputOptions?: MaskInputOptions;\n}\n","// Forward-compatibility with OTel v2 / v0.200 SDKs\nimport { SpanContext } from \"@opentelemetry/api\";\nimport { IResource } from \"@opentelemetry/resources\";\nimport { ReadableSpan, Span as SdkSpan } from \"@opentelemetry/sdk-trace-base\";\n\n// Type definitions that cover both OTel SDK v1 and v2\n// In v1: spans have parentSpanId and instrumentationLibrary\n// In v2: spans have parentSpanContext and instrumentationScope\ntype OTelSpanCompat = (SdkSpan | ReadableSpan) & {\n parentSpanId?: string;\n parentSpanContext?: SpanContext;\n instrumentationLibrary?: any;\n instrumentationScope?: any;\n};\n\n// In-place edits on span object for compatibility between OTel v1 and v2 SDKs\nexport const makeSpanOtelV2Compatible = (\n span: OTelSpanCompat,\n) => {\n const spanAny = span as any;\n if (spanAny.instrumentationScope && !spanAny.instrumentationLibrary) {\n // Making the spans from V2 compatible with V1\n Object.assign(span, {\n instrumentationLibrary: spanAny.instrumentationScope,\n });\n } else if (spanAny.instrumentationLibrary && !spanAny.instrumentationScope) {\n // Making the spans from V1 compatible with V2\n Object.assign(span, {\n instrumentationScope: spanAny.instrumentationLibrary,\n });\n }\n\n // Handle parent span compatibility between SDK v1 and v2\n // SDK v1 uses parentSpanId (string), SDK v2 uses parentSpanContext (SpanContext)\n if (spanAny.parentSpanContext && !spanAny.parentSpanId) {\n // SDK v2 -> SDK v1: Extract spanId from parentSpanContext\n Object.defineProperty(span, 'parentSpanId', {\n value: spanAny.parentSpanContext.spanId,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n } else if (spanAny.parentSpanId && !spanAny.parentSpanContext) {\n // SDK v1 -> SDK v2: Create a proper SpanContext object\n // We need to get the traceId from the span's own spanContext\n const spanContext = span.spanContext();\n Object.defineProperty(span, 'parentSpanContext', {\n value: {\n traceId: spanContext.traceId,\n spanId: spanAny.parentSpanId,\n traceFlags: spanContext.traceFlags,\n traceState: spanContext.traceState,\n isRemote: spanContext.isRemote,\n },\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n};\n\nexport const getParentSpanId = (\n span: OTelSpanCompat,\n): string | undefined => {\n const spanAny = span as any;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return spanAny.parentSpanContext?.spanId ?? spanAny.parentSpanId;\n};\n\n/**\n * Creates a Resource object compatible with both OTel v1 and v2.\n *\n * In v1, Resource is a class constructor: new Resource(attributes)\n * In v2, Resource class is not exported; use resourceFromAttributes(attributes) instead\n *\n * This function automatically detects which version is available and uses the appropriate API.\n */\nexport const createResource = (\n attributes: Record<string, string>,\n): IResource => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const resources = require(\"@opentelemetry/resources\");\n\n // v2 uses resourceFromAttributes (0.200+ SDK, 2.x API)\n if (resources.resourceFromAttributes) {\n return resources.resourceFromAttributes(attributes);\n }\n\n // v1 uses Resource constructor (0.57.x SDK, 1.x API)\n if (resources.Resource) {\n return new resources.Resource(attributes);\n }\n\n throw new Error(\"Unable to create Resource: neither v1 nor v2 API found\");\n } catch (error) {\n throw new Error(\n `Failed to create Resource: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n};\n","\nimport {\n Attributes,\n AttributeValue,\n Exception,\n HrTime,\n Link,\n type Span,\n SpanContext,\n SpanKind,\n SpanStatus,\n TimeInput,\n} from \"@opentelemetry/api\";\nimport { InstrumentationLibrary, InstrumentationScope } from \"@opentelemetry/core\";\nimport { IResource } from \"@opentelemetry/resources\";\nimport { ReadableSpan, type Span as SdkSpan, TimedEvent } from \"@opentelemetry/sdk-trace-base\";\n\nimport { LaminarSpanContext, TraceType, TracingLevel } from \"../../types\";\nimport {\n initializeLogger,\n metadataToAttributes,\n otelSpanIdToUUID,\n otelTraceIdToUUID,\n StringUUID,\n} from \"../../utils\";\nimport {\n ASSOCIATION_PROPERTIES,\n SESSION_ID,\n SPAN_IDS_PATH,\n SPAN_INPUT,\n SPAN_OUTPUT,\n SPAN_PATH,\n TRACE_TYPE,\n USER_ID,\n} from \"./attributes\";\nimport { getParentSpanId, makeSpanOtelV2Compatible } from \"./compat\";\nimport { LaminarContextManager } from \"./context\";\n\nconst logger = initializeLogger();\n\n// We decided to implement raw otel Span interface and have _span: SdkSpan because SdkSpan\n// discourages use of its constructor directly in favour of Tracer.startSpan()\n// We are using constructor directly because we're implementing Tracer interface as well.\nexport class LaminarSpan implements Span, ReadableSpan {\n private _span: SdkSpan;\n // Whether the span is started by Laminar.startActiveSpan()\n private _activated: boolean;\n\n constructor(span: Span, activated?: boolean) {\n if (span instanceof LaminarSpan) {\n this._activated = span.isActivated;\n this._span = span._span;\n } else {\n this._activated = activated ?? false;\n\n // This line assumes that the span passed here is an SdkSpan. Reason:\n // When using default OpenTelemetry Node SDK, i.e. NodeTracerProvider.getTracer().startSpan(),\n // the span returned is an SdkSpan. SDK span implements ReadableSpan, so attributes\n // can be accessed. Span, i.e. OpenTelemetry API Span, does not require that, so custom\n // SDK implementations may not implement certain ReadableSpan methods, in particular\n // `attributes` that we need to access.\n this._span = span as SdkSpan;\n }\n\n this.name = (this._span as unknown as SdkSpan).name;\n this.kind = (this._span as unknown as SdkSpan).kind;\n this.startTime = (this._span as unknown as SdkSpan).startTime;\n this.endTime = (this._span as unknown as SdkSpan).endTime;\n this.status = (this._span as unknown as SdkSpan).status;\n this.attributes = (this._span as unknown as SdkSpan).attributes;\n this.links = (this._span as unknown as SdkSpan).links;\n this.events = (this._span as unknown as SdkSpan).events;\n this.duration = (this._span as unknown as SdkSpan).duration;\n this.ended = (this._span as unknown as SdkSpan).ended;\n this.resource = (this._span as unknown as SdkSpan).resource;\n this.instrumentationLibrary = (this._span as unknown as SdkSpan).instrumentationLibrary;\n this.droppedAttributesCount = (this._span as unknown as SdkSpan).droppedAttributesCount;\n this.droppedEventsCount = (this._span as unknown as SdkSpan).droppedEventsCount;\n this.droppedLinksCount = (this._span as unknown as SdkSpan).droppedLinksCount;\n this.makeOtelV2Compatible();\n LaminarContextManager.addActiveSpan(this.spanContext().spanId);\n }\n\n name: string;\n kind: SpanKind;\n parentSpanId?: string | undefined;\n startTime: HrTime;\n endTime: HrTime;\n status: SpanStatus;\n attributes: Attributes;\n links: Link[];\n events: TimedEvent[];\n duration: HrTime;\n ended: boolean;\n resource: IResource;\n instrumentationLibrary: InstrumentationLibrary;\n droppedAttributesCount: number;\n droppedEventsCount: number;\n droppedLinksCount: number;\n\n public spanContext(): SpanContext {\n return this._span.spanContext();\n }\n\n public setAttribute(key: string, value: AttributeValue): this {\n this._span.setAttribute(key, value);\n return this;\n }\n\n public setAttributes(attributes: Attributes): this {\n this._span.setAttributes(attributes);\n return this;\n }\n\n public addEvent(\n name: string,\n attributesOrStartTime?: Attributes | TimeInput,\n startTime?: TimeInput,\n ): this {\n this._span.addEvent(name, attributesOrStartTime, startTime);\n return this;\n }\n\n public addLink(link: Link): this {\n this._span.addLink(link);\n return this;\n }\n\n public addLinks(links: Link[]): this {\n this._span.addLinks(links);\n return this;\n }\n\n public setStatus(status: SpanStatus): this {\n this._span.setStatus(status);\n return this;\n }\n\n public updateName(name: string): this {\n this._span.updateName(name);\n return this;\n }\n\n public end(endTime?: TimeInput): void {\n if (!this._span.isRecording()) {\n // This will log a warning and do nothing.\n return this._span.end(endTime);\n }\n\n // Remove from global registry on end\n LaminarContextManager.removeActiveSpan(this.spanContext().spanId);\n\n if (this._activated) {\n LaminarContextManager.popContext();\n }\n return this._span.end(endTime);\n }\n\n public set activated(activated: boolean) {\n this._activated = activated;\n }\n\n public isRecording(): boolean {\n return this._span.isRecording();\n }\n\n public recordException(exception: Exception, time?: TimeInput): void {\n return this._span.recordException(exception, time);\n }\n\n // ================================\n // Laminar specific methods\n // ================================\n\n public setTraceSessionId(sessionId: string): void {\n this._span.setAttribute(SESSION_ID, sessionId);\n }\n\n public setTraceUserId(userId: string): void {\n this._span.setAttribute(USER_ID, userId);\n }\n\n public setTraceMetadata(metadata: Record<string, any>): void {\n this._span.setAttributes(metadataToAttributes(metadata));\n }\n\n public setInput(input: any): void {\n const finalInput = typeof input === 'string' ? input : JSON.stringify(input);\n this._span.setAttribute(SPAN_INPUT, finalInput);\n }\n\n public setOutput(output: any): void {\n const finalOutput = typeof output === 'string' ? output : JSON.stringify(output);\n this._span.setAttribute(SPAN_OUTPUT, finalOutput);\n }\n\n public setTags(tags: string[]): void {\n this._span.setAttribute(`${ASSOCIATION_PROPERTIES}.tags`, Array.from(new Set(tags)));\n }\n\n public addTags(tags: string[]): void {\n const currentTags = this.tags;\n this.setTags(Array.from(new Set([...currentTags, ...tags])));\n }\n\n public getLaminarSpanContext(): LaminarSpanContext {\n let spanPath: string[] = [];\n let spanIdsPath: StringUUID[] = [];\n let userId;\n let sessionId;\n let traceType;\n let tracingLevel = TracingLevel.ALL;\n const metadata: Record<string, AttributeValue> = {};\n\n if (this._span.attributes) {\n spanPath = this._span.attributes[SPAN_PATH] as string[];\n spanIdsPath = this._span.attributes[SPAN_IDS_PATH] as StringUUID[];\n userId = this._span.attributes[USER_ID] as string;\n sessionId = this._span.attributes[SESSION_ID] as string;\n traceType = this._span.attributes[TRACE_TYPE] as TraceType;\n tracingLevel = this._span.attributes[\n `${ASSOCIATION_PROPERTIES}.tracing_level`\n ] as TracingLevel ?? TracingLevel.ALL;\n for (const [key, rawValue] of Object.entries(this._span.attributes)) {\n if (key.startsWith(`${ASSOCIATION_PROPERTIES}.metadata.`)) {\n let value = rawValue!;\n try {\n value = JSON.parse(value as string);\n } catch {\n // Ignore\n }\n metadata[key.replace(`${ASSOCIATION_PROPERTIES}.metadata.`, '')] = value;\n }\n }\n } else {\n logger.warn(\n \"Attributes object is not available. Most likely the span is not a LaminarSpan \" +\n \"and not an OpenTelemetry default SDK Span. Span path and ids path will be empty.\",\n );\n }\n\n return {\n spanId: otelSpanIdToUUID(this._span.spanContext().spanId) as StringUUID,\n traceId: otelTraceIdToUUID(this._span.spanContext().traceId),\n isRemote: this._span.spanContext().isRemote ?? false,\n spanPath: spanPath,\n spanIdsPath: spanIdsPath,\n userId: userId,\n sessionId: sessionId,\n metadata: metadata,\n traceType: traceType,\n tracingLevel: tracingLevel,\n };\n }\n\n public spanId(\n format: 'otel' | 'uuid' = 'otel',\n ): string {\n const spanId = this._span.spanContext().spanId;\n if (format === 'otel') {\n return spanId;\n }\n return otelSpanIdToUUID(spanId);\n }\n\n public traceId(\n format: 'otel' | 'uuid' = 'otel',\n ): string {\n const traceId = this._span.spanContext().traceId;\n if (format === 'otel') {\n return traceId;\n }\n return otelTraceIdToUUID(traceId);\n }\n\n public get tags(): string[] {\n if (!this._span.attributes) {\n logger.warn(\n \"[LaminarSpan.tags] WARNING. Current span does not have attributes object. \" +\n \"Possibly, the span was created with a custom OTel SDK. Returning an empty list. \" +\n \"Help: OpenTelemetry API does not guarantee reading attributes from a span, but OTel \" +\n \"SDK allows it by default. Laminar SDK allows to read attributes too.\",\n );\n return [];\n }\n return this._span.attributes[`${ASSOCIATION_PROPERTIES}.tags`] as string[] ?? [];\n }\n\n public get laminarAssociationProperties(): {\n metadata?: Record<string, any>;\n userId?: string;\n sessionId?: string;\n traceType?: TraceType;\n tracingLevel?: TracingLevel;\n } {\n if (!this._span.attributes) {\n logger.warn(\n \"[LaminarSpan.laminarAssociationProperties] WARNING. Current span does not have \" +\n \"attributes object. Possibly, the span was created with a custom OTel SDK. Returning an \" +\n \"empty object. Help: OpenTelemetry API does not guarantee reading attributes from a \" +\n \"span, but OTel SDK allows it by default. Laminar SDK allows to read attributes too.\",\n );\n return {};\n }\n try {\n const properties: Record<string, any> = {};\n const metadata: Record<string, any> = {};\n for (const [key, rawValue] of Object.entries(this._span.attributes)) {\n if (!key.startsWith(`${ASSOCIATION_PROPERTIES}.`)) {\n continue;\n }\n let value = rawValue!;\n if (key.startsWith(`${ASSOCIATION_PROPERTIES}.metadata.`)) {\n const metaKey = key.replace(`${ASSOCIATION_PROPERTIES}.metadata.`, '');\n try {\n value = JSON.parse(value as string);\n } catch {\n // Ignore\n }\n metadata[metaKey] = value;\n }\n }\n properties.tracingLevel = this._span.attributes[\n `${ASSOCIATION_PROPERTIES}.tracing_level`\n ] as TracingLevel ?? TracingLevel.ALL;\n properties.userId = this._span.attributes[USER_ID] as string ?? undefined;\n properties.sessionId = this._span.attributes[SESSION_ID] as string ?? undefined;\n properties.traceType = this._span.attributes[TRACE_TYPE] as TraceType ?? undefined;\n return {\n metadata,\n ...properties,\n };\n } catch {\n return {};\n }\n }\n\n // ================================\n // OTel V2 compatibility\n // ================================\n\n public makeOtelV2Compatible(): void {\n makeSpanOtelV2Compatible(this._span);\n }\n\n public get instrumentationScope(): InstrumentationScope {\n return this._span.instrumentationLibrary as unknown as InstrumentationScope;\n }\n\n public get parentSpanContext(): SpanContext | undefined {\n const parentSpanId = getParentSpanId(this._span);\n if (!parentSpanId) {\n return undefined;\n }\n return {\n spanId: parentSpanId,\n traceId: this.spanContext().traceId,\n // TODO: somehow get the traceFlags from the parent span\n traceFlags: this.spanContext().traceFlags,\n };\n }\n\n public getParentSpanId(): string | undefined {\n return getParentSpanId(this._span as unknown as SdkSpan);\n }\n\n public get isActivated(): boolean {\n return this._activated;\n }\n}\n","import {\n Context, context as contextApi,\n createContextKey, ROOT_CONTEXT, trace } from \"@opentelemetry/api\";\nimport { AsyncLocalStorage } from \"async_hooks\";\n\nimport { TraceType, TracingLevel } from \"../../types\";\nimport { LaminarSpan } from \"./span\";\n\nexport const CONTEXT_SPAN_PATH_KEY = createContextKey(\"span_path\");\nexport const ASSOCIATION_PROPERTIES_KEY = createContextKey(\n \"association_properties\",\n);\nexport const CONTEXT_GLOBAL_METADATA_KEY = createContextKey(\n \"global_metadata\",\n);\n\nexport class LaminarContextManager {\n private static _asyncLocalStorage = new AsyncLocalStorage<Context[]>();\n private static _globalMetadata: Record<string, any> = {};\n private static _inheritGlobalContext: boolean = false;\n // Static registry for cross-async span management\n // We're keeping track of spans have started (and running) here for the cases when span\n // is started in one async context and ended in another\n // We use this registry to ignore the context of spans that were already ended in\n // another async context.\n // LaminarSpan adds and removes itself to and from this registry in start()\n // and end() methods respectively.\n private static _activeSpans: Set<string> = new Set();\n\n private constructor() {\n throw new Error(\"LaminarContextManager is a static class and cannot be instantiated\");\n }\n\n public static getContext(): Context {\n const contexts = this.getContextStack();\n\n // Walk through contexts from most recent to oldest\n // We're doing it this way because we want to return the most recent context\n // that has an active span\n // This is primarily for the cases when span is started in one async context\n // and ended in another\n for (let i = contexts.length - 1; i >= 0; i--) {\n const context = contexts[i];\n const span = trace.getSpan(context);\n\n if (!span) {\n // No span in this context, it's valid\n return context;\n }\n\n if (!span.isRecording() && span.spanContext().isRemote) {\n // Span is remote and not recording, it's valid\n return context;\n }\n\n if (!(span instanceof LaminarSpan)) {\n // Span is not a Laminar span, it's valid\n return context;\n }\n\n if (!span.isActivated) {\n // Span is not activated by Laminar.startActiveSpan(), it's valid\n return context;\n }\n\n // Check if the span in this context has been ended\n try {\n const isActive = this._activeSpans.has(span.spanContext().spanId);\n if (isActive) {\n // Span is still active, use this context\n return context;\n }\n // Span has been ended, continue to parent context\n } catch {\n // If we can't check the span, assume it's valid\n return context;\n }\n }\n\n // No valid context found, return ROOT_CONTEXT\n return ROOT_CONTEXT;\n }\n\n public static pushContext(context: Context) {\n const contexts = this.getContextStack();\n const newContexts = [...contexts, context];\n this._asyncLocalStorage.enterWith(newContexts);\n }\n\n public static popContext() {\n const contexts = this.getContextStack();\n if (contexts.length > 0) {\n // Remove the last context and filter out any contexts with inactive spans\n const newContexts = contexts.slice(0, -1).filter(context => {\n const span = trace.getSpan(context);\n\n if (!span) {\n // No span in this context, it's valid\n return true;\n }\n\n // Check if the span in this context has been ended\n try {\n return this._activeSpans.has(span.spanContext().spanId);\n } catch {\n // If we can't check the span, assume it's valid\n return true;\n }\n });\n\n this._asyncLocalStorage.enterWith(newContexts);\n }\n }\n\n public static clearContexts() {\n this._asyncLocalStorage.enterWith([]);\n }\n\n public static clearActiveSpans() {\n this._activeSpans.clear();\n }\n\n public static getContextStack(): Context[] {\n return this._asyncLocalStorage.getStore()\n || (this._inheritGlobalContext ? [contextApi.active()] : []);\n }\n\n /**\n * Run a function with an isolated context stack.\n * This ensures that parallel executions don't interfere with each other.\n */\n public static runWithIsolatedContext<T>(initialStack: Context[], fn: () => T): T {\n return this._asyncLocalStorage.run(initialStack, fn);\n }\n\n public static addActiveSpan(spanId: string): void {\n this._activeSpans.add(spanId);\n }\n\n public static removeActiveSpan(spanId: string): void {\n this._activeSpans.delete(spanId);\n }\n\n public static setAssociationProperties(span: LaminarSpan, context: Context): Context {\n const properties = span.laminarAssociationProperties;\n\n return this.setRawAssociationProperties(properties, context);\n }\n\n public static setRawAssociationProperties(\n properties: Record<string, any>,\n context: Context,\n ): Context {\n let entityContext = context;\n const userId = properties.userId;\n const sessionId = properties.sessionId;\n const traceType = properties.traceType;\n const metadata = properties.metadata;\n const tracingLevel = properties.tracingLevel;\n entityContext = entityContext.setValue(ASSOCIATION_PROPERTIES_KEY, {\n userId: userId,\n sessionId: sessionId,\n traceType: traceType,\n metadata: metadata,\n tracingLevel: tracingLevel,\n });\n return entityContext;\n }\n\n public static setGlobalMetadata(globalMetadata: Record<string, any>) {\n this._globalMetadata = globalMetadata;\n }\n\n public static getGlobalMetadata(): Record<string, any> {\n return this._globalMetadata;\n }\n\n public static getAssociationProperties(): {\n userId?: string;\n sessionId?: string;\n traceType?: TraceType;\n tracingLevel?: TracingLevel;\n metadata?: Record<string, any>;\n } {\n const entityContext = this.getContext();\n return entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {};\n }\n\n public static set inheritGlobalContext(inheritGlobalContext: boolean) {\n this._inheritGlobalContext = inheritGlobalContext;\n }\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","/**\n * Agent resource for interacting with Laminar agents.\n */\n\nimport { trace } from \"@opentelemetry/api\";\n\nimport { LaminarContextManager } from \"../../opentelemetry-lib/tracing/context\";\nimport { initializeLogger, otelSpanIdToUUID, otelTraceIdToUUID, StringUUID } from \"../../utils\";\nimport { BaseResource } from \"./index\";\n\nconst logger = initializeLogger();\n\n/**\n * Model provider options\n */\nexport type ModelProvider = 'anthropic' | 'bedrock' | 'openai' | 'gemini';\n\nexport type ActionResult = {\n isDone: boolean;\n content?: string | null;\n error?: string | null;\n};\n\n/**\n * Agent output type\n *\n * @property {string} agentState - The state of the agent. Can be used in subsequent runs\n * to resume the agent. Only set if returnAgentState is true. Is a very large\n * stringified JSON object.\n * @property {string} storageState - The storage state of the browser, including auth, cookies, etc.\n * Only set if returnStorageState is true. Is a relatively large stringified JSON object.\n * @property {ActionResult} result - The result of the agent run.\n */\nexport type AgentOutput = {\n result: ActionResult;\n agentState?: string | null;\n storageState?: string | null;\n};\n\n/**\n * Request for running an agent\n */\nexport type RunAgentRequest = {\n prompt: string;\n parentSpanContext?: string;\n modelProvider?: ModelProvider;\n model?: string;\n stream: boolean;\n agentState?: string | null;\n storageState?: string | null;\n enableThinking: boolean;\n timeout?: number;\n cdpUrl?: string;\n maxSteps?: number;\n thinkingTokenBudget?: number;\n startUrl?: string;\n userAgent?: string;\n returnScreenshots?: boolean;\n returnAgentState?: boolean;\n returnStorageState?: boolean;\n disableGiveControl?: boolean;\n};\n\nexport type RunAgentStepChunk = {\n chunkType: \"step\";\n messageId: StringUUID;\n actionResult: ActionResult;\n summary: string;\n screenshot?: string | null;\n};\n\n// This chunk indicates that the explicit timeout has been reached.\n// This is the last chunk in the stream. The only difference between this and a normal step chunk is\n// the chunkType.\nexport type RunAgentTimeoutChunk = {\n chunkType: \"timeout\";\n messageId: StringUUID;\n actionResult: ActionResult;\n summary: string;\n screenshot?: string | null;\n};\n\nexport type RunAgentFinalChunk = {\n chunkType: \"finalOutput\";\n messageId: StringUUID;\n content: AgentOutput;\n};\n\nexport type RunAgentErrorChunk = {\n chunkType: \"error\";\n messageId: StringUUID;\n error: string;\n};\n\n/**\n * Chunk type for streaming responses\n */\nexport type RunAgentResponseChunk = RunAgentStepChunk\n | RunAgentFinalChunk | RunAgentErrorChunk | RunAgentTimeoutChunk;\n\ntype RunAgentOptions = {\n prompt: string;\n parentSpanContext?: string;\n modelProvider?: ModelProvider;\n agentState?: string;\n storageState?: string;\n model?: string;\n stream?: boolean;\n enableThinking?: boolean;\n timeout?: number;\n cdpUrl?: string;\n maxSteps?: number;\n thinkingTokenBudget?: number;\n startUrl?: string;\n userAgent?: string;\n returnScreenshots?: boolean;\n returnAgentState?: boolean;\n returnStorageState?: boolean;\n disableGiveControl?: boolean;\n};\n\n/**\n * Resource for interacting with Laminar agents\n */\nexport class AgentResource extends BaseResource {\n constructor(baseHttpUrl: string, projectApiKey: string) {\n super(baseHttpUrl, projectApiKey);\n }\n\n\n /**\n * Run Laminar index agent\n *\n * @param { RunAgentOptions } options - The options for running the agent\n * @param { string } options.prompt - The prompt for the agent\n * @param { string } [options.parentSpanContext] - The parent span context for tracing\n * @param { ModelProvider } [options.modelProvider] - LLM provider to use\n * @param { string } [options.model] - The model name as specified in the provider API\n * @param { string } [options.agentState] - The agent state to resume the agent from as returned\n * by a previous run.\n * @param { string } [options.storageState] - The browser storage state as returned by a\n * previous run.\n * @param { boolean } [options.enableThinking] - Whether to enable thinking in the underlying\n * LLM. Defaults to true.\n * @param { number } [options.timeout] - The timeout in seconds for the agent. Note: This is a\n * soft timeout. The agent will finish a step even after the timeout has been reached.\n * @param { string } [options.cdpUrl] - The URL of an existing Chrome DevTools Protocol (CDP)\n * browser instance.\n * @param { number } [options.maxSteps] - The maximum number of steps the agent can take.\n * Defaults to 100.\n * @param { number } [options.thinkingTokenBudget] - The maximum number of tokens the underlying\n * LLM can spend on thinking per step, if supported by the LLM provider.\n * @param { string } [options.startUrl] - The URL to start the agent on. Make sure it's a\n * valid URL - refer to https://playwright.dev/docs/api/class-page#page-goto\n * If not specified, the agent will infer this from the prompt.\n * @param { string } [options.userAgent] - The user agent to set in the browser.\n * If not specified, Laminar will use the default user agent.\n * @param { boolean } [options.returnScreenshots] - IGNORED in non-streaming mode.\n * Defaults to false. Set stream to true for doc comments.\n * @param { boolean } [options.returnAgentState] - Whether to return the agent state.\n * Agent state can be used to resume the agent in subsequent runs.\n * CAUTION: Agent state is a very large object. Defaults to false.\n * @param { boolean } [options.returnStorageState] - Whether to return the storage state.\n * Storage state includes browser cookies, auth, etc.\n * CAUTION: Storage state is a relatively large object. Defaults to false.\n * @param { boolean } [options.disableGiveControl] - Whether to NOT direct the agent\n * to give control back to the user for tasks such as logging in. Defaults to false.\n * @returns { Promise<AgentOutput> } The agent output\n */\n public run(options: Omit<RunAgentOptions, 'stream'>): Promise<AgentOutput>;\n\n /**\n * Run Laminar index agent\n *\n * @param { RunAgentOptions } options - The options for running the agent\n * @param { string } options.prompt - The prompt for the agent\n * @param { string } [options.parentSpanContext] - The parent span context for tracing\n * @param { ModelProvider } [options.modelProvider] - LLM provider to use\n * @param { string } [options.model] - The model name as specified in the provider API\n * @param { string } [options.agentState] - The agent state to resume the agent from as\n * returned by a previous run.\n * @param { string } [options.storageState] - The browser storage state as returned by a\n * previous run.\n * @param { boolean } [options.enableThinking] - Whether to enable thinking in the\n * underlying LLM. Defaults to true.\n * @param { number } [options.timeout] - The timeout in seconds for the agent.\n * Note: This is a soft timeout. The agent will finish a step even after the timeout has\n * been reached.\n * @param { string } [options.cdpUrl] - The URL of an existing Chrome DevTools Protocol\n * (CDP) browser instance.\n * @param { number } [options.maxSteps] - The maximum number of steps the agent can take.\n * Defaults to 100.\n * @param { number } [options.thinkingTokenBudget] - The maximum number of tokens the\n * underlying LLM can spend on thinking per step, if supported by the LLM provider.\n * @param { string } [options.startUrl] - The URL to start the agent on. Make sure it's\n * a valid URL - refer to https://playwright.dev/docs/api/class-page#page-goto\n * If not specified, the agent will infer this from the prompt.\n * @param { string } [options.userAgent] - The user agent to set in the browser.\n * If not specified, Laminar will use the default user agent.\n * @param { boolean } [options.returnScreenshots] - IGNORED in non-streaming mode.\n * Defaults to false. Set stream to true for doc comments.\n * @param { boolean } [options.returnAgentState] - Whether to return the agent state.\n * Agent state can be used to resume the agent in subsequent runs.\n * CAUTION: Agent state is a very large object. Defaults to false.\n * @param { boolean } [options.returnStorageState] - Whether to return the storage state.\n * Storage state includes browser cookies, auth, etc.\n * CAUTION: Storage state is a relatively large object. Defaults to false.\n * @param { boolean } [options.disableGiveControl] - Whether to NOT direct the agent\n * to give control back to the user for tasks such as logging in. Defaults to false.\n * @returns { Promise<AgentOutput> } The agent output\n */\n public run(options: Omit<RunAgentOptions, 'stream'> & { stream?: false }): Promise<AgentOutput>;\n\n /**\n * Run Laminar index agent\n *\n * @param { RunAgentOptions } options - The options for running the agent\n * @param { string } options.prompt - The prompt for the agent\n * @param { string } [options.parentSpanContext] - The parent span context for tracing\n * @param { ModelProvider } [options.modelProvider] - LLM provider to use\n * @param { string } [options.model] - The model name as specified in the provider API\n * @param { string } [options.agentState] - The agent state to resume the agent from as\n * returned by a previous run.\n * @param { string } [options.storageState] - The browser storage state as returned by\n * a previous run.\n * @param { boolean } [options.enableThinking] - Whether to enable thinking in the\n * underlying LLM. Defaults to true.\n * @param { number } [options.timeout] - The timeout in seconds for the agent. Note:\n * This is a soft timeout. The agent will finish a step even after the timeout has\n * been reached.\n * @param { string } [options.cdpUrl] - The URL of an existing Chrome DevTools Protocol\n * (CDP) browser instance.\n * @param { number } [options.maxSteps] - The maximum number of steps the agent can take.\n * Defaults to 100.\n * @param { number } [options.thinkingTokenBudget] - The maximum number of tokens the\n * underlying LLM can spend on thinking per step, if supported by the LLM provider.\n * @param { string } [options.startUrl] - The URL to start the agent on. Make sure it's\n * a valid URL - refer to https://playwright.dev/docs/api/class-page#page-goto\n * If not specified, the agent will infer this from the prompt.\n * @param { string } [options.userAgent] - The user agent to set in the browser.\n * If not specified, Laminar will use the default user agent.\n * @param { boolean } [options.returnScreenshots] - Whether to return screenshots with\n * each step. Defaults to false. Set stream to true for doc comments.\n * @param { boolean } [options.returnAgentState] - Whether to return the agent state.\n * Agent state can be used to resume the agent in subsequent runs.\n * CAUTION: Agent state is a very large object. Defaults to false.\n * @param { boolean } [options.returnStorageState] - Whether to return the storage state.\n * Storage state includes browser cookies, auth, etc.\n * CAUTION: Storage state is a relatively large object. Defaults to false.\n * @param { boolean } [options.disableGiveControl] - Whether to NOT direct the agent\n * to give control back to the user for tasks such as logging in. Defaults to false.\n * @returns { Promise<ReadableStream<RunAgentResponseChunk>> } The agent output streamed\n */\n public run(options: Omit<RunAgentOptions, 'stream'> & { stream: true }):\n Promise<ReadableStream<RunAgentResponseChunk>>;\n\n /**\n * Run Laminar index agent\n *\n * @param { RunAgentOptions } options - The options for running the agent\n * @param { string } options.prompt - The prompt for the agent\n * @param { string } [options.parentSpanContext] - The parent span context for tracing\n * @param { ModelProvider } [options.modelProvider] - LLM provider to use\n * @param { string } [options.model] - The model name as specified in the provider API\n * @param { boolean } [options.stream] - Whether to stream the response. Defaults to false.\n * @param { boolean } [options.enableThinking] - Whether to enable thinking in the underlying\n * LLM. Defaults to true.\n * @param { number } [options.timeout] - The timeout in seconds for the agent.\n * Note: This is a soft timeout. The agent will finish a step even after the timeout has\n * been reached.\n * @param { string } [options.cdpUrl] - The URL of an existing Chrome DevTools Protocol\n * (CDP) browser instance.\n * @param { number } [options.maxSteps] - The maximum number of steps the agent can take.\n * Defaults to 100.\n * @param { number } [options.thinkingTokenBudget] - The maximum number of tokens the underlying\n * LLM can spend on thinking per step, if supported by the LLM provider.\n * @param { string } [options.startUrl] - The URL to start the agent on.\n * Make sure it's a valid URL - refer to https://playwright.dev/docs/api/class-page#page-goto\n * If not specified, the agent will infer this from the prompt.\n * @param { string } [options.userAgent] - The user agent to set in the browser.\n * If not specified, Laminar will use the default user agent.\n * @param { boolean } [options.returnScreenshots] - Whether to return screenshots with\n * each step. Defaults to false.\n * @param { boolean } [options.returnAgentState] - Whether to return the agent state.\n * Agent state can be used to resume the agent in subsequent runs.\n * CAUTION: Agent state is a very large object. Defaults to false.\n * @param { boolean } [options.returnStorageState] - Whether to return the storage state.\n * Storage state includes browser cookies, auth, etc.\n * CAUTION: Storage state is a relatively large object. Defaults to false.\n * @param { boolean } [options.disableGiveControl] - Whether to NOT direct the agent\n * to give control back to the user for tasks such as logging in. Defaults to false.\n * @returns { Promise<AgentOutput | ReadableStream<RunAgentResponseChunk>> }\n * The agent output or a stream of response chunks\n */\n public async run({\n prompt,\n parentSpanContext,\n modelProvider,\n model,\n stream,\n enableThinking,\n timeout,\n cdpUrl,\n agentState,\n storageState,\n maxSteps,\n thinkingTokenBudget,\n startUrl,\n userAgent,\n returnScreenshots,\n returnAgentState,\n returnStorageState,\n disableGiveControl,\n }: RunAgentOptions): Promise<AgentOutput | ReadableStream<RunAgentResponseChunk>> {\n // Handle parent span context from current context if not provided\n let requestParentSpanContext = parentSpanContext;\n\n if (!requestParentSpanContext) {\n const currentSpan = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n if (currentSpan && currentSpan.isRecording()) {\n const traceId = otelTraceIdToUUID(currentSpan.spanContext().traceId);\n const spanId = otelSpanIdToUUID(currentSpan.spanContext().spanId) as StringUUID;\n requestParentSpanContext = JSON.stringify({\n trace_id: traceId,\n span_id: spanId,\n is_remote: currentSpan.spanContext().isRemote,\n });\n }\n }\n\n const request: RunAgentRequest = {\n prompt,\n parentSpanContext: requestParentSpanContext,\n modelProvider,\n model,\n stream: true,\n enableThinking: enableThinking ?? true,\n timeout,\n cdpUrl,\n agentState,\n storageState,\n maxSteps,\n thinkingTokenBudget,\n startUrl,\n userAgent,\n returnScreenshots: returnScreenshots ?? false,\n returnAgentState: returnAgentState ?? false,\n returnStorageState: returnStorageState ?? false,\n disableGiveControl: disableGiveControl ?? false,\n };\n\n // For streaming case, return the ReadableStream directly\n if (stream) {\n return this.runStreaming(request);\n } else {\n // For non-streaming case, process all chunks and return the final result\n return await this.runNonStreaming(request);\n }\n }\n\n /**\n * Run agent in streaming mode\n */\n private async runStreaming(\n request: RunAgentRequest,\n ): Promise<ReadableStream<RunAgentResponseChunk>> {\n const response = await fetch(this.baseHttpUrl + \"/v1/agent/run\", {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n await this.handleError(response);\n }\n if (!response.body) {\n throw new Error(\"Response body is null\");\n }\n\n return response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new TransformStream({\n start(this: { buffer: string }) {\n this.buffer = \"\";\n },\n transform(this: { buffer: string }, chunk, controller) {\n this.buffer += chunk;\n\n // Split buffer into lines\n const lines = this.buffer.split(\"\\n\");\n // Keep the last (potentially incomplete) line in the buffer\n this.buffer = lines.pop() || \"\";\n\n // Process complete lines\n for (const line of lines) {\n if (line.startsWith(\"[DONE]\")) {\n controller.terminate();\n return;\n }\n if (!line.startsWith(\"data: \")) {\n continue;\n }\n const jsonStr = line.substring(6);\n if (jsonStr) {\n try {\n const parsed = JSON.parse(jsonStr) as RunAgentResponseChunk;\n controller.enqueue(parsed);\n } catch (error) {\n logger.error(\"Error parsing JSON: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n },\n flush(this: { buffer: string }, controller) {\n // Process any remaining data in the buffer\n if (this.buffer) {\n if (this.buffer.startsWith(\"data: \")) {\n const jsonStr = this.buffer.substring(6);\n if (jsonStr) {\n try {\n const parsed = JSON.parse(jsonStr) as RunAgentResponseChunk;\n controller.enqueue(parsed);\n } catch (error) {\n logger.error(\"Error parsing JSON: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n }\n },\n }));\n }\n\n /**\n * Run agent in non-streaming mode\n */\n private async runNonStreaming(request: RunAgentRequest): Promise<AgentOutput> {\n const stream = await this.runStreaming(request);\n const reader = stream.getReader();\n let finalChunk: RunAgentResponseChunk | null = null;\n let errorChunk: RunAgentErrorChunk | null = null;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value.chunkType === \"finalOutput\") {\n finalChunk = value;\n break;\n } else if (value.chunkType === \"error\") {\n errorChunk = value;\n break;\n } else if (value.chunkType === \"timeout\") {\n errorChunk = {\n chunkType: \"error\",\n messageId: value.messageId,\n error: \"Timeout\",\n };\n break;\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (errorChunk) {\n throw new Error(errorChunk.error);\n }\n\n return finalChunk?.content || { result: { isDone: true } };\n }\n}\n","","export const getLangVersion: () => string | undefined = () => {\n if (process?.versions?.node) {\n return `node@${process.versions.node}`;\n }\n// else if (Deno?.version) {\n// return `deno@${Deno?.version?.deno}`;\n// }\n};\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 { Datapoint } from \"../../evaluations\";\nimport { Dataset, GetDatapointsResponse, PushDatapointsResponse } from \"../../types\";\nimport { initializeLogger, StringUUID } 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 { EvaluationDatapoint, GetDatapointsResponse, InitEvaluationResponse } from \"../../types\";\nimport { initializeLogger, newUUID, slicePayload, StringUUID } 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 { isStringUUID, otelSpanIdToUUID, otelTraceIdToUUID, StringUUID } 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","/** 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 { config } from \"dotenv\";\n\nimport { AgentResource } from \"./resources/agent\";\nimport { BrowserEventsResource } from \"./resources/browser-events\";\nimport { DatasetsResource } from \"./resources/datasets\";\nimport { EvalsResource } from \"./resources/evals\";\nimport { EvaluatorsResource } from \"./resources/evaluators\";\nimport { TagsResource } from \"./resources/tags\";\n\nexport class LaminarClient {\n private baseUrl: string;\n private projectApiKey: string;\n private _agent: AgentResource;\n private _browserEvents: BrowserEventsResource;\n private _datasets: DatasetsResource;\n private _evals: EvalsResource;\n private _evaluators: EvaluatorsResource;\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 config({\n quiet: true,\n });\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._agent = new AgentResource(this.baseUrl, this.projectApiKey);\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._tags = new TagsResource(this.baseUrl, this.projectApiKey);\n }\n\n public get agent() {\n return this._agent;\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 tags() {\n return this._tags;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client-Bp0oS3Ur.mjs","names":["logger","spanPath: string[]","spanIdsPath: StringUUID[]","metadata: Record<string, AttributeValue>","properties: Record<string, any>","metadata: Record<string, any>","context","contextApi","logger","request: RunAgentRequest","finalChunk: RunAgentResponseChunk | null","errorChunk: RunAgentErrorChunk | null","getLangVersion: () => string | undefined","SDK_VERSION","logger","response: PushDatapointsResponse | undefined","paramsObj: Record<string, string>","partialDatapoint: EvaluationDatapoint<D, T, any>","lastResponse: Response | null","payload: CreateEvaluatorScoreRequestWithTraceId | CreateEvaluatorScoreRequestWithSpanId"],"sources":["../src/types.ts","../src/opentelemetry-lib/tracing/compat.ts","../src/opentelemetry-lib/tracing/span.ts","../src/opentelemetry-lib/tracing/context.ts","../src/client/resources/index.ts","../src/client/resources/agent.ts","../package.json","../src/version.ts","../src/client/resources/browser-events.ts","../src/client/resources/datasets.ts","../src/client/resources/evals.ts","../src/client/resources/evaluators.ts","../src/client/resources/tags.ts","../src/client/index.ts"],"sourcesContent":["import { type Datapoint } from \"./evaluations\";\nimport { StringUUID } from \"./utils\";\n\nexport type Event = {\n id: StringUUID;\n templateName: string;\n timestamp: Date;\n spanId: StringUUID;\n value: number | string | null; // number\n};\n\nexport type InitEvaluationResponse = {\n id: StringUUID,\n createdAt: Date,\n groupId: string,\n name: string,\n projectId: StringUUID,\n};\n\nexport type Dataset = {\n id: StringUUID;\n name: string;\n createdAt: string;\n};\n\nexport type PushDatapointsResponse = {\n datasetId: StringUUID;\n};\n\nexport type EvaluationDatapointDatasetLink = {\n datasetId: StringUUID;\n datapointId: StringUUID;\n createdAt: string;\n};\n\nexport type EvaluationDatapoint<D, T, O> = {\n id: StringUUID;\n data: D;\n target?: T;\n metadata?: Record<string, any>;\n executorOutput?: O;\n scores?: Record<string, number | null>;\n traceId: string;\n index: number;\n executorSpanId?: string;\n datasetLink?: EvaluationDatapointDatasetLink;\n};\n\nexport type GetDatapointsResponse<D, T> = {\n items: Datapoint<D, T>[];\n totalCount: number;\n anyInProject: boolean;\n};\n\nexport type SemanticSearchResult = {\n datasetId: StringUUID;\n data: Record<string, any>;\n content: string;\n score: number;\n};\n\nexport type SemanticSearchResponse = {\n results: SemanticSearchResult[];\n};\n\n/**\n * Span types to categorize spans.\n *\n * LLM spans are auto-instrumented LLM spans.\n * Pipeline spans are top-level spans created by the pipeline runner.\n * Executor and evaluator spans are top-level spans added automatically when doing evaluations.\n */\nexport type SpanType = 'DEFAULT'\n | 'LLM'\n | 'EXECUTOR'\n | 'EVALUATOR'\n | 'HUMAN_EVALUATOR'\n | 'EVALUATION'\n | 'TOOL';\n\n\n/**\n * Trace types to categorize traces.\n * They are used as association properties passed to all spans in a trace.\n *\n */\nexport type TraceType = 'DEFAULT' | 'EVALUATION';\n\n\n/**\n * Tracing levels to conditionally disable tracing.\n *\n * OFF - No tracing is sent.\n * META_ONLY - Only metadata is sent (e.g. tokens, costs, etc.).\n * ALL - All data is sent.\n */\nexport enum TracingLevel {\n OFF = 'off',\n META_ONLY = 'meta_only',\n ALL = 'all',\n}\n\n/**\n * Laminar representation of an OpenTelemetry span context.\n *\n * spanId - The ID of the span.\n * traceId - The ID of the trace.\n * isRemote - Whether the span is remote.\n * spanPath - The span path (span names) leading to this span.\n * spanIdsPath - The span IDs path leading to this span.\n */\nexport type LaminarSpanContext = {\n spanId: StringUUID;\n traceId: StringUUID;\n isRemote: boolean;\n spanPath?: string[];\n spanIdsPath?: StringUUID[];\n userId?: string;\n sessionId?: string;\n metadata?: Record<string, any>;\n traceType?: TraceType;\n tracingLevel?: TracingLevel;\n};\n\n/**\n * Options for masking different types of input fields during browser session recording.\n */\nexport interface MaskInputOptions {\n textarea?: boolean;\n text?: boolean;\n number?: boolean;\n select?: boolean;\n email?: boolean;\n tel?: boolean;\n}\n\n/**\n * Options for browser session recording configuration.\n */\nexport interface SessionRecordingOptions {\n maskInputOptions?: MaskInputOptions;\n}\n","// Forward-compatibility with OTel v2 / v0.200 SDKs\nimport { SpanContext } from \"@opentelemetry/api\";\nimport { IResource } from \"@opentelemetry/resources\";\nimport { ReadableSpan, Span as SdkSpan } from \"@opentelemetry/sdk-trace-base\";\n\n// Type definitions that cover both OTel SDK v1 and v2\n// In v1: spans have parentSpanId and instrumentationLibrary\n// In v2: spans have parentSpanContext and instrumentationScope\ntype OTelSpanCompat = (SdkSpan | ReadableSpan) & {\n parentSpanId?: string;\n parentSpanContext?: SpanContext;\n instrumentationLibrary?: any;\n instrumentationScope?: any;\n};\n\n// In-place edits on span object for compatibility between OTel v1 and v2 SDKs\nexport const makeSpanOtelV2Compatible = (\n span: OTelSpanCompat,\n) => {\n const spanAny = span as any;\n if (spanAny.instrumentationScope && !spanAny.instrumentationLibrary) {\n // Making the spans from V2 compatible with V1\n Object.assign(span, {\n instrumentationLibrary: spanAny.instrumentationScope,\n });\n } else if (spanAny.instrumentationLibrary && !spanAny.instrumentationScope) {\n // Making the spans from V1 compatible with V2\n Object.assign(span, {\n instrumentationScope: spanAny.instrumentationLibrary,\n });\n }\n\n // Handle parent span compatibility between SDK v1 and v2\n // SDK v1 uses parentSpanId (string), SDK v2 uses parentSpanContext (SpanContext)\n if (spanAny.parentSpanContext && !spanAny.parentSpanId) {\n // SDK v2 -> SDK v1: Extract spanId from parentSpanContext\n Object.defineProperty(span, 'parentSpanId', {\n value: spanAny.parentSpanContext.spanId,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n } else if (spanAny.parentSpanId && !spanAny.parentSpanContext) {\n // SDK v1 -> SDK v2: Create a proper SpanContext object\n // We need to get the traceId from the span's own spanContext\n const spanContext = span.spanContext();\n Object.defineProperty(span, 'parentSpanContext', {\n value: {\n traceId: spanContext.traceId,\n spanId: spanAny.parentSpanId,\n traceFlags: spanContext.traceFlags,\n traceState: spanContext.traceState,\n isRemote: spanContext.isRemote,\n },\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n};\n\nexport const getParentSpanId = (\n span: OTelSpanCompat,\n): string | undefined => {\n const spanAny = span as any;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return spanAny.parentSpanContext?.spanId ?? spanAny.parentSpanId;\n};\n\n/**\n * Creates a Resource object compatible with both OTel v1 and v2.\n *\n * In v1, Resource is a class constructor: new Resource(attributes)\n * In v2, Resource class is not exported; use resourceFromAttributes(attributes) instead\n *\n * This function automatically detects which version is available and uses the appropriate API.\n */\nexport const createResource = (\n attributes: Record<string, string>,\n): IResource => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const resources = require(\"@opentelemetry/resources\");\n\n // v2 uses resourceFromAttributes (0.200+ SDK, 2.x API)\n if (resources.resourceFromAttributes) {\n return resources.resourceFromAttributes(attributes);\n }\n\n // v1 uses Resource constructor (0.57.x SDK, 1.x API)\n if (resources.Resource) {\n return new resources.Resource(attributes);\n }\n\n throw new Error(\"Unable to create Resource: neither v1 nor v2 API found\");\n } catch (error) {\n throw new Error(\n `Failed to create Resource: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n};\n","\nimport {\n Attributes,\n AttributeValue,\n Exception,\n HrTime,\n Link,\n type Span,\n SpanContext,\n SpanKind,\n SpanStatus,\n TimeInput,\n} from \"@opentelemetry/api\";\nimport { InstrumentationLibrary, InstrumentationScope } from \"@opentelemetry/core\";\nimport { IResource } from \"@opentelemetry/resources\";\nimport { ReadableSpan, type Span as SdkSpan, TimedEvent } from \"@opentelemetry/sdk-trace-base\";\n\nimport { LaminarSpanContext, TraceType, TracingLevel } from \"../../types\";\nimport {\n initializeLogger,\n metadataToAttributes,\n otelSpanIdToUUID,\n otelTraceIdToUUID,\n StringUUID,\n} from \"../../utils\";\nimport {\n ASSOCIATION_PROPERTIES,\n SESSION_ID,\n SPAN_IDS_PATH,\n SPAN_INPUT,\n SPAN_OUTPUT,\n SPAN_PATH,\n TRACE_TYPE,\n USER_ID,\n} from \"./attributes\";\nimport { getParentSpanId, makeSpanOtelV2Compatible } from \"./compat\";\nimport { LaminarContextManager } from \"./context\";\n\nconst logger = initializeLogger();\n\n// We decided to implement raw otel Span interface and have _span: SdkSpan because SdkSpan\n// discourages use of its constructor directly in favour of Tracer.startSpan()\n// We are using constructor directly because we're implementing Tracer interface as well.\nexport class LaminarSpan implements Span, ReadableSpan {\n private _span: SdkSpan;\n // Whether the span is started by Laminar.startActiveSpan()\n private _activated: boolean;\n\n constructor(span: Span, activated?: boolean) {\n if (span instanceof LaminarSpan) {\n this._activated = span.isActivated;\n this._span = span._span;\n } else {\n this._activated = activated ?? false;\n\n // This line assumes that the span passed here is an SdkSpan. Reason:\n // When using default OpenTelemetry Node SDK, i.e. NodeTracerProvider.getTracer().startSpan(),\n // the span returned is an SdkSpan. SDK span implements ReadableSpan, so attributes\n // can be accessed. Span, i.e. OpenTelemetry API Span, does not require that, so custom\n // SDK implementations may not implement certain ReadableSpan methods, in particular\n // `attributes` that we need to access.\n this._span = span as SdkSpan;\n }\n\n this.name = (this._span as unknown as SdkSpan).name;\n this.kind = (this._span as unknown as SdkSpan).kind;\n this.startTime = (this._span as unknown as SdkSpan).startTime;\n this.endTime = (this._span as unknown as SdkSpan).endTime;\n this.status = (this._span as unknown as SdkSpan).status;\n this.attributes = (this._span as unknown as SdkSpan).attributes;\n this.links = (this._span as unknown as SdkSpan).links;\n this.events = (this._span as unknown as SdkSpan).events;\n this.duration = (this._span as unknown as SdkSpan).duration;\n this.ended = (this._span as unknown as SdkSpan).ended;\n this.resource = (this._span as unknown as SdkSpan).resource;\n this.instrumentationLibrary = (this._span as unknown as SdkSpan).instrumentationLibrary;\n this.droppedAttributesCount = (this._span as unknown as SdkSpan).droppedAttributesCount;\n this.droppedEventsCount = (this._span as unknown as SdkSpan).droppedEventsCount;\n this.droppedLinksCount = (this._span as unknown as SdkSpan).droppedLinksCount;\n this.makeOtelV2Compatible();\n LaminarContextManager.addActiveSpan(this.spanContext().spanId);\n }\n\n name: string;\n kind: SpanKind;\n parentSpanId?: string | undefined;\n startTime: HrTime;\n endTime: HrTime;\n status: SpanStatus;\n attributes: Attributes;\n links: Link[];\n events: TimedEvent[];\n duration: HrTime;\n ended: boolean;\n resource: IResource;\n instrumentationLibrary: InstrumentationLibrary;\n droppedAttributesCount: number;\n droppedEventsCount: number;\n droppedLinksCount: number;\n\n public spanContext(): SpanContext {\n return this._span.spanContext();\n }\n\n public setAttribute(key: string, value: AttributeValue): this {\n this._span.setAttribute(key, value);\n return this;\n }\n\n public setAttributes(attributes: Attributes): this {\n this._span.setAttributes(attributes);\n return this;\n }\n\n public addEvent(\n name: string,\n attributesOrStartTime?: Attributes | TimeInput,\n startTime?: TimeInput,\n ): this {\n this._span.addEvent(name, attributesOrStartTime, startTime);\n return this;\n }\n\n public addLink(link: Link): this {\n this._span.addLink(link);\n return this;\n }\n\n public addLinks(links: Link[]): this {\n this._span.addLinks(links);\n return this;\n }\n\n public setStatus(status: SpanStatus): this {\n this._span.setStatus(status);\n return this;\n }\n\n public updateName(name: string): this {\n this._span.updateName(name);\n return this;\n }\n\n public end(endTime?: TimeInput): void {\n if (!this._span.isRecording()) {\n // This will log a warning and do nothing.\n return this._span.end(endTime);\n }\n\n // Remove from global registry on end\n LaminarContextManager.removeActiveSpan(this.spanContext().spanId);\n\n if (this._activated) {\n LaminarContextManager.popContext();\n }\n return this._span.end(endTime);\n }\n\n public set activated(activated: boolean) {\n this._activated = activated;\n }\n\n public isRecording(): boolean {\n return this._span.isRecording();\n }\n\n public recordException(exception: Exception, time?: TimeInput): void {\n return this._span.recordException(exception, time);\n }\n\n // ================================\n // Laminar specific methods\n // ================================\n\n public setTraceSessionId(sessionId: string): void {\n this._span.setAttribute(SESSION_ID, sessionId);\n }\n\n public setTraceUserId(userId: string): void {\n this._span.setAttribute(USER_ID, userId);\n }\n\n public setTraceMetadata(metadata: Record<string, any>): void {\n this._span.setAttributes(metadataToAttributes(metadata));\n }\n\n public setInput(input: any): void {\n const finalInput = typeof input === 'string' ? input : JSON.stringify(input);\n this._span.setAttribute(SPAN_INPUT, finalInput);\n }\n\n public setOutput(output: any): void {\n const finalOutput = typeof output === 'string' ? output : JSON.stringify(output);\n this._span.setAttribute(SPAN_OUTPUT, finalOutput);\n }\n\n public setTags(tags: string[]): void {\n this._span.setAttribute(`${ASSOCIATION_PROPERTIES}.tags`, Array.from(new Set(tags)));\n }\n\n public addTags(tags: string[]): void {\n const currentTags = this.tags;\n this.setTags(Array.from(new Set([...currentTags, ...tags])));\n }\n\n public getLaminarSpanContext(): LaminarSpanContext {\n let spanPath: string[] = [];\n let spanIdsPath: StringUUID[] = [];\n let userId;\n let sessionId;\n let traceType;\n let tracingLevel = TracingLevel.ALL;\n const metadata: Record<string, AttributeValue> = {};\n\n if (this._span.attributes) {\n spanPath = this._span.attributes[SPAN_PATH] as string[];\n spanIdsPath = this._span.attributes[SPAN_IDS_PATH] as StringUUID[];\n userId = this._span.attributes[USER_ID] as string;\n sessionId = this._span.attributes[SESSION_ID] as string;\n traceType = this._span.attributes[TRACE_TYPE] as TraceType;\n tracingLevel = this._span.attributes[\n `${ASSOCIATION_PROPERTIES}.tracing_level`\n ] as TracingLevel ?? TracingLevel.ALL;\n for (const [key, rawValue] of Object.entries(this._span.attributes)) {\n if (key.startsWith(`${ASSOCIATION_PROPERTIES}.metadata.`)) {\n let value = rawValue!;\n try {\n value = JSON.parse(value as string);\n } catch {\n // Ignore\n }\n metadata[key.replace(`${ASSOCIATION_PROPERTIES}.metadata.`, '')] = value;\n }\n }\n } else {\n logger.warn(\n \"Attributes object is not available. Most likely the span is not a LaminarSpan \" +\n \"and not an OpenTelemetry default SDK Span. Span path and ids path will be empty.\",\n );\n }\n\n return {\n spanId: otelSpanIdToUUID(this._span.spanContext().spanId) as StringUUID,\n traceId: otelTraceIdToUUID(this._span.spanContext().traceId),\n isRemote: this._span.spanContext().isRemote ?? false,\n spanPath: spanPath,\n spanIdsPath: spanIdsPath,\n userId: userId,\n sessionId: sessionId,\n metadata: metadata,\n traceType: traceType,\n tracingLevel: tracingLevel,\n };\n }\n\n public spanId(\n format: 'otel' | 'uuid' = 'otel',\n ): string {\n const spanId = this._span.spanContext().spanId;\n if (format === 'otel') {\n return spanId;\n }\n return otelSpanIdToUUID(spanId);\n }\n\n public traceId(\n format: 'otel' | 'uuid' = 'otel',\n ): string {\n const traceId = this._span.spanContext().traceId;\n if (format === 'otel') {\n return traceId;\n }\n return otelTraceIdToUUID(traceId);\n }\n\n public get tags(): string[] {\n if (!this._span.attributes) {\n logger.warn(\n \"[LaminarSpan.tags] WARNING. Current span does not have attributes object. \" +\n \"Possibly, the span was created with a custom OTel SDK. Returning an empty list. \" +\n \"Help: OpenTelemetry API does not guarantee reading attributes from a span, but OTel \" +\n \"SDK allows it by default. Laminar SDK allows to read attributes too.\",\n );\n return [];\n }\n return this._span.attributes[`${ASSOCIATION_PROPERTIES}.tags`] as string[] ?? [];\n }\n\n public get laminarAssociationProperties(): {\n metadata?: Record<string, any>;\n userId?: string;\n sessionId?: string;\n traceType?: TraceType;\n tracingLevel?: TracingLevel;\n } {\n if (!this._span.attributes) {\n logger.warn(\n \"[LaminarSpan.laminarAssociationProperties] WARNING. Current span does not have \" +\n \"attributes object. Possibly, the span was created with a custom OTel SDK. Returning an \" +\n \"empty object. Help: OpenTelemetry API does not guarantee reading attributes from a \" +\n \"span, but OTel SDK allows it by default. Laminar SDK allows to read attributes too.\",\n );\n return {};\n }\n try {\n const properties: Record<string, any> = {};\n const metadata: Record<string, any> = {};\n for (const [key, rawValue] of Object.entries(this._span.attributes)) {\n if (!key.startsWith(`${ASSOCIATION_PROPERTIES}.`)) {\n continue;\n }\n let value = rawValue!;\n if (key.startsWith(`${ASSOCIATION_PROPERTIES}.metadata.`)) {\n const metaKey = key.replace(`${ASSOCIATION_PROPERTIES}.metadata.`, '');\n try {\n value = JSON.parse(value as string);\n } catch {\n // Ignore\n }\n metadata[metaKey] = value;\n }\n }\n properties.tracingLevel = this._span.attributes[\n `${ASSOCIATION_PROPERTIES}.tracing_level`\n ] as TracingLevel ?? TracingLevel.ALL;\n properties.userId = this._span.attributes[USER_ID] as string ?? undefined;\n properties.sessionId = this._span.attributes[SESSION_ID] as string ?? undefined;\n properties.traceType = this._span.attributes[TRACE_TYPE] as TraceType ?? undefined;\n return {\n metadata,\n ...properties,\n };\n } catch {\n return {};\n }\n }\n\n // ================================\n // OTel V2 compatibility\n // ================================\n\n public makeOtelV2Compatible(): void {\n makeSpanOtelV2Compatible(this._span);\n }\n\n public get instrumentationScope(): InstrumentationScope {\n return this._span.instrumentationLibrary as unknown as InstrumentationScope;\n }\n\n public get parentSpanContext(): SpanContext | undefined {\n const parentSpanId = getParentSpanId(this._span);\n if (!parentSpanId) {\n return undefined;\n }\n return {\n spanId: parentSpanId,\n traceId: this.spanContext().traceId,\n // TODO: somehow get the traceFlags from the parent span\n traceFlags: this.spanContext().traceFlags,\n };\n }\n\n public getParentSpanId(): string | undefined {\n return getParentSpanId(this._span as unknown as SdkSpan);\n }\n\n public get isActivated(): boolean {\n return this._activated;\n }\n}\n","import {\n Context, context as contextApi,\n createContextKey, ROOT_CONTEXT, trace } from \"@opentelemetry/api\";\nimport { AsyncLocalStorage } from \"async_hooks\";\n\nimport { TraceType, TracingLevel } from \"../../types\";\nimport { LaminarSpan } from \"./span\";\n\nexport const CONTEXT_SPAN_PATH_KEY = createContextKey(\"span_path\");\nexport const ASSOCIATION_PROPERTIES_KEY = createContextKey(\n \"association_properties\",\n);\nexport const CONTEXT_GLOBAL_METADATA_KEY = createContextKey(\n \"global_metadata\",\n);\n\nexport class LaminarContextManager {\n private static _asyncLocalStorage = new AsyncLocalStorage<Context[]>();\n private static _globalMetadata: Record<string, any> = {};\n private static _inheritGlobalContext: boolean = false;\n // Static registry for cross-async span management\n // We're keeping track of spans have started (and running) here for the cases when span\n // is started in one async context and ended in another\n // We use this registry to ignore the context of spans that were already ended in\n // another async context.\n // LaminarSpan adds and removes itself to and from this registry in start()\n // and end() methods respectively.\n private static _activeSpans: Set<string> = new Set();\n\n private constructor() {\n throw new Error(\"LaminarContextManager is a static class and cannot be instantiated\");\n }\n\n public static getContext(): Context {\n const contexts = this.getContextStack();\n\n // Walk through contexts from most recent to oldest\n // We're doing it this way because we want to return the most recent context\n // that has an active span\n // This is primarily for the cases when span is started in one async context\n // and ended in another\n for (let i = contexts.length - 1; i >= 0; i--) {\n const context = contexts[i];\n const span = trace.getSpan(context);\n\n if (!span) {\n // No span in this context, it's valid\n return context;\n }\n\n if (!span.isRecording() && span.spanContext().isRemote) {\n // Span is remote and not recording, it's valid\n return context;\n }\n\n if (!(span instanceof LaminarSpan)) {\n // Span is not a Laminar span, it's valid\n return context;\n }\n\n if (!span.isActivated) {\n // Span is not activated by Laminar.startActiveSpan(), it's valid\n return context;\n }\n\n // Check if the span in this context has been ended\n try {\n const isActive = this._activeSpans.has(span.spanContext().spanId);\n if (isActive) {\n // Span is still active, use this context\n return context;\n }\n // Span has been ended, continue to parent context\n } catch {\n // If we can't check the span, assume it's valid\n return context;\n }\n }\n\n // No valid context found, return ROOT_CONTEXT\n return ROOT_CONTEXT;\n }\n\n public static pushContext(context: Context) {\n const contexts = this.getContextStack();\n const newContexts = [...contexts, context];\n this._asyncLocalStorage.enterWith(newContexts);\n }\n\n public static popContext() {\n const contexts = this.getContextStack();\n if (contexts.length > 0) {\n // Remove the last context and filter out any contexts with inactive spans\n const newContexts = contexts.slice(0, -1).filter(context => {\n const span = trace.getSpan(context);\n\n if (!span) {\n // No span in this context, it's valid\n return true;\n }\n\n // Check if the span in this context has been ended\n try {\n return this._activeSpans.has(span.spanContext().spanId);\n } catch {\n // If we can't check the span, assume it's valid\n return true;\n }\n });\n\n this._asyncLocalStorage.enterWith(newContexts);\n }\n }\n\n public static clearContexts() {\n this._asyncLocalStorage.enterWith([]);\n }\n\n public static clearActiveSpans() {\n this._activeSpans.clear();\n }\n\n public static getContextStack(): Context[] {\n return this._asyncLocalStorage.getStore()\n || (this._inheritGlobalContext ? [contextApi.active()] : []);\n }\n\n /**\n * Run a function with an isolated context stack.\n * This ensures that parallel executions don't interfere with each other.\n */\n public static runWithIsolatedContext<T>(initialStack: Context[], fn: () => T): T {\n return this._asyncLocalStorage.run(initialStack, fn);\n }\n\n public static addActiveSpan(spanId: string): void {\n this._activeSpans.add(spanId);\n }\n\n public static removeActiveSpan(spanId: string): void {\n this._activeSpans.delete(spanId);\n }\n\n public static setAssociationProperties(span: LaminarSpan, context: Context): Context {\n const properties = span.laminarAssociationProperties;\n\n return this.setRawAssociationProperties(properties, context);\n }\n\n public static setRawAssociationProperties(\n properties: Record<string, any>,\n context: Context,\n ): Context {\n let entityContext = context;\n const userId = properties.userId;\n const sessionId = properties.sessionId;\n const traceType = properties.traceType;\n const metadata = properties.metadata;\n const tracingLevel = properties.tracingLevel;\n entityContext = entityContext.setValue(ASSOCIATION_PROPERTIES_KEY, {\n userId: userId,\n sessionId: sessionId,\n traceType: traceType,\n metadata: metadata,\n tracingLevel: tracingLevel,\n });\n return entityContext;\n }\n\n public static setGlobalMetadata(globalMetadata: Record<string, any>) {\n this._globalMetadata = globalMetadata;\n }\n\n public static getGlobalMetadata(): Record<string, any> {\n return this._globalMetadata;\n }\n\n public static getAssociationProperties(): {\n userId?: string;\n sessionId?: string;\n traceType?: TraceType;\n tracingLevel?: TracingLevel;\n metadata?: Record<string, any>;\n } {\n const entityContext = this.getContext();\n return entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {};\n }\n\n public static set inheritGlobalContext(inheritGlobalContext: boolean) {\n this._inheritGlobalContext = inheritGlobalContext;\n }\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","/**\n * Agent resource for interacting with Laminar agents.\n */\n\nimport { trace } from \"@opentelemetry/api\";\n\nimport { LaminarContextManager } from \"../../opentelemetry-lib/tracing/context\";\nimport { initializeLogger, otelSpanIdToUUID, otelTraceIdToUUID, StringUUID } from \"../../utils\";\nimport { BaseResource } from \"./index\";\n\nconst logger = initializeLogger();\n\n/**\n * Model provider options\n */\nexport type ModelProvider = 'anthropic' | 'bedrock' | 'openai' | 'gemini';\n\nexport type ActionResult = {\n isDone: boolean;\n content?: string | null;\n error?: string | null;\n};\n\n/**\n * Agent output type\n *\n * @property {string} agentState - The state of the agent. Can be used in subsequent runs\n * to resume the agent. Only set if returnAgentState is true. Is a very large\n * stringified JSON object.\n * @property {string} storageState - The storage state of the browser, including auth, cookies, etc.\n * Only set if returnStorageState is true. Is a relatively large stringified JSON object.\n * @property {ActionResult} result - The result of the agent run.\n */\nexport type AgentOutput = {\n result: ActionResult;\n agentState?: string | null;\n storageState?: string | null;\n};\n\n/**\n * Request for running an agent\n */\nexport type RunAgentRequest = {\n prompt: string;\n parentSpanContext?: string;\n modelProvider?: ModelProvider;\n model?: string;\n stream: boolean;\n agentState?: string | null;\n storageState?: string | null;\n enableThinking: boolean;\n timeout?: number;\n cdpUrl?: string;\n maxSteps?: number;\n thinkingTokenBudget?: number;\n startUrl?: string;\n userAgent?: string;\n returnScreenshots?: boolean;\n returnAgentState?: boolean;\n returnStorageState?: boolean;\n disableGiveControl?: boolean;\n};\n\nexport type RunAgentStepChunk = {\n chunkType: \"step\";\n messageId: StringUUID;\n actionResult: ActionResult;\n summary: string;\n screenshot?: string | null;\n};\n\n// This chunk indicates that the explicit timeout has been reached.\n// This is the last chunk in the stream. The only difference between this and a normal step chunk is\n// the chunkType.\nexport type RunAgentTimeoutChunk = {\n chunkType: \"timeout\";\n messageId: StringUUID;\n actionResult: ActionResult;\n summary: string;\n screenshot?: string | null;\n};\n\nexport type RunAgentFinalChunk = {\n chunkType: \"finalOutput\";\n messageId: StringUUID;\n content: AgentOutput;\n};\n\nexport type RunAgentErrorChunk = {\n chunkType: \"error\";\n messageId: StringUUID;\n error: string;\n};\n\n/**\n * Chunk type for streaming responses\n */\nexport type RunAgentResponseChunk = RunAgentStepChunk\n | RunAgentFinalChunk | RunAgentErrorChunk | RunAgentTimeoutChunk;\n\ntype RunAgentOptions = {\n prompt: string;\n parentSpanContext?: string;\n modelProvider?: ModelProvider;\n agentState?: string;\n storageState?: string;\n model?: string;\n stream?: boolean;\n enableThinking?: boolean;\n timeout?: number;\n cdpUrl?: string;\n maxSteps?: number;\n thinkingTokenBudget?: number;\n startUrl?: string;\n userAgent?: string;\n returnScreenshots?: boolean;\n returnAgentState?: boolean;\n returnStorageState?: boolean;\n disableGiveControl?: boolean;\n};\n\n/**\n * Resource for interacting with Laminar agents\n */\nexport class AgentResource extends BaseResource {\n constructor(baseHttpUrl: string, projectApiKey: string) {\n super(baseHttpUrl, projectApiKey);\n }\n\n\n /**\n * Run Laminar index agent\n *\n * @param { RunAgentOptions } options - The options for running the agent\n * @param { string } options.prompt - The prompt for the agent\n * @param { string } [options.parentSpanContext] - The parent span context for tracing\n * @param { ModelProvider } [options.modelProvider] - LLM provider to use\n * @param { string } [options.model] - The model name as specified in the provider API\n * @param { string } [options.agentState] - The agent state to resume the agent from as returned\n * by a previous run.\n * @param { string } [options.storageState] - The browser storage state as returned by a\n * previous run.\n * @param { boolean } [options.enableThinking] - Whether to enable thinking in the underlying\n * LLM. Defaults to true.\n * @param { number } [options.timeout] - The timeout in seconds for the agent. Note: This is a\n * soft timeout. The agent will finish a step even after the timeout has been reached.\n * @param { string } [options.cdpUrl] - The URL of an existing Chrome DevTools Protocol (CDP)\n * browser instance.\n * @param { number } [options.maxSteps] - The maximum number of steps the agent can take.\n * Defaults to 100.\n * @param { number } [options.thinkingTokenBudget] - The maximum number of tokens the underlying\n * LLM can spend on thinking per step, if supported by the LLM provider.\n * @param { string } [options.startUrl] - The URL to start the agent on. Make sure it's a\n * valid URL - refer to https://playwright.dev/docs/api/class-page#page-goto\n * If not specified, the agent will infer this from the prompt.\n * @param { string } [options.userAgent] - The user agent to set in the browser.\n * If not specified, Laminar will use the default user agent.\n * @param { boolean } [options.returnScreenshots] - IGNORED in non-streaming mode.\n * Defaults to false. Set stream to true for doc comments.\n * @param { boolean } [options.returnAgentState] - Whether to return the agent state.\n * Agent state can be used to resume the agent in subsequent runs.\n * CAUTION: Agent state is a very large object. Defaults to false.\n * @param { boolean } [options.returnStorageState] - Whether to return the storage state.\n * Storage state includes browser cookies, auth, etc.\n * CAUTION: Storage state is a relatively large object. Defaults to false.\n * @param { boolean } [options.disableGiveControl] - Whether to NOT direct the agent\n * to give control back to the user for tasks such as logging in. Defaults to false.\n * @returns { Promise<AgentOutput> } The agent output\n */\n public run(options: Omit<RunAgentOptions, 'stream'>): Promise<AgentOutput>;\n\n /**\n * Run Laminar index agent\n *\n * @param { RunAgentOptions } options - The options for running the agent\n * @param { string } options.prompt - The prompt for the agent\n * @param { string } [options.parentSpanContext] - The parent span context for tracing\n * @param { ModelProvider } [options.modelProvider] - LLM provider to use\n * @param { string } [options.model] - The model name as specified in the provider API\n * @param { string } [options.agentState] - The agent state to resume the agent from as\n * returned by a previous run.\n * @param { string } [options.storageState] - The browser storage state as returned by a\n * previous run.\n * @param { boolean } [options.enableThinking] - Whether to enable thinking in the\n * underlying LLM. Defaults to true.\n * @param { number } [options.timeout] - The timeout in seconds for the agent.\n * Note: This is a soft timeout. The agent will finish a step even after the timeout has\n * been reached.\n * @param { string } [options.cdpUrl] - The URL of an existing Chrome DevTools Protocol\n * (CDP) browser instance.\n * @param { number } [options.maxSteps] - The maximum number of steps the agent can take.\n * Defaults to 100.\n * @param { number } [options.thinkingTokenBudget] - The maximum number of tokens the\n * underlying LLM can spend on thinking per step, if supported by the LLM provider.\n * @param { string } [options.startUrl] - The URL to start the agent on. Make sure it's\n * a valid URL - refer to https://playwright.dev/docs/api/class-page#page-goto\n * If not specified, the agent will infer this from the prompt.\n * @param { string } [options.userAgent] - The user agent to set in the browser.\n * If not specified, Laminar will use the default user agent.\n * @param { boolean } [options.returnScreenshots] - IGNORED in non-streaming mode.\n * Defaults to false. Set stream to true for doc comments.\n * @param { boolean } [options.returnAgentState] - Whether to return the agent state.\n * Agent state can be used to resume the agent in subsequent runs.\n * CAUTION: Agent state is a very large object. Defaults to false.\n * @param { boolean } [options.returnStorageState] - Whether to return the storage state.\n * Storage state includes browser cookies, auth, etc.\n * CAUTION: Storage state is a relatively large object. Defaults to false.\n * @param { boolean } [options.disableGiveControl] - Whether to NOT direct the agent\n * to give control back to the user for tasks such as logging in. Defaults to false.\n * @returns { Promise<AgentOutput> } The agent output\n */\n public run(options: Omit<RunAgentOptions, 'stream'> & { stream?: false }): Promise<AgentOutput>;\n\n /**\n * Run Laminar index agent\n *\n * @param { RunAgentOptions } options - The options for running the agent\n * @param { string } options.prompt - The prompt for the agent\n * @param { string } [options.parentSpanContext] - The parent span context for tracing\n * @param { ModelProvider } [options.modelProvider] - LLM provider to use\n * @param { string } [options.model] - The model name as specified in the provider API\n * @param { string } [options.agentState] - The agent state to resume the agent from as\n * returned by a previous run.\n * @param { string } [options.storageState] - The browser storage state as returned by\n * a previous run.\n * @param { boolean } [options.enableThinking] - Whether to enable thinking in the\n * underlying LLM. Defaults to true.\n * @param { number } [options.timeout] - The timeout in seconds for the agent. Note:\n * This is a soft timeout. The agent will finish a step even after the timeout has\n * been reached.\n * @param { string } [options.cdpUrl] - The URL of an existing Chrome DevTools Protocol\n * (CDP) browser instance.\n * @param { number } [options.maxSteps] - The maximum number of steps the agent can take.\n * Defaults to 100.\n * @param { number } [options.thinkingTokenBudget] - The maximum number of tokens the\n * underlying LLM can spend on thinking per step, if supported by the LLM provider.\n * @param { string } [options.startUrl] - The URL to start the agent on. Make sure it's\n * a valid URL - refer to https://playwright.dev/docs/api/class-page#page-goto\n * If not specified, the agent will infer this from the prompt.\n * @param { string } [options.userAgent] - The user agent to set in the browser.\n * If not specified, Laminar will use the default user agent.\n * @param { boolean } [options.returnScreenshots] - Whether to return screenshots with\n * each step. Defaults to false. Set stream to true for doc comments.\n * @param { boolean } [options.returnAgentState] - Whether to return the agent state.\n * Agent state can be used to resume the agent in subsequent runs.\n * CAUTION: Agent state is a very large object. Defaults to false.\n * @param { boolean } [options.returnStorageState] - Whether to return the storage state.\n * Storage state includes browser cookies, auth, etc.\n * CAUTION: Storage state is a relatively large object. Defaults to false.\n * @param { boolean } [options.disableGiveControl] - Whether to NOT direct the agent\n * to give control back to the user for tasks such as logging in. Defaults to false.\n * @returns { Promise<ReadableStream<RunAgentResponseChunk>> } The agent output streamed\n */\n public run(options: Omit<RunAgentOptions, 'stream'> & { stream: true }):\n Promise<ReadableStream<RunAgentResponseChunk>>;\n\n /**\n * Run Laminar index agent\n *\n * @param { RunAgentOptions } options - The options for running the agent\n * @param { string } options.prompt - The prompt for the agent\n * @param { string } [options.parentSpanContext] - The parent span context for tracing\n * @param { ModelProvider } [options.modelProvider] - LLM provider to use\n * @param { string } [options.model] - The model name as specified in the provider API\n * @param { boolean } [options.stream] - Whether to stream the response. Defaults to false.\n * @param { boolean } [options.enableThinking] - Whether to enable thinking in the underlying\n * LLM. Defaults to true.\n * @param { number } [options.timeout] - The timeout in seconds for the agent.\n * Note: This is a soft timeout. The agent will finish a step even after the timeout has\n * been reached.\n * @param { string } [options.cdpUrl] - The URL of an existing Chrome DevTools Protocol\n * (CDP) browser instance.\n * @param { number } [options.maxSteps] - The maximum number of steps the agent can take.\n * Defaults to 100.\n * @param { number } [options.thinkingTokenBudget] - The maximum number of tokens the underlying\n * LLM can spend on thinking per step, if supported by the LLM provider.\n * @param { string } [options.startUrl] - The URL to start the agent on.\n * Make sure it's a valid URL - refer to https://playwright.dev/docs/api/class-page#page-goto\n * If not specified, the agent will infer this from the prompt.\n * @param { string } [options.userAgent] - The user agent to set in the browser.\n * If not specified, Laminar will use the default user agent.\n * @param { boolean } [options.returnScreenshots] - Whether to return screenshots with\n * each step. Defaults to false.\n * @param { boolean } [options.returnAgentState] - Whether to return the agent state.\n * Agent state can be used to resume the agent in subsequent runs.\n * CAUTION: Agent state is a very large object. Defaults to false.\n * @param { boolean } [options.returnStorageState] - Whether to return the storage state.\n * Storage state includes browser cookies, auth, etc.\n * CAUTION: Storage state is a relatively large object. Defaults to false.\n * @param { boolean } [options.disableGiveControl] - Whether to NOT direct the agent\n * to give control back to the user for tasks such as logging in. Defaults to false.\n * @returns { Promise<AgentOutput | ReadableStream<RunAgentResponseChunk>> }\n * The agent output or a stream of response chunks\n */\n public async run({\n prompt,\n parentSpanContext,\n modelProvider,\n model,\n stream,\n enableThinking,\n timeout,\n cdpUrl,\n agentState,\n storageState,\n maxSteps,\n thinkingTokenBudget,\n startUrl,\n userAgent,\n returnScreenshots,\n returnAgentState,\n returnStorageState,\n disableGiveControl,\n }: RunAgentOptions): Promise<AgentOutput | ReadableStream<RunAgentResponseChunk>> {\n // Handle parent span context from current context if not provided\n let requestParentSpanContext = parentSpanContext;\n\n if (!requestParentSpanContext) {\n const currentSpan = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n if (currentSpan && currentSpan.isRecording()) {\n const traceId = otelTraceIdToUUID(currentSpan.spanContext().traceId);\n const spanId = otelSpanIdToUUID(currentSpan.spanContext().spanId) as StringUUID;\n requestParentSpanContext = JSON.stringify({\n trace_id: traceId,\n span_id: spanId,\n is_remote: currentSpan.spanContext().isRemote,\n });\n }\n }\n\n const request: RunAgentRequest = {\n prompt,\n parentSpanContext: requestParentSpanContext,\n modelProvider,\n model,\n stream: true,\n enableThinking: enableThinking ?? true,\n timeout,\n cdpUrl,\n agentState,\n storageState,\n maxSteps,\n thinkingTokenBudget,\n startUrl,\n userAgent,\n returnScreenshots: returnScreenshots ?? false,\n returnAgentState: returnAgentState ?? false,\n returnStorageState: returnStorageState ?? false,\n disableGiveControl: disableGiveControl ?? false,\n };\n\n // For streaming case, return the ReadableStream directly\n if (stream) {\n return this.runStreaming(request);\n } else {\n // For non-streaming case, process all chunks and return the final result\n return await this.runNonStreaming(request);\n }\n }\n\n /**\n * Run agent in streaming mode\n */\n private async runStreaming(\n request: RunAgentRequest,\n ): Promise<ReadableStream<RunAgentResponseChunk>> {\n const response = await fetch(this.baseHttpUrl + \"/v1/agent/run\", {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n await this.handleError(response);\n }\n if (!response.body) {\n throw new Error(\"Response body is null\");\n }\n\n return response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new TransformStream({\n start(this: { buffer: string }) {\n this.buffer = \"\";\n },\n transform(this: { buffer: string }, chunk, controller) {\n this.buffer += chunk;\n\n // Split buffer into lines\n const lines = this.buffer.split(\"\\n\");\n // Keep the last (potentially incomplete) line in the buffer\n this.buffer = lines.pop() || \"\";\n\n // Process complete lines\n for (const line of lines) {\n if (line.startsWith(\"[DONE]\")) {\n controller.terminate();\n return;\n }\n if (!line.startsWith(\"data: \")) {\n continue;\n }\n const jsonStr = line.substring(6);\n if (jsonStr) {\n try {\n const parsed = JSON.parse(jsonStr) as RunAgentResponseChunk;\n controller.enqueue(parsed);\n } catch (error) {\n logger.error(\"Error parsing JSON: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n },\n flush(this: { buffer: string }, controller) {\n // Process any remaining data in the buffer\n if (this.buffer) {\n if (this.buffer.startsWith(\"data: \")) {\n const jsonStr = this.buffer.substring(6);\n if (jsonStr) {\n try {\n const parsed = JSON.parse(jsonStr) as RunAgentResponseChunk;\n controller.enqueue(parsed);\n } catch (error) {\n logger.error(\"Error parsing JSON: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n }\n },\n }));\n }\n\n /**\n * Run agent in non-streaming mode\n */\n private async runNonStreaming(request: RunAgentRequest): Promise<AgentOutput> {\n const stream = await this.runStreaming(request);\n const reader = stream.getReader();\n let finalChunk: RunAgentResponseChunk | null = null;\n let errorChunk: RunAgentErrorChunk | null = null;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value.chunkType === \"finalOutput\") {\n finalChunk = value;\n break;\n } else if (value.chunkType === \"error\") {\n errorChunk = value;\n break;\n } else if (value.chunkType === \"timeout\") {\n errorChunk = {\n chunkType: \"error\",\n messageId: value.messageId,\n error: \"Timeout\",\n };\n break;\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (errorChunk) {\n throw new Error(errorChunk.error);\n }\n\n return finalChunk?.content || { result: { isDone: true } };\n }\n}\n","","export const getLangVersion: () => string | undefined = () => {\n if (process?.versions?.node) {\n return `node@${process.versions.node}`;\n }\n// else if (Deno?.version) {\n// return `deno@${Deno?.version?.deno}`;\n// }\n};\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 { Datapoint } from \"../../evaluations\";\nimport { Dataset, GetDatapointsResponse, PushDatapointsResponse } from \"../../types\";\nimport { initializeLogger, StringUUID } 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 { EvaluationDatapoint, GetDatapointsResponse, InitEvaluationResponse } from \"../../types\";\nimport { initializeLogger, newUUID, slicePayload, StringUUID } 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 { isStringUUID, otelSpanIdToUUID, otelTraceIdToUUID, StringUUID } 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","/** 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 { config } from \"dotenv\";\n\nimport { AgentResource } from \"./resources/agent\";\nimport { BrowserEventsResource } from \"./resources/browser-events\";\nimport { DatasetsResource } from \"./resources/datasets\";\nimport { EvalsResource } from \"./resources/evals\";\nimport { EvaluatorsResource } from \"./resources/evaluators\";\nimport { TagsResource } from \"./resources/tags\";\n\nexport class LaminarClient {\n private baseUrl: string;\n private projectApiKey: string;\n private _agent: AgentResource;\n private _browserEvents: BrowserEventsResource;\n private _datasets: DatasetsResource;\n private _evals: EvalsResource;\n private _evaluators: EvaluatorsResource;\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 config({\n quiet: true,\n });\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._agent = new AgentResource(this.baseUrl, this.projectApiKey);\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._tags = new TagsResource(this.baseUrl, this.projectApiKey);\n }\n\n public get agent() {\n return this._agent;\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 tags() {\n return this._tags;\n }\n}\n"],"mappings":"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"}
@@ -582,7 +582,7 @@ var AgentResource = class extends BaseResource {
582
582
 
583
583
  //#endregion
584
584
  //#region package.json
585
- var version = "0.7.14";
585
+ var version = "0.7.15";
586
586
 
587
587
  //#endregion
588
588
  //#region src/version.ts
@@ -1135,4 +1135,4 @@ Object.defineProperty(exports, 'version', {
1135
1135
  return version;
1136
1136
  }
1137
1137
  });
1138
- //# sourceMappingURL=client-Vr5R1_VP.cjs.map
1138
+ //# sourceMappingURL=client-DOx_EuBb.cjs.map