@lmnr-ai/lmnr 0.6.12 → 0.6.13

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/resources/agent.ts","../src/utils.ts","../src/opentelemetry-lib/tracing/attributes.ts","../src/client/resources/index.ts","../package.json","../src/version.ts","../src/client/resources/browser-events.ts","../src/client/resources/evals.ts","../src/client/resources/tags.ts","../src/client/index.ts","../src/datasets.ts","../src/decorators.ts","../src/opentelemetry-lib/configuration/index.ts","../src/opentelemetry-lib/tracing/index.ts","../src/opentelemetry-lib/tracing/compat.ts","../src/opentelemetry-lib/tracing/instrumentations.ts","../src/browser/playwright.ts","../src/laminar.ts","../src/opentelemetry-lib/tracing/utils.ts","../src/browser/utils.ts","../src/browser/stagehand.ts","../src/browser/puppeteer.ts","../src/opentelemetry-lib/tracing/processor.ts","../src/opentelemetry-lib/tracing/exporter.ts","../src/opentelemetry-lib/tracing/decorators.ts","../src/evaluations.ts","../src/types.ts","../src/index.ts"],"sourcesContent":["/**\n * Agent resource for interacting with Laminar agents.\n */\n\nimport { trace } from \"@opentelemetry/api\";\n\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.getActiveSpan();\n if (currentSpan && currentSpan.isRecording()) {\n const traceId = otelTraceIdToUUID(currentSpan.spanContext().traceId) as StringUUID;\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","import { AttributeValue, SpanContext, TraceFlags } from '@opentelemetry/api';\nimport path from \"path\";\nimport pino, { Level } from 'pino';\nimport pinoPretty from 'pino-pretty';\nimport { fileURLToPath } from \"url\";\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { ASSOCIATION_PROPERTIES } from './opentelemetry-lib/tracing/attributes';\nimport { LaminarSpanContext } from './types';\n\nexport function initializeLogger(options?: { colorize?: boolean, level?: Level }) {\n const colorize = options?.colorize ?? true;\n const level = options?.level\n ?? (process.env.LMNR_LOG_LEVEL?.toLowerCase()?.trim() as Level)\n ?? 'info';\n\n return pino(pinoPretty({\n colorize,\n minimumLevel: level,\n }));\n}\n\nconst logger = initializeLogger();\n\nexport type StringUUID = `${string}-${string}-${string}-${string}-${string}`;\n\nexport const isStringUUID = (id: string): id is StringUUID =>\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.test(id);\n\nexport const NIL_UUID: StringUUID = '00000000-0000-0000-0000-000000000000';\n\nexport const newUUID = (): StringUUID => {\n // crypto.randomUUID is available in most of the modern browsers and node,\n // but is not available in \"insecure\" contexts, e.g. not https, not localhost\n // so we fallback to uuidv4 in those cases, which is less secure, but works\n // just fine.\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n } else {\n return uuidv4() as `${string}-${string}-${string}-${string}-${string}`;\n }\n};\n\nexport const otelSpanIdToUUID = (spanId: string): string => {\n let id = spanId.toLowerCase();\n if (id.startsWith('0x')) {\n id = id.slice(2);\n }\n if (id.length !== 16) {\n logger.warn(`Span ID ${spanId} is not 16 hex chars long. ` +\n 'This is not a valid OpenTelemetry span ID.');\n }\n\n if (!/^[0-9a-f]+$/.test(id)) {\n logger.error(`Span ID ${spanId} is not a valid hex string. ` +\n 'Generating a random UUID instead.');\n return newUUID();\n }\n\n return id.padStart(32, '0').replace(\n /^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/,\n '$1-$2-$3-$4-$5',\n );\n};\n\nexport const otelTraceIdToUUID = (traceId: string): string => {\n let id = traceId.toLowerCase();\n if (id.startsWith('0x')) {\n id = id.slice(2);\n }\n if (id.length !== 32) {\n logger.warn(`Trace ID ${traceId} is not 32 hex chars long. ` +\n 'This is not a valid OpenTelemetry trace ID.');\n }\n if (!/^[0-9a-f]+$/.test(id)) {\n logger.error(`Trace ID ${traceId} is not a valid hex string. ` +\n 'Generating a random UUID instead.');\n return newUUID();\n }\n\n return id.replace(\n /^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/,\n '$1-$2-$3-$4-$5',\n );\n};\n\nexport const uuidToOtelTraceId = (uuid: string): string => uuid.replace(/-/g, '');\nexport const uuidToOtelSpanId = (uuid: string): string => uuid.replace(/-/g, '').slice(16);\n\n/**\n * This is a simple implementation of a semaphore to replicate\n * the behavior of the `asyncio.Semaphore` in Python.\n */\nexport class Semaphore {\n /**\n * Number of permits available.\n */\n private _value: number;\n /**\n * List of promises that will be resolved when a permit becomes available.\n */\n private _waiters: ((...args: any[]) => any)[] = [];\n\n constructor(value = 1) {\n if (value < 0) {\n throw new Error(\"Semaphore value must be >= 0\");\n }\n this._value = value;\n this._waiters = [];\n }\n\n async acquire() {\n if (this._value > 0) {\n this._value--;\n return;\n }\n\n // Create a promise that will be resolved when a permit becomes available\n return new Promise(resolve => {\n this._waiters.push(resolve);\n });\n }\n\n release() {\n if (this._waiters.length > 0) {\n // If there are waiters, wake up the first one\n const resolve = this._waiters.shift();\n resolve?.();\n } else {\n this._value++;\n }\n }\n\n // Python-like context manager functionality\n async using<T>(fn: (...args: any[]) => Promise<T>) {\n try {\n await this.acquire();\n return await fn();\n } finally {\n this.release();\n }\n }\n}\n\nexport const tryToOtelSpanContext = (\n spanContext: LaminarSpanContext | Record<string, unknown> | string | SpanContext,\n): SpanContext => {\n if (typeof spanContext === 'string') {\n try {\n const record = JSON.parse(spanContext) as Record<string, unknown>;\n return recordToOtelSpanContext(record);\n } catch (e) {\n throw new Error(`Failed to parse span context ${spanContext}. ` +\n 'The string must be a json representation of a LaminarSpanContext.'\n + `Error: ${e instanceof Error ? e.message : String(e)}`);\n }\n } else if (isRecord(spanContext)) {\n // This covers the `LaminarSpanContext` case too.\n return recordToOtelSpanContext(spanContext);\n } else if (typeof spanContext.traceId === 'string'\n && typeof spanContext.spanId === 'string'\n && spanContext.traceId.length === 32\n && spanContext.spanId.length === 16) {\n logger.warn('The span context is already an OpenTelemetry SpanContext. ' +\n 'Returning it as is. Please use `LaminarSpanContext` objects instead.');\n return spanContext;\n }\n else {\n throw new Error(`Invalid span context ${JSON.stringify(spanContext)}. ` +\n 'Must be a LaminarSpanContext or its json representation.');\n }\n};\n\nconst recordToOtelSpanContext = (record: Record<string, unknown>): SpanContext => {\n if (typeof record.spanId === 'string' && typeof record.traceId === 'string') {\n return {\n spanId: uuidToOtelSpanId(record?.spanId ?? record?.['span_id']),\n traceId: uuidToOtelTraceId(record?.traceId ?? record?.['trace_id']),\n isRemote: record?.isRemote ?? record?.['is_remote'] ?? false,\n traceFlags: record?.traceFlags ?? TraceFlags.SAMPLED,\n } as SpanContext;\n } else {\n throw new Error(`Invalid span context ${JSON.stringify(record)}. ` +\n 'Must be a json representation of a LaminarSpanContext.');\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && !Array.isArray(value) && value !== null;\n\n\nexport const getDirname = () => {\n if (typeof __dirname !== 'undefined') {\n return __dirname;\n }\n\n if (typeof import.meta?.url !== 'undefined') {\n return path.dirname(fileURLToPath(import.meta.url));\n }\n\n return process.cwd();\n};\n\nexport const slicePayload = <T>(value: T, length: number) => {\n if (value === null || value === undefined) {\n return value;\n }\n\n const str = JSON.stringify(value);\n if (str.length <= length) {\n return value;\n }\n\n return (str.slice(0, length) + '...');\n};\n\nexport const isOtelAttributeValueType = (value: unknown): value is AttributeValue => {\n if (typeof value === 'string'\n || typeof value === 'number'\n || typeof value === 'boolean') {\n return true;\n }\n\n if (Array.isArray(value)) {\n const allStrings = value.every(value => (value == null) || typeof value === 'string');\n const allNumbers = value.every(value => (value == null) || typeof value === 'number');\n const allBooleans = value.every(value => (value == null) || typeof value === 'boolean');\n return allStrings || allNumbers || allBooleans;\n }\n return false;\n};\n\nexport const metadataToAttributes = (\n metadata: Record<string, unknown>,\n): Record<string, AttributeValue> => Object.fromEntries(\n Object.entries(metadata).map(([key, value]) => {\n if (isOtelAttributeValueType(value)) {\n return [`${ASSOCIATION_PROPERTIES}.metadata.${key}`, value];\n } else {\n return [`${ASSOCIATION_PROPERTIES}.metadata.${key}`, JSON.stringify(value)];\n }\n }),\n);\n","import { SpanAttributes } from '@traceloop/ai-semantic-conventions';\n\nexport const SPAN_INPUT = \"lmnr.span.input\";\nexport const SPAN_OUTPUT = \"lmnr.span.output\";\nexport const SPAN_TYPE = \"lmnr.span.type\";\nexport const SPAN_PATH = \"lmnr.span.path\";\nexport const SPAN_IDS_PATH = \"lmnr.span.ids_path\";\nexport const SPAN_INSTRUMENTATION_SOURCE = \"lmnr.span.instrumentation_source\";\nexport const SPAN_SDK_VERSION = \"lmnr.span.sdk_version\";\nexport const SPAN_LANGUAGE_VERSION = \"lmnr.span.language_version\";\nexport const OVERRIDE_PARENT_SPAN = \"lmnr.internal.override_parent_span\";\nexport const TRACE_HAS_BROWSER_SESSION = \"lmnr.internal.has_browser_session\";\nexport const EXTRACTED_FROM_NEXT_JS = \"lmnr.span.extracted_from.next_js\";\n\nexport const ASSOCIATION_PROPERTIES = \"lmnr.association.properties\";\nexport const SESSION_ID = \"lmnr.association.properties.session_id\";\nexport const USER_ID = \"lmnr.association.properties.user_id\";\nexport const TRACE_TYPE = \"lmnr.association.properties.trace_type\";\n\nexport const ASSOCIATION_PROPERTIES_OVERRIDES: Record<string, string> = {\n \"span_type\": SPAN_TYPE,\n};\n\nexport const LaminarAttributes = {\n // == This is the minimum set of attributes for a proper LLM span ==\n //\n // not SpanAttributes.LLM_USAGE_PROMPT_TOKENS\n INPUT_TOKEN_COUNT: \"gen_ai.usage.input_tokens\",\n // not SpanAttributes.LLM_USAGE_COMPLETION_TOKENS\n OUTPUT_TOKEN_COUNT: \"gen_ai.usage.output_tokens\",\n TOTAL_TOKEN_COUNT: SpanAttributes.LLM_USAGE_TOTAL_TOKENS,\n PROVIDER: SpanAttributes.LLM_SYSTEM,\n REQUEST_MODEL: SpanAttributes.LLM_REQUEST_MODEL,\n RESPONSE_MODEL: SpanAttributes.LLM_RESPONSE_MODEL,\n //\n // == End of minimum set ==\n // == Additional attributes ==\n //\n INPUT_COST: \"gen_ai.usage.input_cost\",\n OUTPUT_COST: \"gen_ai.usage.output_cost\",\n TOTAL_COST: \"gen_ai.usage.cost\",\n //\n // == End of additional attributes ==\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 \"name\": \"@lmnr-ai/lmnr\",\n \"version\": \"0.6.12\",\n \"description\": \"TypeScript SDK for Laminar AI\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"tsx --test test/*.test.ts\",\n \"lint\": \"eslint\",\n \"lint:fix\": \"eslint --fix\"\n },\n \"files\": [\n \"dist\",\n \"assets\"\n ],\n \"bin\": {\n \"lmnr\": \"./dist/cli.js\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/lmnr-ai/lmnr-ts.git\"\n },\n \"keywords\": [\n \"laminar\",\n \"lmnr\",\n \"sdk\",\n \"lmnr.ai\"\n ],\n \"author\": \"founders@lmnr.ai\",\n \"license\": \"Apache-2.0\",\n \"bugs\": {\n \"url\": \"https://github.com/lmnr-ai/lmnr-ts/issues\"\n },\n \"homepage\": \"https://github.com/lmnr-ai/lmnr-ts#README\",\n \"devDependencies\": {\n \"@anthropic-ai/sdk\": \"^0.39.0\",\n \"@aws-sdk/client-bedrock-runtime\": \"^3.835.0\",\n \"@azure/openai\": \"^2.0.0\",\n \"@browserbasehq/stagehand\": \"^2.3.1\",\n \"@eslint/eslintrc\": \"^3.3.1\",\n \"@eslint/js\": \"^9.29.0\",\n \"@google-cloud/aiplatform\": \"^4.2.0\",\n \"@google-cloud/vertexai\": \"^1.10.0\",\n \"@langchain/core\": \"^0.3.61\",\n \"@pinecone-database/pinecone\": \"^5.1.2\",\n \"@playwright/test\": \"^1.53.1\",\n \"@qdrant/js-client-rest\": \"^1.14.1\",\n \"@stylistic/eslint-plugin\": \"^5.0.0\",\n \"@types/argparse\": \"^2.0.17\",\n \"@types/cli-progress\": \"^3.11.6\",\n \"@types/node\": \"^24.0.3\",\n \"@types/semver\": \"^7.7.0\",\n \"@types/uuid\": \"^10.0.0\",\n \"chromadb\": \"^2.4.6\",\n \"cohere-ai\": \"^7.17.1\",\n \"eslint-plugin-simple-import-sort\": \"^12.1.1\",\n \"eslint-plugin-unused-imports\": \"^4.1.4\",\n \"langchain\": \"^0.3.29\",\n \"llamaindex\": \"^0.9.19\",\n \"nock\": \"^14.0.5\",\n \"openai\": \"^4.104.0\",\n \"playwright\": \"^1.53.1\",\n \"puppeteer\": \"^24.10.2\",\n \"puppeteer-core\": \"^24.10.2\",\n \"together-ai\": \"^0.14.0\",\n \"tsup\": \"^8.5.0\",\n \"tsx\": \"^4.20.3\",\n \"typescript\": \"^5.8.3\",\n \"typescript-eslint\": \"^8.35.0\"\n },\n \"dependencies\": {\n \"@grpc/grpc-js\": \"^1.13.4\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/context-async-hooks\": \"^1.30.1\",\n \"@opentelemetry/core\": \"^1.30.1\",\n \"@opentelemetry/exporter-trace-otlp-grpc\": \"^0.57.2\",\n \"@opentelemetry/exporter-trace-otlp-proto\": \"^0.57.2\",\n \"@opentelemetry/instrumentation\": \"^0.57.2\",\n \"@opentelemetry/otlp-exporter-base\": \"^0.57.2\",\n \"@opentelemetry/otlp-grpc-exporter-base\": \"^0.57.2\",\n \"@opentelemetry/resources\": \"^1.30.1\",\n \"@opentelemetry/sdk-node\": \"^0.57.2\",\n \"@opentelemetry/sdk-trace-base\": \"^1.30.1\",\n \"@opentelemetry/sdk-trace-base-v2\": \"npm:@opentelemetry/sdk-trace-base@2.0.0\",\n \"@opentelemetry/sdk-trace-node\": \"^1.30.1\",\n \"@opentelemetry/semantic-conventions\": \"^1.34.0\",\n \"@traceloop/ai-semantic-conventions\": \"^0.12.0\",\n \"@traceloop/instrumentation-anthropic\": \"^0.12.0\",\n \"@traceloop/instrumentation-azure\": \"^0.12.0\",\n \"@traceloop/instrumentation-bedrock\": \"^0.12.0\",\n \"@traceloop/instrumentation-chromadb\": \"^0.12.0\",\n \"@traceloop/instrumentation-cohere\": \"^0.12.0\",\n \"@traceloop/instrumentation-langchain\": \"^0.12.0\",\n \"@traceloop/instrumentation-llamaindex\": \"^0.12.0\",\n \"@traceloop/instrumentation-openai\": \"^0.12.0\",\n \"@traceloop/instrumentation-pinecone\": \"^0.12.0\",\n \"@traceloop/instrumentation-qdrant\": \"^0.12.0\",\n \"@traceloop/instrumentation-together\": \"^0.12.1\",\n \"@traceloop/instrumentation-vertexai\": \"^0.12.0\",\n \"argparse\": \"^2.0.1\",\n \"cli-progress\": \"^3.12.0\",\n \"esbuild\": \"^0.25.5\",\n \"glob\": \"^11.0.3\",\n \"pino\": \"^9.7.0\",\n \"pino-pretty\": \"^13.0.0\",\n \"uuid\": \"^11.1.0\",\n \"zod\": \"^3.25.67\"\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/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 { EvaluationDatapoint, GetDatapointsResponse, InitEvaluationResponse } from \"../../types\";\nimport { newUUID, slicePayload, StringUUID } from \"../../utils\";\nimport { BaseResource } from \".\";\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, 100),\n target: slicePayload(d.target, 100),\n })),\n groupName: groupName ?? null,\n }),\n });\n\n if (!response.ok) {\n await this.handleError(response);\n }\n }\n\n /**\n * Get evaluation datapoints.\n *\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 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","/** Resource for tagging traces. */\n\n\nimport { isStringUUID, otelTraceIdToUUID, StringUUID } 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) as StringUUID;\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 { AgentResource } from \"./resources/agent\";\nimport { BrowserEventsResource } from \"./resources/browser-events\";\nimport { EvalsResource } from \"./resources/evals\";\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 _evals: EvalsResource;\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 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 this.baseUrl = `${baseUrl?.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '') ?? '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._evals = new EvalsResource(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 evals() {\n return this._evals;\n }\n\n public get tags() {\n return this._tags;\n }\n}\n","import { LaminarClient } from './client';\nimport { Datapoint } from './evaluations';\n\nconst DEFAULT_FETCH_SIZE = 25;\n\nexport abstract class EvaluationDataset<D, T> {\n public async slice(start: number, end: number): Promise<Datapoint<D, T>[]> {\n const result = [];\n for (let i = Math.max(start, 0); i < Math.min(end, await this.size()); i++) {\n result.push(await this.get(i));\n }\n return result;\n }\n public abstract size(): Promise<number> | number;\n public abstract get(index: number): Promise<Datapoint<D, T>> | Datapoint<D, T>;\n}\n\nexport class LaminarDataset<D, T> extends EvaluationDataset<D, T> {\n private fetchedItems: Datapoint<D, T>[] = [];\n private len: number | null = null;\n private offset: number = 0;\n private fetchSize: number;\n private name: string;\n private client: LaminarClient | undefined = undefined;\n\n constructor(name: string, fetchSize?: number) {\n super();\n this.name = name;\n this.fetchSize = fetchSize || DEFAULT_FETCH_SIZE;\n }\n\n public setClient(client: LaminarClient) {\n this.client = client;\n }\n\n private async fetchBatch() {\n if (!this.client) {\n throw new Error('Client not set');\n }\n const resp = await this.client.evals.getDatapoints<D, T>({\n datasetName: this.name,\n offset: this.offset,\n limit: this.fetchSize,\n });\n this.fetchedItems = this.fetchedItems.concat(resp.items);\n this.offset = this.fetchedItems.length;\n if (this.len === null) {\n this.len = resp.totalCount;\n }\n }\n\n public async size(): Promise<number> {\n if (this.len === null) {\n await this.fetchBatch();\n }\n return this.len!;\n }\n public async get(index: number): Promise<Datapoint<D, T>> {\n if (index >= this.fetchedItems.length) {\n await this.fetchBatch();\n }\n return this.fetchedItems[index];\n }\n}\n","import { context } from \"@opentelemetry/api\";\n\nimport { observeBase } from './opentelemetry-lib';\nimport { ASSOCIATION_PROPERTIES_KEY } from \"./opentelemetry-lib/tracing/utils\";\nimport { LaminarSpanContext, TraceType, TracingLevel } from './types';\nimport { metadataToAttributes } from \"./utils\";\n\ninterface ObserveOptions {\n name?: string;\n sessionId?: string;\n userId?: string;\n traceType?: TraceType;\n spanType?: 'DEFAULT' | 'LLM' | 'TOOL';\n input?: unknown;\n ignoreInput?: boolean;\n ignoreOutput?: boolean;\n parentSpanContext?: string | LaminarSpanContext;\n metadata?: Record<string, any>;\n tags?: string[];\n}\n\n/**\n * The main decorator entrypoint for Laminar. This is used to wrap\n * functions and methods to create spans.\n *\n * @param name - Name of the span. Function name is used if not specified.\n * @param sessionId - Session ID to associate with the span and the following context.\n * @param userId - User ID to associate with the span and the following context.\n * This is different from the id of a Laminar user.\n * @param traceType – Type of the trace. Unless it is within evaluation, it should be 'DEFAULT'.\n * @param spanType - Type of the span. 'DEFAULT' is used if not specified. If the type is 'LLM',\n * you must manually specify some attributes. See `Laminar.setSpanAttributes` for more\n * information.\n * @param input - Force override the input for the span. If not specified, the input will be the\n * arguments passed to the function.\n * @param ignoreInput - Whether to ignore the input altogether.\n * @param ignoreOutput - Whether to ignore the output altogether.\n * @param metadata - Metadata to add to a trace for further filtering. Must be JSON serializable.\n * @param tags - Tags to associate with the span.\n * @returns Returns the result of the wrapped function.\n * @throws Exception - Re-throws the exception if the wrapped function throws an exception.\n *\n * @example\n * ```typescript\n * import { observe } from '@lmnr-ai/lmnr';\n *\n * await observe({ name: 'my_function' }, () => {\n * // Your code here\n * });\n */\nexport async function observe<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n {\n name,\n sessionId,\n userId,\n traceType,\n spanType,\n input,\n ignoreInput,\n ignoreOutput,\n parentSpanContext,\n metadata,\n tags,\n }: ObserveOptions, fn: F, ...args: A): Promise<ReturnType<F>> {\n if (fn === undefined || typeof fn !== \"function\") {\n throw new Error(\"Invalid `observe` usage. Second argument `fn` must be a function.\");\n }\n\n let associationProperties = {};\n if (sessionId) {\n associationProperties = { ...associationProperties, \"session_id\": sessionId };\n }\n if (traceType) {\n associationProperties = { ...associationProperties, \"trace_type\": traceType };\n }\n if (spanType) {\n associationProperties = { ...associationProperties, \"span_type\": spanType };\n }\n if (userId) {\n associationProperties = { ...associationProperties, \"user_id\": userId };\n }\n if (tags) {\n associationProperties = { ...associationProperties, \"tags\": tags };\n }\n if (metadata) {\n const metadataAttributes = metadataToAttributes(metadata);\n if (metadataAttributes && Object.keys(metadataAttributes).length > 0) {\n associationProperties = { ...associationProperties, ...metadataAttributes };\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return await observeBase<A, F>({\n name: name ?? fn.name,\n associationProperties,\n input,\n ignoreInput,\n ignoreOutput,\n parentSpanContext,\n }, fn, undefined, ...args);\n}\n\n/**\n * Sets the labels for any spans inside the function. This is useful for adding\n * labels to the spans created in the auto-instrumentations. Returns the result\n * of the wrapped function, so you can use it in an `await` statement if needed.\n *\n * Requirements:\n * - Labels must be created in your project in advance.\n * - Keys must be strings from your label names.\n * - Values must be strings matching the label's allowed values.\n *\n * @param labels - The labels to set.\n * @returns The result of the wrapped function.\n *\n * @example\n * ```typescript\n * import { withLabels } from '@lmnr-ai/lmnr';\n *\n * const result = await withLabels({ endpoint: \"ft-openai-<id>\" }, () => {\n * openai.chat.completions.create({});\n * });\n * ```\n */\nexport function withLabels<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n labels: string[],\n fn: F,\n ...args: A\n): ReturnType<F> {\n let entityContext = context.active();\n const currentAssociationProperties = entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {};\n const oldLabels = (currentAssociationProperties as Record<string, any>).labels ?? [];\n const newLabels = [...oldLabels, ...labels];\n\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n {\n ...currentAssociationProperties,\n labels: newLabels,\n },\n );\n\n const result = context.with(entityContext, () => fn(...args));\n\n const newAssociationProperties = (\n entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {}\n ) as Record<string, any>;\n\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n { ...newAssociationProperties, labels: oldLabels },\n );\n\n return result;\n}\n\n/**\n * Sets the tracing level for any spans inside the function. This is useful for\n * conditionally disabling the tracing for certain functions.\n * Tracing level must be one of the values in {@link TracingLevel}. Returns the\n * result of the wrapped function, so you can use it in an `await` statement if\n * needed.\n *\n * @param tracingLevel - The tracing level to set.\n * @returns The result of the wrapped function.\n *\n * @example\n * ```typescript\n * import { withTracingLevel, TracingLevel } from '@lmnr-ai/lmnr';\n *\n * const result = await withTracingLevel(TracingLevel.META_ONLY, () => {\n * openai.chat.completions.create({});\n * });\n * ```\n */\nexport function withTracingLevel<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n tracingLevel: TracingLevel,\n fn: F,\n ...args: A\n): ReturnType<F> {\n let entityContext = context.active();\n const currentAssociationProperties = entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {};\n\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n { ...currentAssociationProperties, \"tracing_level\": tracingLevel },\n );\n\n const result = context.with(entityContext, () => fn(...args));\n\n const newAssociationProperties = (\n entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {}\n ) as Record<string, any>;\n delete newAssociationProperties[\"tracing_level\"];\n\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n newAssociationProperties,\n );\n\n return result;\n}\n","import { diag, DiagConsoleLogger, DiagLogLevel } from \"@opentelemetry/api\";\n\nimport { InitializeOptions } from \"../interfaces\";\nimport { startTracing } from \"../tracing\";\n\nexport let _configuration: InitializeOptions | undefined;\n\n/**\n * Initializes the SDK.\n * Must be called once before any other SDK methods.\n *\n * @param options - The options to initialize the SDK. See the {@link InitializeOptions}\n * for details.\n * @throws {InitializationError} if the configuration is invalid or if failed to fetch\n * feature data.\n */\nexport const initializeTracing = (options: InitializeOptions) => {\n if (_configuration) {\n return;\n }\n\n if (!options.baseUrl) {\n options.baseUrl =\n process.env.LMNR_BASE_URL || \"https://api.lmnr.ai:8443\";\n }\n if (!options.apiKey) {\n options.apiKey = process.env.LMNR_PROJECT_API_KEY;\n }\n\n _configuration = Object.freeze(options);\n\n if (options.logLevel) {\n diag.setLogger(\n new DiagConsoleLogger(),\n {\n logLevel: logLevelToOtelLogLevel(options.logLevel),\n suppressOverrideMessage: true,\n },\n );\n }\n\n startTracing(_configuration);\n};\n\nconst logLevelToOtelLogLevel = (\n logLevel: \"debug\" | \"info\" | \"warn\" | \"error\",\n) => {\n switch (logLevel) {\n case \"debug\":\n return DiagLogLevel.DEBUG;\n case \"info\":\n return DiagLogLevel.INFO;\n case \"warn\":\n return DiagLogLevel.WARN;\n case \"error\":\n return DiagLogLevel.ERROR;\n }\n};\n\nexport const _resetConfiguration = () => {\n _configuration = undefined;\n};\n","import { context, trace, Tracer, TracerProvider } from \"@opentelemetry/api\";\nimport { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks';\nimport { registerInstrumentations } from \"@opentelemetry/instrumentation\";\nimport { AlwaysOnSampler } from \"@opentelemetry/sdk-trace-base\";\nimport {\n NodeTracerProvider,\n} from \"@opentelemetry/sdk-trace-node\";\nimport { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from \"@opentelemetry/semantic-conventions\";\n\nimport { version as SDK_VERSION } from \"../../../package.json\";\nimport { initializeLogger } from \"../../utils\";\nimport { _configuration } from \"../configuration\";\nimport { InitializeOptions } from \"../interfaces\";\nimport { createResource } from \"./compat\";\nimport { initializeLaminarInstrumentations } from \"./instrumentations\";\nimport { LaminarSpanProcessor } from \"./processor\";\nimport { isGlobalContextManagerConfigured } from \"./utils\";\n\nconst logger = initializeLogger();\n\nlet spanProcessor: LaminarSpanProcessor;\nlet tracerProvider: TracerProvider | undefined;\nlet _baseHttpUrl: string = \"https://api.lmnr.ai:443\";\nlet _apiKey: string | undefined;\n\n/**\n * Initializes the Tracing SDK.\n * Must be called once before any other SDK methods.\n *\n * @param options - The options to initialize the SDK. See the {@link InitializeOptions}\n * for details.\n */\nexport const startTracing = (options: InitializeOptions) => {\n _baseHttpUrl = `${options.baseUrl}:${options.httpPort ?? 443}`;\n _apiKey = options.apiKey;\n\n const instrumentations = initializeLaminarInstrumentations({\n baseUrl: _baseHttpUrl,\n apiKey: _apiKey,\n suppressContentTracing: !shouldSendTraces(),\n instrumentModules: options.instrumentModules,\n });\n\n const port = options.forceHttp ? options.httpPort : options.port;\n spanProcessor = new LaminarSpanProcessor({\n baseUrl: options.baseUrl,\n port,\n apiKey: options.apiKey,\n forceHttp: options.forceHttp,\n traceExportTimeoutMillis: options.traceExportTimeoutMillis,\n maxExportBatchSize: options.maxExportBatchSize,\n exporter: options.exporter,\n disableBatch: options.disableBatch,\n });\n\n const newProvider = new NodeTracerProvider({\n spanProcessors: [spanProcessor],\n sampler: new AlwaysOnSampler(),\n resource: createResource(\n {\n [ATTR_SERVICE_NAME]: \"laminar-tracer-resource\",\n [ATTR_SERVICE_VERSION]: SDK_VERSION,\n },\n ),\n });\n\n tracerProvider = newProvider;\n\n // Usually, we would do `tracerProvider.register()`, which does three things:\n // 1. Sets the global tracer provider\n // 2. Sets the global context manager to a default one, unless we specify a custom one\n // 3. Sets the global propagator to a default one, unless we specify a custom one\n // We don't do that, because Opentelemetry only allows setting these global\n // OTel API instances once.\n //\n // Instead, we do the following:\n // 1. Carry the global tracer provider around without globally registering it.\n // - Set this tracer provider in the auto-instrumentations from OpenLLMetry\n // - expose the `getTracer` function, which will return a tracer from our\n // tracer provider.\n // 2. Set a context manager globally, only if we are the first ones to do so.\n // - If we are not the first ones, we don't set the global context manager.\n // - If an existing context manager is not broken, it suffices for our purposes\n // for carrying the parent span context.\n // - If any library tries to do so afterwards (and they will, e.g. @vercel/otel\n // or @sentry/node do tracerProvider.register() internally), there will be\n // an error message at their initialization.\n // - We recommend to initialize Laminar after other tracing libraries to avoid that\n // 3. We don't do anything about the propagator, because no Laminar functionality\n // depends on it. We might want to revisit this in the future w.r.t. `LaminarSpanContext`.\n\n // This is a small hack to only set the global context manager if there is none.\n if (!isGlobalContextManagerConfigured()) {\n const contextManager = new AsyncLocalStorageContextManager();\n contextManager.enable();\n context.setGlobalContextManager(contextManager);\n logger.debug('Laminar set global OTel Context Manager');\n }\n logger.debug('Global OTel Context Manager exists');\n\n\n logger.debug(`Laminar registering ${instrumentations.length} instrumentations`);\n // Similarly, we carry our global tracer provider around without globally\n // registering it.\n registerInstrumentations({\n instrumentations,\n tracerProvider: newProvider,\n });\n};\n\nexport const patchModules = (modules: InitializeOptions[\"instrumentModules\"]) => {\n const instrumentations = initializeLaminarInstrumentations({\n baseUrl: _baseHttpUrl,\n apiKey: _apiKey,\n instrumentModules: modules,\n suppressContentTracing: !shouldSendTraces(),\n });\n registerInstrumentations({\n instrumentations,\n tracerProvider: tracerProvider,\n });\n};\n\n\nexport const shouldSendTraces = () => {\n if (!_configuration) {\n /**\n * We've only seen this happen in Next.js where apparently\n * the initialization in `instrumentation.ts` somehow does not\n * respect `Object.freeze`. Unlike original OpenLLMetry/Traceloop,\n * we return true here, because we have other mechanisms\n * {@link withTracingLevel} to disable tracing inputs and outputs.\n */\n return true;\n }\n\n if (\n _configuration.traceContent === false ||\n (process.env.TRACELOOP_TRACE_CONTENT || \"true\").toLowerCase() === \"false\"\n ) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Get the tracer provider. Returns Laminar's tracer provider if Laminar is initialized,\n * otherwise returns the global tracer provider.\n * @returns The tracer provider.\n */\nexport const getTracerProvider = (): TracerProvider => tracerProvider ?? trace.getTracerProvider();\n\n/**\n * Get the tracer.\n * @returns Laminar's tracer if Laminar is initialized,\n * otherwise returns Laminar's tracer from the global tracer provider\n *\n * @example\n * // instrumentation.ts\n * import { Laminar } from '@lmnr-ai/lmnr';\n * Laminar.initialize()\n *\n * // File that calls AI SDK.\n * import { getTracer } from '@lmnr-ai/lmnr';\n * import { openai } from \"@ai-sdk/openai\";\n * import { generateText } from \"ai\";\n *\n * const response = await generateText({\n * model: openai(\"gpt-4.1-nano\"),\n * prompt: \"What is the capital of France?\",\n * experimental_telemetry: {\n * isEnabled: true,\n * tracer: getTracer(),\n * }\n * })\n */\nexport const getTracer = (): Tracer => {\n const TRACER_NAME = \"lmnr.tracer\";\n const TRACER_VERSION = \"0.0.1\";\n const provider = getTracerProvider();\n return provider.getTracer(TRACER_NAME, TRACER_VERSION);\n};\n\nexport const forceFlush = async () => {\n await spanProcessor.forceFlush();\n};\n","// Forward-compatibility with OTel v2 / v0.200 SDKs\nimport { Resource } from \"@opentelemetry/resources\";\nimport { ReadableSpan, Span as SdkSpan } from \"@opentelemetry/sdk-trace-base\";\nimport {\n ReadableSpan as OTelV2ReadableSpan,\n Span as OTelV2Span,\n} from \"@opentelemetry/sdk-trace-base-v2\";\n\n// In-place edits on span object for compatibility between OTel v1 and v2 SDKs\nexport const makeSpanOtelV2Compatible = (\n span: SdkSpan | OTelV2Span | ReadableSpan | OTelV2ReadableSpan,\n) => {\n if ((span as unknown as OTelV2Span).instrumentationScope\n && !(span as unknown as SdkSpan).instrumentationLibrary) {\n // Making the spans from V2 compatible with V1\n Object.assign(span, {\n instrumentationLibrary: (span as unknown as OTelV2Span).instrumentationScope,\n });\n } else if ((span as unknown as SdkSpan).instrumentationLibrary\n && !(span as unknown as OTelV2Span).instrumentationScope) {\n // Making the spans from V1 compatible with V2\n Object.assign(span, {\n instrumentationScope: (span as unknown as SdkSpan).instrumentationLibrary,\n });\n }\n};\n\nexport const getParentSpanId = (\n span: SdkSpan | OTelV2Span | ReadableSpan | OTelV2ReadableSpan,\n): string | undefined => (span as unknown as OTelV2Span).parentSpanContext?.spanId\n ?? (span as unknown as SdkSpan).parentSpanId;\n\nexport const createResource = (\n attributes: Record<string, string>,\n) =>\n // For v2 this would be:\n // const { resourceFromAttributes } = require(\"@opentelemetry/resources\");\n // return resourceFromAttributes(attributes);\n new Resource(attributes);\n","import { Instrumentation } from \"@opentelemetry/instrumentation\";\nimport { AnthropicInstrumentation } from \"@traceloop/instrumentation-anthropic\";\nimport { AzureOpenAIInstrumentation } from \"@traceloop/instrumentation-azure\";\nimport { BedrockInstrumentation } from \"@traceloop/instrumentation-bedrock\";\nimport { ChromaDBInstrumentation } from \"@traceloop/instrumentation-chromadb\";\nimport { CohereInstrumentation } from \"@traceloop/instrumentation-cohere\";\nimport { LangChainInstrumentation } from \"@traceloop/instrumentation-langchain\";\nimport { LlamaIndexInstrumentation } from \"@traceloop/instrumentation-llamaindex\";\nimport { OpenAIInstrumentation } from \"@traceloop/instrumentation-openai\";\nimport { PineconeInstrumentation } from \"@traceloop/instrumentation-pinecone\";\nimport { QdrantInstrumentation } from \"@traceloop/instrumentation-qdrant\";\nimport { TogetherInstrumentation } from \"@traceloop/instrumentation-together\";\nimport {\n AIPlatformInstrumentation,\n VertexAIInstrumentation,\n} from \"@traceloop/instrumentation-vertexai\";\n\nimport { PlaywrightInstrumentation, StagehandInstrumentation } from \"../../browser\";\nimport { PuppeteerInstrumentation } from \"../../browser/puppeteer\";\nimport { LaminarClient } from \"../../client\";\nimport { InitializeOptions } from \"../interfaces\";\n\n/**\n * Initialize and return Laminar instrumentations.\n * Useful to use with libraries that initialize tracing and can register passed\n * instrumentations.\n *\n * @param options\n * @param {string} options.baseUrl - Base URL of the Laminar API.\n * @param {string} options.apiKey - Laminar project API key. If not provided, will use\n * the LMNR_PROJECT_API_KEY environment variable.\n * @param {number} options.httpPort - Laminar API http port. If not provided, will use\n * the port from the baseUrl or defaults to 443. Only required for Playwright/Puppeteer\n * instrumentations for sending browser sessions.\n * @param {boolean} options.suppressContentTracing - Whether to suppress content tracing.\n * @param {InitializeOptions[\"instrumentModules\"]} options.instrumentModules - Record of modules\n * to instrument.\n * If not provided, all auto-instrumentable modules will be instrumented, which include\n * LLM calls (OpenAI, Anthropic, etc), Langchain, VectorDB calls (Pinecone, Qdrant, etc).\n * Pass an empty object {} to disable any kind of automatic instrumentation.\n * If you only want to auto-instrument specific modules, then pass them in the object.\n *\n * @returns {Instrumentation[]} Array of enabled instrumentations. It is your responsibility\n * to enable them and register them with the OpenTelemetry SDK. For example, you could use\n * registerInstrumentations from the opentelemetry-api to register them.\n */\nexport const initializeLaminarInstrumentations = (\n options: {\n baseUrl?: string,\n apiKey?: string,\n httpPort?: number,\n suppressContentTracing?: boolean,\n instrumentModules?: InitializeOptions[\"instrumentModules\"],\n } = {},\n) => {\n const url = options.baseUrl ?? process?.env?.LMNR_BASE_URL ?? 'https://api.lmnr.ai';\n const port = options.httpPort ?? (\n url.match(/:\\d{1,5}$/g)\n ? parseInt(url.match(/:\\d{1,5}$/g)![0].slice(1))\n : 443);\n const urlWithoutSlash = url.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n const client = new LaminarClient({\n baseUrl: `${urlWithoutSlash}:${port}`,\n projectApiKey: options.apiKey ?? process.env.LMNR_PROJECT_API_KEY!,\n });\n\n return options?.instrumentModules !== undefined\n ? manuallyInitInstrumentations(\n client,\n options.instrumentModules,\n options.suppressContentTracing,\n )\n : initInstrumentations(\n client,\n options.suppressContentTracing,\n );\n};\n\nconst initInstrumentations = (\n client: LaminarClient,\n suppressContentTracing?: boolean,\n): Instrumentation[] => {\n const enrichTokens = false;\n const instrumentations: Instrumentation[] = [];\n\n instrumentations.push(new OpenAIInstrumentation({\n enrichTokens,\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new AnthropicInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new AzureOpenAIInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new CohereInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new VertexAIInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new AIPlatformInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new BedrockInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new PineconeInstrumentation());\n\n instrumentations.push(new LangChainInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new LlamaIndexInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new TogetherInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new ChromaDBInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new QdrantInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n const playwrightInstrumentation = new PlaywrightInstrumentation(client);\n instrumentations.push(playwrightInstrumentation);\n\n instrumentations.push(new StagehandInstrumentation(playwrightInstrumentation));\n\n instrumentations.push(new PuppeteerInstrumentation(client));\n\n return instrumentations;\n};\n\nconst manuallyInitInstrumentations = (\n client: LaminarClient,\n instrumentModules: InitializeOptions[\"instrumentModules\"],\n suppressContentTracing?: boolean,\n): Instrumentation[] => {\n const enrichTokens = false;\n const instrumentations: Instrumentation[] = [];\n let playwrightInstrumentation: PlaywrightInstrumentation | undefined;\n\n if (instrumentModules?.OpenAI && instrumentModules?.openAI) {\n throw new Error(\n \"`openAI` is deprecated, but both `OpenAI` and `openAI` are provided. \" +\n \"Please use `OpenAI` only.\",\n );\n }\n\n if (instrumentModules?.openAI) {\n const openAIInstrumentation = new OpenAIInstrumentation({\n enrichTokens,\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(openAIInstrumentation);\n openAIInstrumentation.manuallyInstrument(instrumentModules.openAI);\n }\n\n if (instrumentModules?.OpenAI) {\n const openAIInstrumentation = new OpenAIInstrumentation({\n enrichTokens,\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(openAIInstrumentation);\n openAIInstrumentation.manuallyInstrument(instrumentModules.OpenAI);\n }\n\n if (instrumentModules?.anthropic) {\n const anthropicInstrumentation = new AnthropicInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(anthropicInstrumentation);\n anthropicInstrumentation.manuallyInstrument(instrumentModules.anthropic as any);\n }\n\n if (instrumentModules?.azureOpenAI) {\n const azureOpenAIInstrumentation = new AzureOpenAIInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(azureOpenAIInstrumentation as Instrumentation);\n azureOpenAIInstrumentation.manuallyInstrument(instrumentModules.azureOpenAI);\n }\n\n if (instrumentModules?.cohere) {\n const cohereInstrumentation = new CohereInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(cohereInstrumentation);\n cohereInstrumentation.manuallyInstrument(instrumentModules.cohere);\n }\n\n if (instrumentModules?.google_vertexai) {\n const vertexaiInstrumentation = new VertexAIInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(vertexaiInstrumentation);\n vertexaiInstrumentation.manuallyInstrument(\n instrumentModules.google_vertexai,\n );\n }\n\n if (instrumentModules?.google_aiplatform) {\n const aiplatformInstrumentation = new AIPlatformInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(aiplatformInstrumentation);\n aiplatformInstrumentation.manuallyInstrument(\n instrumentModules.google_aiplatform,\n );\n }\n\n if (instrumentModules?.bedrock) {\n const bedrockInstrumentation = new BedrockInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(bedrockInstrumentation);\n bedrockInstrumentation.manuallyInstrument(instrumentModules.bedrock);\n }\n\n if (instrumentModules?.pinecone) {\n const instrumentation = new PineconeInstrumentation();\n instrumentations.push(instrumentation as Instrumentation);\n instrumentation.manuallyInstrument(instrumentModules.pinecone);\n }\n\n if (instrumentModules?.langchain) {\n const langchainInstrumentation = new LangChainInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(langchainInstrumentation);\n langchainInstrumentation.manuallyInstrument(instrumentModules.langchain);\n }\n\n if (instrumentModules?.llamaIndex) {\n const llamaIndexInstrumentation = new LlamaIndexInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(llamaIndexInstrumentation);\n llamaIndexInstrumentation.manuallyInstrument(instrumentModules.llamaIndex);\n }\n\n if (instrumentModules?.chromadb) {\n const chromadbInstrumentation = new ChromaDBInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(chromadbInstrumentation);\n chromadbInstrumentation.manuallyInstrument(instrumentModules.chromadb);\n }\n\n if (instrumentModules?.qdrant) {\n const qdrantInstrumentation = new QdrantInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(qdrantInstrumentation);\n qdrantInstrumentation.manuallyInstrument(instrumentModules.qdrant);\n }\n\n if (instrumentModules?.together) {\n const togetherInstrumentation = new TogetherInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(togetherInstrumentation);\n togetherInstrumentation.manuallyInstrument(instrumentModules.together as any);\n }\n\n if (instrumentModules?.playwright) {\n playwrightInstrumentation = new PlaywrightInstrumentation(client);\n instrumentations.push(playwrightInstrumentation);\n playwrightInstrumentation.manuallyInstrument(instrumentModules.playwright);\n }\n\n if (instrumentModules?.puppeteer) {\n const puppeteerInstrumentation = new PuppeteerInstrumentation(client);\n instrumentations.push(puppeteerInstrumentation);\n puppeteerInstrumentation.manuallyInstrument(instrumentModules.puppeteer);\n }\n\n if (instrumentModules?.stagehand) {\n if (!playwrightInstrumentation) {\n playwrightInstrumentation = new PlaywrightInstrumentation(client);\n instrumentations.push(playwrightInstrumentation);\n }\n const stagehandInstrumentation = new StagehandInstrumentation(playwrightInstrumentation);\n instrumentations.push(stagehandInstrumentation);\n stagehandInstrumentation.manuallyInstrument(instrumentModules.stagehand);\n }\n\n return instrumentations;\n};\n","import { diag, Span, trace } from '@opentelemetry/api';\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\nimport { existsSync } from 'fs';\nimport { readFile } from \"fs/promises\";\nimport path from \"path\";\nimport type * as PlaywrightLib from \"playwright\";\nimport type { Browser, BrowserContext, Page } from 'playwright';\n\nimport { version as SDK_VERSION } from \"../../package.json\";\nimport { LaminarClient } from '../client';\nimport { observe } from '../decorators';\nimport { Laminar } from '../laminar';\nimport { TRACE_HAS_BROWSER_SESSION } from '../opentelemetry-lib/tracing/attributes';\nimport { getDirname, initializeLogger, newUUID, NIL_UUID, StringUUID } from '../utils';\nimport { collectAndSendPageEvents } from \"./utils\";\n\nconst logger = initializeLogger();\n\nconst RRWEB_SCRIPT_PATH = (() => {\n const fileName = 'rrweb.umd.min.cjs';\n const standardPath = path.join(getDirname(), '..', 'assets', 'rrweb', fileName);\n // Fallback paths for different environments and tests\n const fallbackPaths = [\n path.join(getDirname(), '..', '..', 'assets', 'rrweb', fileName), // For tests\n path.join(process.cwd(), 'assets', 'rrweb', fileName), // Using cwd\n path.join(process.cwd(), '@lmnr-ai/lmnr', 'assets', 'rrweb', fileName), // Absolute path\n ];\n\n try {\n if (existsSync(standardPath)) {\n return standardPath;\n }\n\n for (const fallbackPath of fallbackPaths) {\n if (existsSync(fallbackPath)) {\n return fallbackPath;\n }\n }\n\n // If no path exists, return the standard path and let it fail with a clear error\n return standardPath;\n } catch {\n // In case fs.existsSync fails, return the standard path\n return standardPath;\n }\n})();\n\n/* eslint-disable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return\n*/\nexport class PlaywrightInstrumentation extends InstrumentationBase {\n private _patchedBrowsers: Set<Browser> = new Set();\n private _patchedContexts: Set<BrowserContext> = new Set();\n private _patchedPages: Set<Page> = new Set();\n private _parentSpan: Span | undefined;\n private _client: LaminarClient;\n\n constructor(client: LaminarClient) {\n super(\n \"@lmnr/playwright-instrumentation\",\n SDK_VERSION,\n {\n enabled: true,\n },\n );\n this._parentSpan = undefined;\n this._client = client;\n }\n\n // It's the caller's responsibility to ensure the span is ended\n public setParentSpan(span: Span) {\n this._parentSpan = span;\n }\n\n protected init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(\n \"playwright\",\n // TODO: test if the older versions work\n ['>=1.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return module;\n }\n\n public manuallyInstrument(pwModule: {\n chromium?: typeof PlaywrightLib.chromium,\n firefox?: typeof PlaywrightLib.firefox,\n webkit?: typeof PlaywrightLib.webkit,\n }) {\n const browsers = [pwModule.chromium, pwModule.firefox, pwModule.webkit] as const;\n\n for (const browserType of browsers) {\n if (browserType) {\n this._wrap(\n browserType,\n 'launch',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n browserType,\n 'connect',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n browserType,\n 'connectOverCDP',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n browserType,\n 'launchPersistentContext',\n this.patchBrowserNewContext(),\n );\n }\n }\n\n return pwModule;\n }\n\n private patch(moduleExports: typeof PlaywrightLib, moduleVersion?: string) {\n diag.debug(`patching playwright ${moduleVersion}`);\n const browsers = ['chromium', 'firefox', 'webkit'] as const;\n\n for (const browserType of browsers) {\n if (moduleExports[browserType]) {\n // First we need to patch the browser launch to get access to the Page class\n this._wrap(\n moduleExports[browserType],\n `launch`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports[browserType],\n `connect`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports[browserType],\n 'connectOverCDP',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports[browserType],\n 'launchPersistentContext',\n this.patchBrowserNewContext(),\n );\n }\n }\n\n return moduleExports;\n }\n\n private unpatch(moduleExports: typeof PlaywrightLib, moduleVersion?: string) {\n diag.debug(`unpatching playwright ${moduleVersion}`);\n const browsers = ['chromium', 'firefox', 'webkit'] as const;\n\n for (const browserType of browsers) {\n if (moduleExports[browserType]) {\n // First we need to patch the browser launch to get access to the Page class\n this._wrap(\n moduleExports[browserType],\n `launch`,\n this.patchNewBrowser(),\n );\n }\n }\n\n for (const browser of this._patchedBrowsers) {\n this._unwrap(browser, 'newContext');\n this._unwrap(browser, 'newPage');\n }\n for (const context of this._patchedContexts) {\n this._unwrap(context, 'newPage');\n }\n for (const page of this._patchedPages) {\n this._unwrap(page, 'close');\n }\n }\n\n private patchNewBrowser() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: any[]) {\n const browser: Browser = await original.call(this, ...args);\n if (!plugin._parentSpan) {\n plugin._parentSpan = Laminar.startSpan({\n name: 'playwright',\n });\n }\n\n for (const context of browser.contexts()) {\n await Promise.all(context.pages().map(page => plugin.patchPage(page)));\n plugin._wrap(\n context,\n 'newPage',\n plugin.patchBrowserContextNewPage(),\n );\n context.on('page', (page: Page) => plugin.patchPage(page));\n plugin._patchedContexts.add(context);\n }\n\n plugin._wrap(\n browser,\n 'newContext',\n plugin.patchBrowserNewContext(),\n );\n\n plugin._wrap(\n browser,\n 'newPage',\n plugin.patchBrowserNewPage(),\n );\n\n plugin._wrap(\n browser,\n 'close',\n plugin.patchBrowserClose(),\n );\n\n plugin._patchedBrowsers.add(browser);\n return browser;\n };\n }\n\n private patchBrowserClose() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: unknown[]) {\n await original.call(this, ...args);\n if (plugin._parentSpan?.isRecording()) {\n plugin._parentSpan?.end();\n }\n };\n }\n\n private patchBrowserNewContext() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: unknown[]) {\n const context: BrowserContext = await original.bind(this).apply(this, args);\n if (!plugin._parentSpan) {\n plugin._parentSpan = Laminar.startSpan({\n name: 'playwright',\n });\n }\n // Patch pages that are created manually from Playwright\n plugin._wrap(\n context,\n 'newPage',\n plugin.patchBrowserContextNewPage(),\n );\n plugin._wrap(\n context,\n 'close',\n plugin.patchBrowserContextClose(),\n );\n // Patch pages created by browser, e.g. new tab\n context.on('page', async (page) => plugin.patchPage(page));\n\n // Patch pages that are already created\n for (const page of context.pages()) {\n await plugin.patchPage(page);\n }\n\n plugin._patchedContexts.add(context);\n return context;\n };\n }\n\n private patchBrowserContextClose() {\n const plugin = this;\n return (original: Function) => async function method(this: BrowserContext, ...args: unknown[]) {\n await original.bind(this).apply(this, args);\n if (plugin._parentSpan?.isRecording()) {\n plugin._parentSpan.end();\n }\n };\n }\n\n private patchBrowserNewPage() {\n return (original: Function) => async function method(this: Browser, ...args: unknown[]) {\n const page = await original.bind(this).apply(this, args);\n if (!page) {\n return null;\n }\n // TODO: investigate why this creates a separate empty span and no events\n // await plugin.patchPage(page);\n return page;\n };\n }\n\n public patchBrowserContextNewPage() {\n const plugin = this;\n return (original: Function) => async function method(this: BrowserContext, ...args: unknown[]) {\n const page = await original.bind(this).apply(this, args);\n if (!plugin._parentSpan) {\n plugin._parentSpan = Laminar.startSpan({\n name: 'playwright',\n });\n }\n if (!page) {\n return null;\n }\n\n await plugin.patchPage(page);\n\n return page;\n };\n }\n\n public async patchPage(page: Page) {\n return await Laminar.withSpan(this._parentSpan!, async () => {\n // Note: be careful with await here, if the await is removed,\n // this creates a race condition, and playwright fails.\n await observe({ name: 'playwright.page' }, async () => {\n await this._patchPage(page);\n });\n });\n }\n\n private async _patchPage(page: Page) {\n const originalBringToFront = page.bringToFront.bind(page);\n page.bringToFront = async () => {\n await originalBringToFront();\n await page.evaluate(() => {\n if ((window as any).lmnrRrweb) {\n try {\n (window as any).lmnrRrweb.record.takeFullSnapshot();\n } catch (error) {\n console.error(\"Failed to take full snapshot: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n });\n };\n\n page.addListener(\"domcontentloaded\", (p: Page) => {\n this.injectRrweb(p).catch(error => {\n logger.error(\"Failed to inject rrweb: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n\n await this.injectRrweb(page);\n this._patchedPages.add(page);\n\n trace.getActiveSpan()?.setAttribute(TRACE_HAS_BROWSER_SESSION, true);\n\n const traceId = trace.getActiveSpan()?.spanContext().traceId as StringUUID ?? NIL_UUID;\n const sessionId = newUUID();\n const interval = setInterval(() => {\n if (page.isClosed()) {\n clearInterval(interval);\n return;\n }\n collectAndSendPageEvents(this._client, page, sessionId, traceId)\n .catch(error => {\n logger.error(\"Event collection stopped: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }, 2000);\n\n page.addListener('close', async () => {\n clearInterval(interval);\n await collectAndSendPageEvents(this._client, page, sessionId, traceId);\n for (const otherPage of page.context().pages().reverse()) {\n try {\n await otherPage.bringToFront();\n break;\n } catch (error) {\n logger.debug(\"Failed to bring page to front: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n });\n }\n\n private async injectRrweb(page: Page) {\n // Wait for the page to be in a ready state first\n await page.waitForLoadState('domcontentloaded');\n const tryRunScript = async (\n script: (...args: any[]) => Promise<any>,\n maxAttempts: number = 5,\n ) => {\n for (let i = 0; i < maxAttempts; i++) {\n try {\n return await script();\n } catch (error) {\n logger.error(\"Operation \" + script.name + \" failed: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n await new Promise(resolve => setTimeout(resolve, 500));\n }\n };\n\n const isRrwebPresent = await page.evaluate(() =>\n typeof (window as any).lmnrRrweb !== 'undefined',\n );\n\n // Load rrweb and set up recording\n if (!isRrwebPresent) {\n const script = await readFile(RRWEB_SCRIPT_PATH, 'utf8');\n await tryRunScript(async function injectRrweb() {\n await page.evaluate(script);\n const res = await page.waitForFunction(\n () => 'lmnrRrweb' in window || (window as any).lmnrRrweb,\n {\n timeout: 5000,\n },\n );\n if (!res) {\n throw new Error('Failed to inject rrweb');\n }\n });\n }\n\n // Update the recording setup to include trace ID\n await tryRunScript(async function setupRrwebCollection() {\n await page.evaluate(() => {\n const HEARTBEAT_INTERVAL = 1000; // 1 second heartbeat\n\n (window as any).lmnrRrwebEventsBatch = new Set();\n\n (window as any).lmnrPageIsFocused = true;\n window.addEventListener('blur', () => {\n (window as any).lmnrPageIsFocused = false;\n });\n window.addEventListener('focus', () => {\n (window as any).lmnrPageIsFocused = true;\n });\n\n const compressEventData = async (data: any) => {\n const jsonString = JSON.stringify(data);\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 return Array.from(new Uint8Array(compressedData));\n };\n\n (window as any).lmnrGetAndClearEvents = () => {\n const events = (window as any).lmnrRrwebEventsBatch;\n (window as any).lmnrRrwebEventsBatch = new Set();\n return Array.from(events);\n };\n\n setInterval(() => {\n if (!(window as any).lmnrPageIsFocused) {\n return;\n }\n (window as any).lmnrRrweb.record.addCustomEvent('heartbeat', {\n title: document.title,\n url: document.URL,\n });\n }, HEARTBEAT_INTERVAL);\n\n (window as any).lmnrRrweb.record({\n async emit(event: any) {\n // Ignore events from all tabs except the current one\n if (!(window as any).lmnrPageIsFocused) {\n return;\n }\n const compressedEvent = {\n ...event,\n data: await compressEventData(event.data),\n };\n (window as any).lmnrRrwebEventsBatch.add(compressedEvent);\n },\n });\n });\n });\n };\n}\n/* eslint-enable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return\n*/\n","import {\n Attributes,\n AttributeValue,\n Context,\n context as contextApi,\n isSpanContextValid,\n Span,\n TimeInput,\n trace,\n} from '@opentelemetry/api';\n\nimport { InitializeOptions, initializeTracing } from './opentelemetry-lib';\nimport { forceFlush, getTracer, patchModules } from './opentelemetry-lib/tracing/';\nimport {\n ASSOCIATION_PROPERTIES,\n LaminarAttributes,\n SESSION_ID,\n SPAN_INPUT,\n SPAN_OUTPUT,\n SPAN_TYPE,\n USER_ID,\n} from './opentelemetry-lib/tracing/attributes';\nimport { ASSOCIATION_PROPERTIES_KEY } from './opentelemetry-lib/tracing/utils';\nimport { LaminarSpanContext } from './types';\nimport {\n initializeLogger,\n isOtelAttributeValueType,\n metadataToAttributes,\n otelSpanIdToUUID,\n otelTraceIdToUUID,\n StringUUID,\n tryToOtelSpanContext,\n} from './utils';\n\nconst logger = initializeLogger();\n\ninterface LaminarInitializeProps {\n projectApiKey?: string;\n baseUrl?: string;\n httpPort?: number;\n grpcPort?: number;\n instrumentModules?: InitializeOptions[\"instrumentModules\"];\n disableBatch?: boolean;\n traceExportTimeoutMillis?: number;\n logLevel?: \"debug\" | \"info\" | \"warn\" | \"error\";\n maxExportBatchSize?: number;\n forceHttp?: boolean;\n}\n\ntype LaminarAttributesProp = Record<\n typeof LaminarAttributes[keyof typeof LaminarAttributes],\n AttributeValue\n>;\n\nexport class Laminar {\n private static baseHttpUrl: string;\n private static projectApiKey: string;\n private static isInitialized: boolean = false;\n /**\n * Initialize Laminar context across the application.\n * This method must be called before using any other Laminar methods or decorators.\n *\n * @param {LaminarInitializeProps} props - Configuration object.\n * @param {string} props.projectApiKey - Laminar project api key. You can generate one by going\n * to the projects settings page on the Laminar dashboard.\n * If not specified, it will try to read from the LMNR_PROJECT_API_KEY environment variable.\n * @param {string} props.baseUrl - Laminar API url. Do not include the port, use\n * `httpPort` and `grpcPort` instead.\n * If not specified, defaults to https://api.lmnr.ai.\n * @param {number} props.httpPort - Laminar API http port.\n * If not specified, defaults to 443.\n * @param {number} props.grpcPort - Laminar API grpc port.\n * If not specified, defaults to 8443.\n * @param {InitializeOptions[\"instrumentModules\"]} props.instrumentModules - Record\n * of modules to instrument.\n * If not specified, all auto-instrumentable modules will be instrumented, which include\n * LLM calls (OpenAI, Anthropic, etc), Langchain, VectorDB calls (Pinecone, Qdrant, etc).\n * Pass an empty object {} to disable any kind of automatic instrumentation.\n * If you only want to auto-instrument specific modules, then pass them in the object.\n * @param {boolean} props.disableBatch - Whether to disable batching of spans. Useful for debug\n * environments. If true, spans will be sent immediately using {@link SimpleSpanProcessor}\n * instead of {@link BatchSpanProcessor}.\n * @param {number} props.traceExportTimeoutMillis - Timeout for trace export.\n * Defaults to 30_000 (30 seconds),\n * which is over the default OTLP exporter timeout of 10_000 (10 seconds).\n * @param {string} props.logLevel - OTel log level. Defaults to \"error\".\n * @param {number} props.maxExportBatchSize - Maximum number of spans to export in a single batch.\n * Ignored when `disableBatch` is true.\n * @param {boolean} props.forceHttp - Whether to force HTTP export. Not recommended.\n *\n * @example\n * import { Laminar } from '@lmnr-ai/lmnr';\n * import { OpenAI } from 'openai';\n * import * as ChainsModule from \"langchain/chains\";\n *\n * // Initialize Laminar while auto-instrumenting Langchain and OpenAI modules.\n * Laminar.initialize({\n * projectApiKey: \"<LMNR_PROJECT_API_KEY>\",\n * instrumentModules: {\n * langchain: {\n * chainsModule: ChainsModule\n * },\n * openAI: OpenAI\n * }\n * });\n *\n * @throws {Error} - If project API key is not set\n */\n public static initialize({\n projectApiKey,\n baseUrl,\n httpPort,\n grpcPort,\n instrumentModules,\n disableBatch,\n traceExportTimeoutMillis,\n logLevel,\n maxExportBatchSize,\n forceHttp,\n }: LaminarInitializeProps = {}) {\n const key = projectApiKey ?? process?.env?.LMNR_PROJECT_API_KEY;\n if (key === undefined) {\n throw new Error(\n 'Please initialize the Laminar object with your project API key ' +\n 'or set the LMNR_PROJECT_API_KEY environment variable',\n );\n }\n this.projectApiKey = key;\n const url = baseUrl ?? process?.env?.LMNR_BASE_URL ?? 'https://api.lmnr.ai';\n const port = httpPort ?? (\n url.match(/:\\d{1,5}$/g)\n ? parseInt(url.match(/:\\d{1,5}$/g)![0].slice(1))\n : 443);\n const urlWithoutSlash = url.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n this.baseHttpUrl = `${urlWithoutSlash}:${port}`;\n\n this.isInitialized = true;\n\n initializeTracing({\n baseUrl: urlWithoutSlash,\n apiKey: this.projectApiKey,\n port: grpcPort,\n forceHttp,\n httpPort,\n silenceInitializationMessage: true,\n instrumentModules,\n logLevel: logLevel ?? \"error\",\n disableBatch,\n maxExportBatchSize,\n traceExportTimeoutMillis,\n });\n }\n\n /**\n * Patch modules manually. Use this in setups where {@link Laminar.initialize()}\n * and in particular its `instrumentModules` option is not working, e.g. in\n * Next.js place Laminar initialize in `instrumentation.ts`, and then patch\n * the modules in server components or API routes.\n *\n * Make sure to call this after {@link Laminar.initialize()}.\n *\n * @param {InitializeOptions[\"instrumentModules\"]} modules - Record of modules to instrument.\n */\n public static patch(modules: InitializeOptions[\"instrumentModules\"]) {\n if (!this.isInitialized) {\n logger.warn(\"Laminar must be initialized before patching modules. Skipping patch.\");\n return;\n }\n if (!modules || Object.keys(modules).length === 0) {\n throw new Error(\"Pass at least one module to patch\");\n }\n patchModules(modules);\n }\n\n /**\n * Check if Laminar has been initialized. Utility to make sure other methods\n * are called after initialization.\n */\n public static initialized(): boolean {\n return this.isInitialized;\n }\n\n /**\n * Associates an event with the current span. If event with such name never\n * existed, Laminar will create a new event and infer its type from the value.\n * If the event already exists, Laminar will append the value to the event\n * if and only if the value is of a matching type. Otherwise, the event won't\n * be recorded. Supported types are string, number, and boolean. If the value\n * is `null`, event is considered a boolean tag with the value of `true`.\n *\n * @param {string} name - The name of the event.\n * @param {AttributeValue} value - The value of the event. Must be a primitive type. If not\n * specified, boolean true is assumed in the backend.\n * @param {TimeInput} timestamp - The timestamp of the event. If not specified, relies on\n * the underlying OpenTelemetry implementation.\n * If specified as an integer, it must be epoch nanoseconds.\n */\n public static event(\n name: string,\n value?: AttributeValue,\n timestamp?: TimeInput,\n ) {\n const currentSpan = trace.getActiveSpan();\n if (currentSpan === undefined || !isSpanContextValid(currentSpan.spanContext())) {\n logger.warn(\"`Laminar().event()` called outside of span context.\" +\n ` Event '${name}' will not be recorded in the trace.` +\n \" Make sure to wrap the function with `observe` or `withSpan`\",\n );\n return;\n }\n\n const event: Attributes = {\n \"lmnr.event.type\": \"default\",\n };\n if (value !== undefined) {\n event[\"lmnr.event.value\"] = value;\n }\n\n currentSpan.addEvent(name, event, timestamp);\n }\n\n /**\n * @deprecated Use `sessionId` in {@link observe} or `session_id` in\n * {@link Laminar.setSpanSessionId} instead.\n * Sets the session information for the current span and returns the\n * context to use for the following spans. Returns the result of the\n * function execution, so can be used in an `await` statement.\n *\n * @param {string} sessionId - The session ID to associate with the context.\n * @param {Function} fn - Function to execute within the session context.\n * @returns {T} The result of the function execution.\n *\n * @example\n * import { Laminar, observe } from '@lmnr-ai/lmnr';\n * const result = await Laminar.withSession(\"session1234\", async () => {\n * // Your code here\n * });\n */\n public static withSession<T>(\n sessionId: string,\n fn: () => T,\n ): T {\n const currentSpan = trace.getActiveSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n if (sessionId) {\n currentSpan.setAttribute(SESSION_ID, sessionId);\n }\n }\n let associationProperties = {};\n if (sessionId) {\n associationProperties = { ...associationProperties, \"session_id\": sessionId };\n }\n\n let entityContext = contextApi.active();\n const currentAssociationProperties = entityContext.getValue(ASSOCIATION_PROPERTIES_KEY);\n if (associationProperties && Object.keys(associationProperties).length > 0) {\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n { ...(currentAssociationProperties ?? {}), ...associationProperties },\n );\n }\n return contextApi.with(entityContext, fn);\n }\n\n /**\n * @deprecated Use {@link Laminar.setTraceMetadata} or the `metadata` option in\n * {@link observe} instead.\n *\n * Sets the metadata for the current span and returns the context to use for\n * the following spans. Returns the result of the function execution, so can\n * be used in an `await` statement.\n *\n * @param metadata - The metadata to associate with the context. Set of string key\n * string value pairs.\n * @param fn - Function to execute within the metadata context.\n * @returns The result of the function execution.\n *\n * @example\n * import { Laminar } from '@lmnr-ai/lmnr';\n * const result = await Laminar.withMetadata(\n * {\n * \"my_metadata_key\": \"my_metadata_value\"\n * },\n * async () => {\n * // Your code here\n * }\n * );\n */\n public static withMetadata<T>(\n metadata: Record<string, string>,\n fn: () => T,\n ): T {\n const currentSpan = trace.getActiveSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n for (const [key, value] of Object.entries(metadata)) {\n currentSpan.setAttribute(`${ASSOCIATION_PROPERTIES}.metadata.${key}`, value);\n }\n }\n\n const metadataAttributes = Object.fromEntries(\n Object.entries(metadata).map(([key, value]) => {\n if (isOtelAttributeValueType(value)) {\n return [`metadata.${key}`, value];\n } else {\n return [`metadata.${key}`, JSON.stringify(value)];\n }\n }),\n );\n\n let entityContext = contextApi.active();\n const currentAssociationProperties = entityContext.getValue(ASSOCIATION_PROPERTIES_KEY);\n if (metadataAttributes && Object.keys(metadataAttributes).length > 0) {\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n { ...(currentAssociationProperties ?? {}), ...metadataAttributes },\n );\n }\n return contextApi.with(entityContext, fn);\n }\n\n /**\n * Set attributes for the current span. Useful for manual\n * instrumentation.\n * @param {LaminarAttributesProp} attributes - The attributes to set for the current span.\n *\n * @example\n * import { Laminar as L, observe } from '@lmnr-ai/laminar';\n * await observe({ name: 'mySpanName', spanType: 'LLM' }, async (msg: string) => {\n * const response = await myCustomCallToOpenAI(msg);\n * L.setSpanAttributes({\n * [LaminarAttributes.PROVIDER]: 'openai',\n * [LaminarAttributes.REQUEST_MODEL]: \"requested_model\",\n * [LaminarAttributes.RESPONSE_MODEL]: response.model,\n * [LaminarAttributes.INPUT_TOKEN_COUNT]: response.usage.prompt_tokens,\n * [LaminarAttributes.OUTPUT_TOKEN_COUNT]: response.usage.completion_tokens,\n * })\n * }, userMessage);\n */\n public static setSpanAttributes(\n attributes: LaminarAttributesProp,\n ) {\n const currentSpan = trace.getActiveSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n for (const [key, value] of Object.entries(attributes)) {\n currentSpan.setAttribute(key, value);\n }\n }\n }\n\n /**\n * Set the output of the current span. Useful for manual instrumentation.\n * @param output - Output of the span. Will be sent as an attribute, so must\n * be serializable to JSON.\n */\n public static setSpanOutput(output: any) {\n if (output == null) {\n return;\n }\n const currentSpan = trace.getActiveSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n currentSpan.setAttribute(SPAN_OUTPUT, JSON.stringify(output));\n }\n }\n\n public static setTraceMetadata(metadata: Record<string, any>) {\n const currentSpan = trace.getActiveSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n const metadataAttributes = metadataToAttributes(metadata);\n currentSpan.setAttributes(metadataAttributes);\n }\n }\n\n public static setTraceSessionId(sessionId: string) {\n const currentSpan = trace.getActiveSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n currentSpan.setAttribute(SESSION_ID, sessionId);\n }\n }\n\n public static setTraceUserId(userId: string) {\n const currentSpan = trace.getActiveSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n currentSpan.setAttribute(USER_ID, userId);\n }\n }\n\n public static setSpanTags(tags: string[]) {\n const currentSpan = trace.getActiveSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n currentSpan.setAttribute(`${ASSOCIATION_PROPERTIES}.tags`, tags);\n }\n }\n\n /**\n * Start a new span, but don't set it as active. Useful for\n * manual instrumentation. If span type is 'LLM', you should report usage\n * manually. See {@link setSpanAttributes} for more information.\n *\n * @param {Object} options\n * @param {string} options.name - name of the span\n * @param {any} options.input - input to the span. Will be sent as an attribute, so must\n * be JSON serializable\n * @param {string} options.spanType - type of the span. Defaults to 'DEFAULT'\n * @param {Context} options.context - raw OpenTelemetry context to bind the span to.\n * @param {string} options.parentSpanContext - parent span context to bind the span to.\n * @param {string[]} options.labels - [DEPRECATED] labels to associate with the span.\n * @param {string} options.tags - tags to associate with the span.\n * @returns The started span.\n *\n * @example\n * import { Laminar, observe } from '@lmnr-ai/lmnr';\n * const foo = async (span: Span) => {\n * await Laminar.withSpan(span, async () => {\n * await observe({ name: 'foo' }, async () => {\n * // Your code here\n * })\n * })\n * };\n * const bar = async (span: Span) => {\n * await Laminar.withSpan(span, async () => {\n * await openai_client.chat.completions.create();\n * })\n * };\n *\n * const parentSpan = Laminar.startSpan({name: \"outer\"});\n * foo(parentSpan);\n * await bar(parentSpan);\n * // IMPORTANT: Don't forget to end the span!\n * parentSpan.end();\n *\n * // Results in:\n * // | outer\n * // | | foo\n * // | | | ...\n * // | | bar\n * // | | | openai.chat\n */\n public static startSpan({\n name,\n input,\n spanType,\n context,\n parentSpanContext,\n labels,\n tags,\n userId,\n sessionId,\n metadata,\n }: {\n name: string,\n input?: any,\n spanType?: 'LLM' | 'DEFAULT' | 'TOOL',\n context?: Context,\n parentSpanContext?: string | LaminarSpanContext,\n labels?: string[],\n tags?: string[],\n userId?: string,\n sessionId?: string,\n metadata?: Record<string, any>,\n }): Span {\n let entityContext = context ?? contextApi.active();\n if (parentSpanContext) {\n const spanContext = tryToOtelSpanContext(parentSpanContext);\n entityContext = trace.setSpan(entityContext, trace.wrapSpanContext(spanContext));\n }\n const labelProperties = labels ? { [`${ASSOCIATION_PROPERTIES}.labels`]: labels } : {};\n const tagProperties = tags ? { [`${ASSOCIATION_PROPERTIES}.tags`]: tags } : {};\n const userIdProperties = userId ? { [USER_ID]: userId } : {};\n const sessionIdProperties = sessionId ? { [SESSION_ID]: sessionId } : {};\n const metadataProperties = metadata\n ? metadataToAttributes(metadata)\n : {};\n const attributes = {\n [SPAN_TYPE]: spanType ?? 'DEFAULT',\n ...labelProperties,\n ...tagProperties,\n ...userIdProperties,\n ...sessionIdProperties,\n ...metadataProperties,\n };\n const span = getTracer().startSpan(name, { attributes }, entityContext);\n if (input) {\n span.setAttribute(SPAN_INPUT, JSON.stringify(input));\n }\n return span;\n }\n\n /**\n * A utility wrapper around OpenTelemetry's `context.with()`. Useful for\n * passing spans around in manual instrumentation:\n *\n * @param {Span} span - Parent span to bind the execution to.\n * @param {Function} fn - Function to execute within the span context.\n * @param {boolean} endOnExit - Whether to end the span after the function has\n * executed. Defaults to `false`. If `false`, you MUST manually call\n * `span.end()` at the end of the execution, so that spans are not lost.\n * @returns The result of the function execution.\n *\n * See {@link startSpan} docs for a usage example\n */\n public static withSpan<T>(span: Span, fn: () => T, endOnExit?: boolean): T | Promise<T> {\n return contextApi.with(trace.setSpan(contextApi.active(), span), () => {\n try {\n const result = fn();\n if (result instanceof Promise) {\n return result.finally(() => {\n if (endOnExit !== undefined && endOnExit) {\n span.end();\n }\n });\n }\n if (endOnExit !== undefined && endOnExit) {\n span.end();\n }\n return result;\n }\n catch (error) {\n span.recordException(error as Error);\n if (endOnExit !== undefined && endOnExit) {\n span.end();\n }\n throw error;\n }\n });\n }\n\n public static serializeLaminarSpanContext(span?: Span): string | null {\n const laminarSpanContext = this.getLaminarSpanContext(span);\n if (laminarSpanContext === null) {\n return null;\n }\n return JSON.stringify(laminarSpanContext);\n };\n\n public static getLaminarSpanContext(span?: Span): LaminarSpanContext | null {\n const currentSpan = span ?? trace.getActiveSpan();\n if (currentSpan === undefined || !isSpanContextValid(currentSpan.spanContext())) {\n return null;\n }\n return {\n traceId: otelTraceIdToUUID(currentSpan.spanContext().traceId) as StringUUID,\n spanId: otelSpanIdToUUID(currentSpan.spanContext().spanId) as StringUUID,\n isRemote: currentSpan.spanContext().isRemote ?? false,\n };\n }\n\n /**\n * Get the trace id of the current span. Returns null if there is no active span.\n * @returns {StringUUID | null} The trace id of the current span.\n */\n public static getTraceId(): StringUUID | null {\n return this.getLaminarSpanContext()?.traceId ?? null;\n }\n\n public static async flush() {\n if (this.isInitialized) {\n logger.debug(\"Flushing spans\");\n await forceFlush();\n }\n }\n\n public static async shutdown() {\n if (this.isInitialized) {\n logger.debug(\"Shutting down Laminar\");\n await forceFlush();\n // other shutdown should go here\n }\n }\n\n public static getHttpUrl(): string {\n return this.baseHttpUrl;\n }\n\n public static getProjectApiKey(): string {\n return this.projectApiKey;\n }\n}\n","import {\n Context,\n context,\n createContextKey,\n ROOT_CONTEXT,\n} from \"@opentelemetry/api\";\n\n// Function to check if a global context manager is already configured\nexport const isGlobalContextManagerConfigured = () => {\n // Create a temporary context key for testing\n const testKey = createContextKey('lmnr-test-context-manager-check');\n\n // Create a context with this key\n const testContext = ROOT_CONTEXT.setValue(testKey, 'lmnr-test-value');\n\n // Try to make this context active\n let isContextManagerWorking = false;\n\n context.with(testContext, () => {\n // If the context manager is configured and enabled,\n // active() should return our test context\n const activeContext = context.active();\n isContextManagerWorking = activeContext.getValue(testKey) === 'lmnr-test-value';\n });\n\n return isContextManagerWorking;\n};\n\nexport const SPAN_PATH_KEY = createContextKey(\"span_path\");\nexport const ASSOCIATION_PROPERTIES_KEY = createContextKey(\n \"association_properties\",\n);\n\nexport const getSpanPath = (entityContext: Context): string | undefined => {\n const path = entityContext.getValue(SPAN_PATH_KEY) as string | undefined;\n return path ? `${path}` : undefined;\n};\n","import { LLMClient } from \"@browserbasehq/stagehand\";\nimport { Page as PlaywrightPage } from \"playwright\";\nimport { Page as PuppeteerPage } from \"puppeteer\";\nimport { z } from \"zod\";\n\nimport { LaminarClient } from \"..\";\nimport { initializeLogger, StringUUID } from \"../utils\";\n\nconst logger = initializeLogger();\n\n/**\n * If the first argument is a string, return an object with the name of the method\n * and the argument as the value.\n * Otherwise, return the shallow copy of the arguments.\n *\n * This is useful for Stagehand, where the first argument is often a string, but is named\n * 'instruction', so we add a name to it on the spans.\n *\n * @param args - Args of a function.\n * @param name - The name to add on the first argument if it is a string.\n * @returns The arguments as an object with the name of the method and the argument\n * as the value, or the arguments as is.\n */\nexport const nameArgsOrCopy = (args: any[], name: string = \"instruction\") => {\n if (args.length === 1 && typeof args[0] === 'string') {\n return { [name]: args[0] };\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return [...args];\n};\n\n\nexport const collectAndSendPageEvents = async (\n client: LaminarClient,\n page: PlaywrightPage | PuppeteerPage,\n sessionId: StringUUID,\n traceId: StringUUID,\n) => {\n try {\n if (page.isClosed()) {\n return;\n }\n\n // Puppeteer pages have the same evaluate method, but Typescript\n // isn't liking that the signature is different.\n const hasFunction = await (page as PlaywrightPage).evaluate(\n () => typeof (window as any).lmnrGetAndClearEvents === 'function',\n );\n if (!hasFunction) {\n return;\n }\n\n // Puppeteer pages have the same evaluate method, but TypeScript\n // isn't liking that the signature is different.\n\n /* eslint-disable @typescript-eslint/no-unsafe-return */\n const events = await (page as PlaywrightPage).evaluate(\n async () => {\n if (typeof (window as any).lmnrGetAndClearEvents !== 'function') {\n return [];\n }\n return await (window as any).lmnrGetAndClearEvents();\n },\n );\n /* eslint-enable @typescript-eslint/no-unsafe-return */\n if (events == null || events.length === 0) {\n return;\n }\n\n await client.browserEvents.send({\n sessionId,\n traceId,\n events,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"Execution context was destroyed\")\n || message.includes(\"Target page, context or browser has been closed\")) {\n logger.debug(`Tried to flush events from a closed page. Continuing...`);\n } else {\n logger.error(`Error sending events: ${message}`);\n }\n }\n};\n\n// Removes the heavy client prop and the apiKey to avoid security issues\nexport const cleanStagehandLLMClient = (llmClient: LLMClient | object): Omit<LLMClient, \"client\"> =>\n Object.fromEntries(\n Object.entries(llmClient)\n .filter(([key]) => key !== \"client\")\n .map(([key, value]) =>\n key === \"clientOptions\"\n ? [\n key,\n Object.fromEntries(\n Object.entries(value).filter(([key]) => key !== \"apiKey\"),\n ),\n ]\n : [key, value],\n ),\n ) as Omit<LLMClient, \"client\">;\n\n\nexport const prettyPrintZodSchema = (schema: z.AnyZodObject, indent = 2): string => {\n if (!(schema instanceof z.ZodObject)) {\n throw new Error('Not a Zod object schema');\n }\n\n const indentString = ' '.repeat(indent);\n\n const shape = schema.shape;\n const entries = Object.entries(shape);\n\n const reconstructed: string[] = entries.map(([key, value]) => {\n // Base type detection function\n const getBaseType = (val: z.ZodTypeAny): string => {\n if (val instanceof z.ZodString) {\n return 'z.string()';\n }\n if (val instanceof z.ZodNumber) {\n return 'z.number()';\n }\n if (val instanceof z.ZodBoolean) {\n return 'z.boolean()';\n }\n if (val instanceof z.ZodArray) {\n const elementType = val.element;\n if (elementType instanceof z.ZodObject) {\n return `z.array(${prettyPrintZodSchema(elementType)})`;\n } else {\n return `z.array(${getBaseType(elementType)})`;\n }\n }\n if (val instanceof z.ZodObject) {\n return prettyPrintZodSchema(val);\n }\n if (val instanceof z.ZodEnum) {\n // Try to extract enum values\n const enumValues = (val as any)._def?.values;\n if (Array.isArray(enumValues)) {\n return `z.enum([${enumValues.map(v => `'${v}'`).join(', ')}])`;\n }\n return 'z.enum([...])';\n }\n if (val instanceof z.ZodLiteral) {\n const literalValue = (val as any)._def?.value;\n if (typeof literalValue === 'string') {\n return `z.literal('${literalValue}')`;\n }\n return `z.literal(${literalValue})`;\n }\n if (val instanceof z.ZodUnion) {\n const options = (val as any)._def?.options;\n if (Array.isArray(options)) {\n return `z.union([${options.map(getBaseType).join(', ')}])`;\n }\n return 'z.union([...])';\n }\n if (val instanceof z.ZodDate) {\n return 'z.date()';\n }\n if (val instanceof z.ZodRecord) {\n const keyType = (val as any)._def?.keyType;\n const valueType = (val as any)._def?.valueType;\n\n let keyTypeStr = 'z.string()';\n if (keyType && keyType !== z.string()) {\n keyTypeStr = getBaseType(keyType);\n }\n\n let valueTypeStr = 'z.any()';\n if (valueType) {\n valueTypeStr = getBaseType(valueType);\n }\n\n return `z.record(${keyTypeStr}, ${valueTypeStr})`;\n }\n if (val instanceof z.ZodMap) {\n const keyType = (val as any)._def?.keyType;\n const valueType = (val as any)._def?.valueType;\n\n let keyTypeStr = 'z.any()';\n if (keyType) {\n keyTypeStr = getBaseType(keyType);\n }\n\n let valueTypeStr = 'z.any()';\n if (valueType) {\n valueTypeStr = getBaseType(valueType);\n }\n\n return `z.map(${keyTypeStr}, ${valueTypeStr})`;\n }\n if (val instanceof z.ZodTuple) {\n const items = (val as any)._def?.items;\n\n if (Array.isArray(items)) {\n const itemsTypeStr = items.map(item => getBaseType(item)).join(', ');\n return `z.tuple([${itemsTypeStr}])`;\n }\n return 'z.tuple([])';\n }\n if (val instanceof z.ZodNullable) {\n return `${getBaseType((val as any)._def.innerType)}.nullable()`;\n }\n if (val instanceof z.ZodOptional) {\n return `${getBaseType((val as any)._def.innerType)}.optional()`;\n }\n // Add more type checks as needed\n return 'z.any()';\n };\n\n // Check for modifiers and description\n const applyModifiers = (val: z.ZodTypeAny, baseType: string): string => {\n let result = baseType;\n let currentVal = val;\n\n // Check for .nullable() modifier\n if (currentVal instanceof z.ZodNullable) {\n result = `${getBaseType((currentVal as any)._def.innerType)}.nullable()`;\n currentVal = (currentVal as any)._def.innerType;\n }\n\n // Check for .optional() modifier\n if (currentVal instanceof z.ZodOptional) {\n if (!result.endsWith('.nullable()')) {\n result = `${getBaseType((currentVal as any)._def.innerType)}.optional()`;\n }\n currentVal = (currentVal as any)._def.innerType;\n }\n\n // Check for description\n const description = (val as any)?._def?.description;\n if (typeof description === 'string') {\n result += `.describe('${description.replace(/'/g, \"\\\\'\")}')`;\n }\n\n return result;\n };\n\n const baseType = getBaseType(value as z.ZodTypeAny);\n const finalType = applyModifiers(value as z.ZodTypeAny, baseType);\n\n return `${indentString}${key}: ${finalType},`;\n });\n\n return `z.object({\\n${reconstructed.join('\\n')}\\n})`;\n};\n\n\n// copied from https://github.com/browserbase/stagehand/blob/main/lib/llm/LLMProvider.ts#L62\n// We should either keep this in sync or replace with a simple heuristic, such as\n// if model name starts with `gpt` or `gemini` or `claude`.\nexport const modelToProviderMap: Record<string, string> = {\n \"gpt-4.1\": \"openai\",\n \"gpt-4.1-mini\": \"openai\",\n \"gpt-4.1-nano\": \"openai\",\n \"o4-mini\": \"openai\",\n //prettier-ignore\n \"o3\": \"openai\",\n \"o3-mini\": \"openai\",\n //prettier-ignore\n \"o1\": \"openai\",\n \"o1-mini\": \"openai\",\n \"gpt-4o\": \"openai\",\n \"gpt-4o-mini\": \"openai\",\n \"gpt-4o-2024-08-06\": \"openai\",\n \"gpt-4.5-preview\": \"openai\",\n \"o1-preview\": \"openai\",\n \"claude-3-5-sonnet-latest\": \"anthropic\",\n \"claude-3-5-sonnet-20240620\": \"anthropic\",\n \"claude-3-5-sonnet-20241022\": \"anthropic\",\n \"claude-3-7-sonnet-20250219\": \"anthropic\",\n \"claude-3-7-sonnet-latest\": \"anthropic\",\n \"cerebras-llama-3.3-70b\": \"cerebras\",\n \"cerebras-llama-3.1-8b\": \"cerebras\",\n \"groq-llama-3.3-70b-versatile\": \"groq\",\n \"groq-llama-3.3-70b-specdec\": \"groq\",\n \"gemini-1.5-flash\": \"google\",\n \"gemini-1.5-pro\": \"google\",\n \"gemini-1.5-flash-8b\": \"google\",\n \"gemini-2.0-flash-lite\": \"google\",\n \"gemini-2.0-flash\": \"google\",\n \"gemini-2.5-flash-preview-04-17\": \"google\",\n \"gemini-2.5-pro-preview-03-25\": \"google\",\n};\n","import type * as StagehandLib from \"@browserbasehq/stagehand\";\nimport { ActOptions, LLMClient, Page as StagehandPage } from \"@browserbasehq/stagehand\";\nimport { diag, Span, trace } from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\nimport { z } from \"zod\";\n\nimport { version as SDK_VERSION } from \"../../package.json\";\nimport { observe as laminarObserve } from \"../decorators\";\nimport { Laminar } from \"../laminar\";\nimport { SPAN_TYPE } from \"../opentelemetry-lib/tracing/attributes\";\nimport { PlaywrightInstrumentation } from \"./playwright\";\nimport {\n cleanStagehandLLMClient,\n modelToProviderMap,\n nameArgsOrCopy,\n prettyPrintZodSchema,\n} from \"./utils\";\n\ninterface GlobalLLMClientOptions {\n // named `type` in Stagehand\n provider: \"openai\" | \"anthropic\" | \"cerebras\" | \"groq\" | (string & {})\n model: string\n}\n\ntype AgentClient = {\n execute: (\n instructionOrOptions: string | StagehandLib.AgentExecuteOptions,\n ) => Promise<StagehandLib.AgentResult>;\n};\n\n/* eslint-disable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return\n*/\nexport class StagehandInstrumentation extends InstrumentationBase {\n private playwrightInstrumentation: PlaywrightInstrumentation;\n private _parentSpan: Span | undefined;\n private globalLLMClientOptions: GlobalLLMClientOptions | undefined;\n private globalAgentOptions: StagehandLib.AgentConfig | undefined;\n\n constructor(playwrightInstrumentation: PlaywrightInstrumentation) {\n super(\n \"@lmnr/browserbase-stagehand-instrumentation\",\n SDK_VERSION,\n {\n enabled: true,\n },\n );\n this.playwrightInstrumentation = playwrightInstrumentation;\n }\n\n protected init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(\n \"@browserbasehq/stagehand\",\n ['>=1.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return module;\n }\n\n private patch(moduleExports: typeof StagehandLib, moduleVersion?: string) {\n diag.debug(`patching stagehand ${moduleVersion}`);\n // Check if Stagehand is non-configurable\n const descriptor = Object.getOwnPropertyDescriptor(moduleExports, 'Stagehand');\n if (descriptor && !descriptor.configurable) {\n // Create a proxy for the entire module exports\n const originalStagehand = moduleExports.Stagehand;\n const patchedConstructor = this.patchStagehandConstructor()(originalStagehand);\n\n // Create a proxy for the module exports\n return new Proxy(moduleExports, {\n get: (target, prop) => {\n if (prop === 'Stagehand') {\n return patchedConstructor;\n }\n return target[prop as keyof typeof target];\n },\n });\n } else {\n // If it's configurable, use the standard _wrap method\n this._wrap(\n moduleExports,\n 'Stagehand',\n this.patchStagehandConstructor(),\n );\n\n return moduleExports;\n }\n }\n\n public manuallyInstrument(Stagehand: typeof StagehandLib.Stagehand) {\n diag.debug('manually instrumenting stagehand');\n\n // Since we can't replace the Stagehand constructor directly due to non-configurable property,\n // we'll patch the prototype methods of the existing constructor\n\n // First, patch the init method on the prototype\n if (Stagehand && Stagehand.prototype) {\n this._wrap(\n Stagehand.prototype,\n 'init',\n this.patchStagehandInit(),\n );\n this._wrap(\n Stagehand.prototype,\n 'close',\n this.patchStagehandClose(),\n );\n }\n }\n\n private unpatch(moduleExports: typeof StagehandLib, moduleVersion?: string) {\n diag.debug(`unpatching stagehand ${moduleVersion}`);\n this._unwrap(moduleExports, 'Stagehand');\n\n if (moduleExports.Stagehand) {\n this._unwrap(moduleExports.Stagehand.prototype, 'init');\n this._unwrap(moduleExports.Stagehand.prototype, 'close');\n if (moduleExports.Stagehand.prototype?.page) {\n this._unwrap(moduleExports.Stagehand.prototype.page, 'act');\n this._unwrap(moduleExports.Stagehand.prototype.page, 'extract');\n this._unwrap(moduleExports.Stagehand.prototype.page, 'observe');\n const observeHandler = (moduleExports.Stagehand.prototype.page as any).observeHandler;\n if (observeHandler) {\n this._unwrap(observeHandler, 'observe');\n }\n const extractHandler = (moduleExports.Stagehand.prototype.page as any).extractHandler;\n if (extractHandler) {\n this._unwrap(extractHandler, 'textExtract');\n this._unwrap(extractHandler, 'domExtract');\n }\n const actHandler = (moduleExports.Stagehand.prototype.page as any).actHandler;\n if (actHandler) {\n this._unwrap(actHandler, 'act');\n }\n }\n }\n\n return moduleExports;\n }\n\n private patchStagehandConstructor() {\n const instrumentation = this;\n\n return (Original: typeof StagehandLib.Stagehand) => {\n // Create a constructor function that maintains the same signature\n const Stagehand = function (this: InstanceType<typeof Original>, ...args: any[]) {\n // Only apply if this is a new instance\n if (!(this instanceof Stagehand)) {\n return new (Stagehand as any)(...args);\n }\n\n const instance = new Original(args.length > 0 ? args[0] : undefined);\n Object.assign(this, instance);\n\n instrumentation._wrap(\n this,\n 'init',\n instrumentation.patchStagehandInit(),\n );\n\n instrumentation._wrap(\n this,\n 'close',\n instrumentation.patchStagehandClose(),\n );\n\n return this;\n } as unknown as typeof Original;\n\n // Copy static properties\n Object.setPrototypeOf(Stagehand, Original);\n // Copy prototype properties\n Stagehand.prototype = Object.create(Original.prototype);\n Stagehand.prototype.constructor = Stagehand;\n\n return Stagehand;\n };\n }\n\n private patchStagehandInit() {\n const instrumentation = this;\n\n return (original: Function) => async function method(this: any, ...args: any[]) {\n // Make sure the parent span is set before calling the original init method\n // so that playwright instrumentation does not set its default parent span\n instrumentation._parentSpan = Laminar.startSpan({\n name: 'Stagehand',\n });\n instrumentation.playwrightInstrumentation.setParentSpan(instrumentation._parentSpan);\n\n const result = await original.bind(this).apply(this, args);\n\n await instrumentation.playwrightInstrumentation.patchPage(this.page);\n\n instrumentation._wrap(\n this,\n 'agent',\n instrumentation.patchStagehandAgentInitializer(),\n );\n\n instrumentation.patchStagehandPage(this.stagehandPage);\n instrumentation.globalLLMClientOptions = {\n provider: this.llmClient.type,\n model: this.llmClient.modelName,\n };\n instrumentation._wrap(\n this.llmClient,\n 'createChatCompletion',\n instrumentation.patchStagehandLLMClientCreateChatCompletion(),\n );\n return result;\n };\n }\n\n private patchStagehandClose() {\n const instrumentation = this;\n return (original: Function) => async function method(this: any, ...args: any[]) {\n if (instrumentation._parentSpan && instrumentation._parentSpan.isRecording()) {\n instrumentation._parentSpan.end();\n }\n await original.bind(this).apply(this, args);\n };\n }\n\n private patchStagehandPage(page: StagehandPage) {\n const actHandler = (page as any).actHandler;\n if (actHandler) {\n if (actHandler.act) {\n this._wrap(\n actHandler,\n 'act',\n this.patchStagehandV1ActHandlerAct(),\n );\n }\n if (actHandler.actFromObserveResult) {\n this._wrap(\n actHandler,\n 'actFromObserveResult',\n this.patchStagehandV2ActHandlerActFromObserveResult(),\n );\n }\n if (actHandler.observeAct) {\n this._wrap(\n actHandler,\n 'observeAct',\n this.patchStagehandV2ActHandlerObserveAct(),\n );\n }\n }\n\n const observeHandler = (page as any).observeHandler;\n if (observeHandler) {\n this._wrap(\n observeHandler,\n 'observe',\n this.patchStagehandObserveHandler(),\n );\n }\n\n const extractHandler = (page as any).extractHandler;\n if (extractHandler) {\n if (extractHandler.textExtract) {\n this._wrap(\n extractHandler,\n 'textExtract',\n this.patchStagehandExtractHandlerTextExtract(),\n );\n }\n\n if (extractHandler.domExtract) {\n this._wrap(\n extractHandler,\n 'domExtract',\n this.patchStagehandExtractHandlerDomExtract(),\n );\n }\n }\n\n this._wrap(\n page,\n 'act',\n this.patchStagehandGlobalMethod('act'),\n );\n\n this._wrap(\n page,\n 'extract',\n this.patchStagehandGlobalMethod('extract'),\n );\n\n this._wrap(\n page,\n 'observe',\n this.patchStagehandGlobalMethod('observe'),\n );\n }\n\n private patchStagehandGlobalMethod(methodName: string) {\n const instrumentation = this;\n return (original: (...args: any[]) => Promise<any>) =>\n async function method(this: any, ...args: any[]) {\n const input = nameArgsOrCopy(args);\n if (methodName === \"extract\"\n && Array.isArray(input)\n && input.length > 0 && (input[0])?.schema\n ) {\n // We need to clone the input object to avoid mutating the original object\n // because the original object is passed to the LLM client\n const { schema, ...rest } = input[0];\n let prettySchema = schema?.shape;\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n input[0] = { ...rest, schema: prettySchema };\n }\n return await Laminar.withSpan(instrumentation._parentSpan!, async () =>\n await laminarObserve(\n {\n name: `stagehand.${methodName}`,\n input,\n },\n async (thisArg, ...rest) => await original.apply(thisArg, ...rest),\n this, args,\n ),\n );\n };\n }\n\n private patchStagehandV1ActHandlerAct() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function act(this: any, ...args: any[]) {\n return await laminarObserve(\n {\n name: 'stagehand.actHandler.act',\n input: {\n action: args[0].action,\n llmClient: cleanStagehandLLMClient(args[0].llmClient ?? {}),\n chunksSeen: args[0].chunksSeen,\n steps: args[0].steps,\n requestId: args[0].requestId,\n schema: args[0].schema,\n retries: args[0].retries,\n variables: args[0].variables,\n previousSelectors: args[0].previousSelectors,\n skipActionCacheForThisStep: args[0].skipActionCacheForThisStep,\n domSettleTimeoutMs: args[0].domSettleTimeoutMs,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandV2ActHandlerActFromObserveResult() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function act(this: any, ...args: any[]) {\n return await laminarObserve(\n {\n name: 'stagehand.actHandler.actFromObserveResult',\n input: {\n observe: args?.[0] ?? null,\n domSettleTimeoutMs: args?.[1] ?? null,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandV2ActHandlerObserveAct() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function act(this: any, ...args: any[]) {\n const actOptions = args?.[0] as ActOptions | undefined;\n const llmClient = args.filter((arg) =>\n Object.keys(arg).includes('modelName'),\n )[0] as LLMClient | undefined;\n const requestId = typeof args?.[3] === 'string' ? args?.[3] : null;\n return await laminarObserve(\n {\n name: 'stagehand.actHandler.observeAct',\n input: {\n action: actOptions?.action,\n modelName: actOptions?.modelName,\n variables: actOptions?.variables,\n domSettleTimeoutMs: actOptions?.domSettleTimeoutMs,\n timeoutMs: actOptions?.timeoutMs,\n llmClient: cleanStagehandLLMClient(llmClient ?? {}),\n requestId: requestId,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandExtractHandlerTextExtract() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function textExtract(this: any, ...args: any[]) {\n const schema = (args[0].schema as z.AnyZodObject);\n let prettySchema = schema?.shape;\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n return await laminarObserve(\n {\n name: 'stagehand.extractHandler.textExtract',\n input: {\n instruction: args[0].instruction,\n llmClient: cleanStagehandLLMClient(args[0].llmClient ?? {}),\n requestId: args[0].requestId,\n schema: prettySchema,\n content: args[0].content,\n domSettleTimeoutMs: args[0].domSettleTimeoutMs,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandExtractHandlerDomExtract() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function domExtract(this: any, ...args: any[]) {\n const schema = (args[0].schema as z.AnyZodObject);\n let prettySchema = schema?.shape;\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n\n return await laminarObserve(\n {\n name: 'stagehand.extractHandler.domExtract',\n input: {\n instruction: args[0].instruction,\n llmClient: cleanStagehandLLMClient(args[0].llmClient ?? {}),\n requestId: args[0].requestId,\n schema: prettySchema,\n content: args[0].content,\n chunksSeen: args[0].chunksSeen,\n domSettleTimeoutMs: args[0].domSettleTimeoutMs,\n },\n },\n async () => await original.apply(this, args),\n );\n };\n }\n\n private patchStagehandObserveHandler() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function observe(this: any, ...args: any[]) {\n\n return await laminarObserve(\n {\n name: 'stagehand.observeHandler.observe',\n input: {\n instruction: args[0].instruction,\n llmClient: cleanStagehandLLMClient(args[0].llmClient ?? {}),\n requestId: args[0].requestId,\n returnAction: args[0].returnAction,\n onlyVisible: args[0].onlyVisible,\n drawOverlay: args[0].drawOverlay,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandLLMClientCreateChatCompletion() {\n const instrumentation = this;\n return (original: (...args: any[]) => Promise<any>) =>\n async function createChatCompletion(this: any, ...args: any[]) {\n const options = args[0] as StagehandLib.CreateChatCompletionOptions;\n return await laminarObserve({\n name: \"createChatCompletion\",\n // input and output are set as gen_ai.prompt and gen_ai.completion\n ignoreInput: true,\n ignoreOutput: true,\n }, async () => {\n const span = trace.getActiveSpan()!;\n const innerOptions = options.options;\n const recordedProvider = instrumentation.globalLLMClientOptions?.provider;\n const provider = (\n recordedProvider === \"aisdk\"\n && instrumentation.globalLLMClientOptions?.model\n )\n ? (modelToProviderMap[instrumentation.globalLLMClientOptions.model] ?? \"aisdk\")\n : recordedProvider;\n span.setAttributes({\n [SPAN_TYPE]: \"LLM\",\n ...(innerOptions.temperature ? {\n \"gen_ai.request.temperature\": innerOptions.temperature,\n } : {}),\n ...(innerOptions.top_p ? {\n \"gen_ai.request.top_p\": innerOptions.top_p,\n } : {}),\n ...(innerOptions.frequency_penalty ? {\n \"gen_ai.request.frequency_penalty\": innerOptions.frequency_penalty,\n } : {}),\n ...(innerOptions.presence_penalty ? {\n \"gen_ai.request.presence_penalty\": innerOptions.presence_penalty,\n } : {}),\n ...(innerOptions.maxTokens !== undefined ? {\n \"gen_ai.request.max_tokens\": innerOptions.maxTokens,\n } : {}),\n ...(instrumentation.globalLLMClientOptions ? {\n \"gen_ai.request.model\": instrumentation.globalLLMClientOptions.model,\n \"gen_ai.system\": provider,\n } : {}),\n });\n innerOptions.messages?.forEach((message, index) => {\n span.setAttributes({\n [`gen_ai.prompt.${index}.role`]: message.role,\n [`gen_ai.prompt.${index}.content`]: JSON.stringify(message.content),\n });\n });\n innerOptions.tools?.forEach((tool, index) => {\n span.setAttributes({\n [`llm.request.functions.${index}.name`]: tool.name,\n [`llm.request.functions.${index}.description`]: tool.description,\n [`llm.request.functions.${index}.parameters`]: JSON.stringify(tool.parameters),\n });\n });\n\n const result = await original.bind(this).apply(this, args) as StagehandLib.LLMResponse;\n span.setAttributes({\n \"gen_ai.response.model\": result.model,\n \"gen_ai.usage.input_tokens\": result.usage.prompt_tokens,\n \"gen_ai.usage.output_tokens\": result.usage.completion_tokens,\n \"llm.usage.total_tokens\": result.usage.total_tokens,\n });\n\n result.choices?.forEach(choice => {\n const index = choice.index;\n span.setAttributes({\n [`gen_ai.completion.${index}.finish_reason`]: choice.finish_reason,\n [`gen_ai.completion.${index}.role`]: choice.message.role,\n });\n if (choice.message.content) {\n span.setAttribute(\n `gen_ai.completion.${index}.content`,\n JSON.stringify(choice.message.content),\n );\n }\n choice.message.tool_calls?.forEach((toolCall, toolCallIndex) => {\n span.setAttributes({\n [`gen_ai.completion.${index}.message.tool_calls.${toolCallIndex}.id`]: toolCall.id,\n [`gen_ai.completion.${index}.message.tool_calls.${toolCallIndex}.name`]:\n toolCall.function.name,\n [`gen_ai.completion.${index}.message.tool_calls.${toolCallIndex}.arguments`]:\n JSON.stringify(toolCall.function.arguments),\n });\n });\n });\n\n if (!result.choices || result.choices.length === 0) {\n const data = (result as any).data;\n if (data) {\n span.setAttributes({\n \"gen_ai.completion.0.role\": \"assistant\",\n \"gen_ai.completion.0.content\": typeof data === \"string\"\n ? data\n : JSON.stringify(data),\n });\n }\n }\n\n return result;\n });\n };\n }\n\n private patchStagehandAgentInitializer() {\n const instrumentation = this;\n return (original: (...args: any[]) => any) =>\n function agent(this: any, ...args: any[]) {\n if (args.length > 0 && typeof args[0] === 'object') {\n instrumentation.globalAgentOptions = args[0];\n }\n const agent = original.bind(this).apply(this, args);\n instrumentation.patchStagehandAgent(agent);\n return agent;\n };\n }\n\n private patchStagehandAgent(agent: AgentClient) {\n this._wrap(\n agent,\n 'execute',\n this.patchStagehandAgentExecute(),\n );\n }\n\n private patchStagehandAgentExecute() {\n const instrumentation = this;\n return (original: (this: any, ...args: any[]) => Promise<any>) =>\n async function execute(this: any, ...args: any[]) {\n const input = nameArgsOrCopy(args);\n\n return await Laminar.withSpan(instrumentation._parentSpan!, async () =>\n await laminarObserve(\n {\n name: 'stagehand.agent.execute',\n input,\n },\n async () => await laminarObserve(\n {\n name: 'execute',\n // input and output are set as gen_ai.prompt and gen_ai.completion\n ignoreInput: true,\n ignoreOutput: true,\n spanType: \"LLM\",\n },\n async () => {\n const span = trace.getActiveSpan()!;\n const provider = instrumentation.globalAgentOptions?.provider\n ?? instrumentation.globalLLMClientOptions?.provider;\n const model = instrumentation.globalAgentOptions?.model\n ?? instrumentation.globalLLMClientOptions?.model;\n span.setAttributes({\n ...(provider ? { \"gen_ai.system\": provider } : {}),\n ...(model ? { \"gen_ai.request.model\": model } : {}),\n });\n\n let promptIndex = 0;\n if (instrumentation.globalAgentOptions?.instructions) {\n span.setAttributes({\n \"gen_ai.prompt.0.content\": instrumentation.globalAgentOptions.instructions,\n \"gen_ai.prompt.0.role\": \"system\",\n });\n promptIndex++;\n }\n\n const instruction = typeof input === 'string' ? input : (input as any).instruction;\n if (instruction) {\n span.setAttributes({\n [`gen_ai.prompt.${promptIndex}.content`]: instruction,\n [`gen_ai.prompt.${promptIndex}.role`]: \"user\",\n });\n }\n\n const result: StagehandLib.AgentResult = await original\n .bind(this)\n .apply(this, args);\n\n if (result.completed && result.success && result.message) {\n const content = [{ type: \"text\", text: result.message }];\n if (result.actions && result.actions.length > 0) {\n content.push({\n type: \"text\",\n text: JSON.stringify({ actions: result.actions }),\n });\n }\n span.setAttributes({\n \"gen_ai.completion.0.content\": JSON.stringify(content),\n \"gen_ai.completion.0.role\": \"assistant\",\n });\n } else if (result.completed && !result.success) {\n span.recordException(new Error(result.message));\n }\n if (result.usage) {\n span.setAttributes({\n \"gen_ai.usage.input_tokens\": result.usage.input_tokens,\n \"gen_ai.usage.output_tokens\": result.usage.output_tokens,\n \"llm.usage.total_tokens\":\n result.usage.input_tokens + result.usage.output_tokens,\n });\n }\n return result;\n },\n ),\n ),\n );\n };\n }\n}\n/* eslint-enable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return\n*/\n","import { diag, Span, trace } from '@opentelemetry/api';\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\nimport { existsSync } from 'fs';\nimport { readFile } from \"fs/promises\";\nimport path from \"path\";\nimport type * as PuppeteerLib from \"puppeteer\";\nimport type { Browser, BrowserContext, Page } from 'puppeteer';\nimport type * as PuppeteerCoreLib from \"puppeteer-core\";\n\nimport { version as SDK_VERSION } from \"../../package.json\";\nimport { LaminarClient } from '../client';\nimport { observe } from '../decorators';\nimport { Laminar } from '../laminar';\nimport { TRACE_HAS_BROWSER_SESSION } from '../opentelemetry-lib/tracing/attributes';\nimport { getDirname, initializeLogger, newUUID, NIL_UUID, StringUUID } from '../utils';\nimport { collectAndSendPageEvents } from \"./utils\";\n\nconst logger = initializeLogger();\n\nconst RRWEB_SCRIPT_PATH = (() => {\n const fileName = 'rrweb.umd.min.cjs';\n const standardPath = path.join(getDirname(), '..', 'assets', 'rrweb', fileName);\n // Fallback paths for different environments and tests\n const fallbackPaths = [\n path.join(getDirname(), '..', '..', 'assets', 'rrweb', fileName), // For tests\n path.join(process.cwd(), 'assets', 'rrweb', fileName), // Using cwd\n path.join(process.cwd(), '@lmnr-ai/lmnr', 'assets', 'rrweb', fileName), // Absolute path\n ];\n\n try {\n if (existsSync(standardPath)) {\n return standardPath;\n }\n\n for (const fallbackPath of fallbackPaths) {\n if (existsSync(fallbackPath)) {\n return fallbackPath;\n }\n }\n\n // If no path exists, return the standard path and let it fail with a clear error\n return standardPath;\n } catch {\n // In case fs.existsSync fails, return the standard path\n return standardPath;\n }\n})();\n\n/* eslint-disable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return\n*/\nexport class PuppeteerInstrumentation extends InstrumentationBase {\n private _patchedBrowsers: Set<Browser> = new Set();\n private _patchedContexts: Set<BrowserContext> = new Set();\n private _patchedPages: Set<Page> = new Set();\n private _parentSpan: Span | undefined;\n private _client: LaminarClient;\n\n constructor(client: LaminarClient) {\n super(\n \"@lmnr/puppeteer-instrumentation\",\n SDK_VERSION,\n {\n enabled: true,\n },\n );\n this._parentSpan = undefined;\n this._client = client;\n }\n\n // It's the caller's responsibility to ensure the span is ended\n public setParentSpan(span: Span) {\n this._parentSpan = span;\n }\n\n protected init(): InstrumentationModuleDefinition[] {\n const puppeteerInstrumentation = new InstrumentationNodeModuleDefinition(\n \"puppeteer\",\n // About two years before first writing this instrumentation\n // and apparently no big breaking changes afterwards\n // https://github.com/puppeteer/puppeteer/releases\n ['>=19.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n const puppeteerCoreInstrumentation = new InstrumentationNodeModuleDefinition(\n \"puppeteer-core\",\n ['>=19.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return [puppeteerInstrumentation, puppeteerCoreInstrumentation];\n }\n\n public manuallyInstrument(puppeteerModule: typeof PuppeteerLib | typeof PuppeteerCoreLib) {\n this._wrap(\n puppeteerModule,\n 'launch',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n puppeteerModule,\n 'connect',\n this.patchNewBrowser(),\n );\n\n return puppeteerModule;\n }\n\n private patch(\n moduleExports: typeof PuppeteerLib | typeof PuppeteerCoreLib,\n moduleVersion?: string,\n ) {\n diag.debug(`patching puppeteer ${moduleVersion}`);\n this._wrap(\n moduleExports,\n `launch`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports.PuppeteerNode.prototype,\n `launch`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports,\n `connect`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports.Puppeteer.prototype,\n `connect`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports.default,\n `launch`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports.default,\n `connect`,\n this.patchNewBrowser(),\n );\n\n return moduleExports;\n }\n\n private unpatch(moduleExports: typeof PuppeteerLib, moduleVersion?: string) {\n diag.debug(`unpatching puppeteer ${moduleVersion}`);\n this._unwrap(\n moduleExports,\n `launch`,\n );\n\n this._unwrap(\n moduleExports,\n `connect`,\n );\n\n this._unwrap(\n moduleExports.PuppeteerNode.prototype,\n `launch`,\n );\n\n this._unwrap(\n moduleExports.Puppeteer.prototype,\n `connect`,\n );\n\n this._unwrap(\n moduleExports.default,\n `connect`,\n );\n\n this._unwrap(\n moduleExports.default,\n `launch`,\n );\n }\n\n private patchNewBrowser() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: any[]) {\n const browser: Browser = await original.call(this, ...args);\n if (!plugin._parentSpan) {\n plugin._parentSpan = Laminar.startSpan({\n name: 'puppeteer',\n });\n }\n\n for (const context of browser.browserContexts()) {\n plugin._wrap(\n context,\n 'newPage',\n plugin.patchBrowserContextNewPage(),\n );\n await Promise.all((await context.pages()).map(page => plugin.patchPage(page)));\n context.on('targetcreated', (target) => {\n target.page().then(page => {\n if (page) {\n plugin.patchPage(page).catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }\n })\n .catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n plugin._patchedContexts.add(context);\n }\n\n plugin._wrap(\n browser,\n 'createBrowserContext',\n plugin.patchBrowserNewContext(),\n );\n\n plugin._wrap(\n browser,\n 'newPage',\n plugin.patchBrowserNewPage(),\n );\n\n plugin._wrap(\n browser,\n 'close',\n plugin.patchBrowserClose(),\n );\n\n plugin._patchedBrowsers.add(browser);\n return browser;\n };\n }\n\n private patchBrowserClose() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: unknown[]) {\n await original.call(this, ...args);\n if (plugin._parentSpan?.isRecording()) {\n plugin._parentSpan?.end();\n }\n };\n }\n\n private patchBrowserNewContext() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: unknown[]) {\n const context: BrowserContext = await original.bind(this).apply(this, args);\n if (!plugin._parentSpan) {\n plugin._parentSpan = Laminar.startSpan({\n name: 'puppeteer',\n });\n }\n // Patch pages that are created manually from Puppeteer\n plugin._wrap(\n context,\n 'newPage',\n plugin.patchBrowserContextNewPage(),\n );\n plugin._wrap(\n context,\n 'close',\n plugin.patchBrowserContextClose(),\n );\n // Patch pages created by browser, e.g. new tab\n context.on('targetcreated', (target) => {\n target.page().then(page => {\n if (page) {\n plugin.patchPage(page).catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }\n })\n .catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n context.on('targetchanged', (target) => {\n target.page().then(page => {\n if (page) {\n plugin.patchPage(page).catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }\n })\n .catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n\n // Patch pages that are already created\n for (const page of await context.pages()) {\n await plugin.patchPage(page);\n }\n\n plugin._patchedContexts.add(context);\n return context;\n };\n }\n\n private patchBrowserContextClose() {\n const plugin = this;\n return (original: Function) => async function method(this: BrowserContext, ...args: unknown[]) {\n await original.bind(this).apply(this, args);\n if (plugin._parentSpan?.isRecording()) {\n plugin._parentSpan.end();\n }\n };\n }\n\n private patchBrowserNewPage() {\n return (original: Function) => async function method(this: Browser, ...args: unknown[]) {\n const page = await original.bind(this).apply(this, args);\n if (!page) {\n return null;\n }\n // TODO: investigate why this creates a separate empty span and no events\n // await plugin.patchPage(page);\n return page;\n };\n }\n\n public patchBrowserContextNewPage() {\n const plugin = this;\n return (original: Function) => async function method(this: BrowserContext, ...args: unknown[]) {\n const page = await original.bind(this).apply(this, args);\n if (!plugin._parentSpan) {\n plugin._parentSpan = Laminar.startSpan({\n name: 'puppeteer',\n });\n }\n if (!page) {\n return null;\n }\n\n await plugin.patchPage(page);\n\n return page;\n };\n }\n\n public async patchPage(page: Page) {\n return await Laminar.withSpan(this._parentSpan!, async () => {\n await observe({ name: 'puppeteer.page' }, async () => {\n await this._patchPage(page);\n });\n });\n }\n\n private async _patchPage(page: Page) {\n page.on(\"domcontentloaded\", () => {\n this.injectRrweb(page).catch(error => {\n logger.error(\"Failed to inject rrweb: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n\n const originalBringToFront = page.bringToFront.bind(page);\n page.bringToFront = async () => {\n await originalBringToFront();\n await page.evaluate(() => {\n if ((window as any).lmnrRrweb) {\n try {\n (window as any).lmnrRrweb.record.takeFullSnapshot();\n } catch (error) {\n console.error(\"Failed to take full snapshot: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n });\n };\n await this.injectRrweb(page);\n this._patchedPages.add(page);\n\n trace.getActiveSpan()?.setAttribute(TRACE_HAS_BROWSER_SESSION, true);\n\n const traceId = trace.getActiveSpan()?.spanContext().traceId as StringUUID ?? NIL_UUID;\n const sessionId = newUUID();\n const interval = setInterval(() => {\n if (page.isClosed()) {\n clearInterval(interval);\n return;\n }\n collectAndSendPageEvents(this._client, page, sessionId, traceId)\n .catch(error => {\n logger.error(\"Event collection stopped: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }, 2000);\n\n page.on('close', () => {\n clearInterval(interval);\n collectAndSendPageEvents(this._client, page, sessionId, traceId).catch(error => {\n logger.error(\"Event collection stopped: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n }\n\n private async injectRrweb(page: Page) {\n // Wait for the page to be in a ready state first\n const tryRunScript = async (\n script: (...args: any[]) => Promise<any>,\n maxAttempts: number = 5,\n ) => {\n for (let i = 0; i < maxAttempts; i++) {\n try {\n return await script();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes(\"Execution context was destroyed\")) {\n logger.info(errorMessage);\n } else {\n logger.error(\"Operation \" + script.name + \" failed: \" + errorMessage);\n }\n }\n await new Promise(resolve => setTimeout(resolve, 500));\n }\n };\n\n const isRrwebPresent = await page.evaluate(() =>\n typeof (window as any).lmnrRrweb !== 'undefined',\n );\n\n // Load rrweb and set up recording\n if (!isRrwebPresent) {\n const script = await readFile(RRWEB_SCRIPT_PATH, 'utf8');\n await tryRunScript(async function injectRrweb() {\n await page.evaluate(script);\n const res = await (page).waitForFunction(\n () => 'lmnrRrweb' in window || (window as any).lmnrRrweb,\n {\n timeout: 5000,\n },\n );\n if (!res) {\n throw new Error('Failed to inject rrweb');\n }\n });\n }\n\n // Update the recording setup to include trace ID\n await tryRunScript(async function setupRrwebCollection() {\n await page.evaluate(() => {\n const HEARTBEAT_INTERVAL = 1000; // 1 second heartbeat\n\n (window as any).lmnrRrwebEventsBatch = new Set();\n\n (window as any).lmnrPageIsFocused = true;\n window.addEventListener('blur', () => {\n (window as any).lmnrPageIsFocused = false;\n });\n window.addEventListener('focus', () => {\n (window as any).lmnrPageIsFocused = true;\n });\n\n const compressEventData = async (data: any) => {\n const jsonString = JSON.stringify(data);\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 return Array.from(new Uint8Array(compressedData));\n };\n\n (window as any).lmnrGetAndClearEvents = () => {\n const events = (window as any).lmnrRrwebEventsBatch;\n (window as any).lmnrRrwebEventsBatch = new Set();\n return Array.from(events);\n };\n\n setInterval(() => {\n if (!(window as any).lmnrPageIsFocused) {\n return;\n }\n (window as any).lmnrRrweb.record.addCustomEvent('heartbeat', {\n title: document.title,\n url: document.URL,\n });\n }, HEARTBEAT_INTERVAL);\n\n (window as any).lmnrRrweb.record({\n async emit(event: any) {\n // Ignore events from all tabs except the current one\n if (!(window as any).lmnrPageIsFocused) {\n return;\n }\n const compressedEvent = {\n ...event,\n data: await compressEventData(event.data),\n };\n (window as any).lmnrRrwebEventsBatch.add(compressedEvent);\n },\n });\n });\n });\n };\n}\n/* eslint-enable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return\n*/\n","import { Context, context } from \"@opentelemetry/api\";\nimport {\n BatchSpanProcessor,\n ReadableSpan,\n SimpleSpanProcessor,\n Span,\n SpanExporter,\n SpanProcessor,\n} from \"@opentelemetry/sdk-trace-base\";\nimport {\n ReadableSpan as OTelV2ReadableSpan,\n Span as OTelV2Span,\n} from \"@opentelemetry/sdk-trace-base-v2\";\n\nimport { version as SDK_VERSION } from \"../../../package.json\";\nimport { otelSpanIdToUUID } from \"../../utils\";\nimport { getLangVersion } from \"../../version\";\nimport {\n ASSOCIATION_PROPERTIES,\n ASSOCIATION_PROPERTIES_OVERRIDES,\n SPAN_IDS_PATH,\n SPAN_INSTRUMENTATION_SOURCE,\n SPAN_LANGUAGE_VERSION,\n SPAN_PATH,\n SPAN_SDK_VERSION,\n} from \"./attributes\";\nimport {\n getParentSpanId,\n makeSpanOtelV2Compatible,\n} from \"./compat\";\nimport { LaminarSpanExporter } from \"./exporter\";\nimport {\n ASSOCIATION_PROPERTIES_KEY,\n getSpanPath,\n SPAN_PATH_KEY,\n} from \"./utils\";\n\ninterface LaminarSpanProcessorOptions {\n /**\n * The base URL of the Laminar API. Optional.\n * Defaults to https://api.lmnr.ai.\n */\n baseUrl?: string;\n /**\n * The port of the Laminar API. Optional.\n * Defaults to 8443.\n */\n port?: number;\n /**\n * Laminar project API key. Optional.\n * If not provided, the LMNR_PROJECT_API_KEY environment variable will be used.\n */\n apiKey?: string;\n /**\n * The maximum number of spans to export at a time. Optional.\n * Defaults to 512.\n */\n maxExportBatchSize?: number;\n /**\n * Whether to disable batching. Optional.\n * Defaults to false.\n */\n disableBatch?: boolean;\n /**\n * Whether to force HTTP and use OpenTelemetry HTTP/protobuf exporter.\n * Not recommended with Laminar backends.\n * Optional.\n * Defaults to false.\n */\n forceHttp?: boolean;\n /**\n * The timeout for sending traces data. Optional.\n * Defaults to 30 seconds.\n */\n traceExportTimeoutMillis?: number;\n\n /**\n * The exporter to use. Optional. If specified, some of the other options will be ignored.\n * Defaults to a new LaminarSpanExporter.\n */\n exporter?: SpanExporter;\n}\n\nexport class LaminarSpanProcessor implements SpanProcessor {\n private instance: BatchSpanProcessor | SimpleSpanProcessor;\n private readonly _spanIdToPath: Map<string, string[]> = new Map();\n private readonly _spanIdLists: Map<string, string[]> = new Map();\n\n /**\n * @param {object} options - The options for the Laminar span processor.\n * @param {string} options.baseUrl - The base URL of the Laminar API.\n * @param {number} options.port - The port of the Laminar API.\n * @param {string} options.apiKey - Laminar project API key or any other\n * authorization set as bearer token.\n * @param {boolean} options.disableBatch - Whether to disable batching (uses SimpleSpanProcessor).\n * @param {number} options.maxExportBatchSize - The maximum number of spans to export at a time\n * if disableBatch is false.\n * @param {number} options.traceExportTimeoutMillis - The timeout for sending traces data.\n * Defaults to 30 seconds.\n * @param {boolean} options.forceHttp - Whether to force HTTP and use OpenTelemetry\n * HTTP/protobuf exporter.\n * Not recommended with Laminar backends.\n */\n constructor(options: LaminarSpanProcessorOptions = {}) {\n const exporter = options.exporter ?? new LaminarSpanExporter(options);\n this.instance = options.disableBatch\n ? new SimpleSpanProcessor(exporter)\n : new BatchSpanProcessor(exporter, {\n maxExportBatchSize: options.maxExportBatchSize ?? 512,\n exportTimeoutMillis: options.traceExportTimeoutMillis ?? 30000,\n });\n }\n\n forceFlush(): Promise<void> {\n return this.instance.forceFlush();\n }\n\n shutdown(): Promise<void> {\n return this.instance.shutdown();\n }\n\n onStart(span: Span | OTelV2Span, parentContext: Context): void {\n const contextSpanPath = getSpanPath(parentContext ?? context.active());\n const parentSpanId = getParentSpanId(span);\n const parentSpanPath = contextSpanPath\n ?? (parentSpanId !== undefined\n ? this._spanIdToPath.get(parentSpanId)\n : undefined);\n const spanId = span.spanContext().spanId;\n const parentSpanIdsPath = parentSpanId\n ? this._spanIdLists.get(parentSpanId)\n : [];\n const spanPath = parentSpanPath ? [...parentSpanPath, span.name] : [span.name];\n\n const spanIdUuid = otelSpanIdToUUID(spanId);\n const spanIdsPath = parentSpanIdsPath ? [...parentSpanIdsPath, spanIdUuid] : [spanIdUuid];\n\n span.setAttribute(SPAN_IDS_PATH, spanIdsPath);\n this._spanIdLists.set(spanId, spanIdsPath);\n\n span.setAttribute(SPAN_PATH, spanPath);\n context.active().setValue(SPAN_PATH_KEY, spanPath);\n this._spanIdToPath.set(spanId, spanPath);\n\n span.setAttribute(SPAN_INSTRUMENTATION_SOURCE, \"javascript\");\n span.setAttribute(SPAN_SDK_VERSION, SDK_VERSION);\n const langVersion = getLangVersion();\n if (langVersion) {\n span.setAttribute(SPAN_LANGUAGE_VERSION, langVersion);\n }\n\n // This sets the properties only if the context has them\n const associationProperties = context\n .active()\n .getValue(ASSOCIATION_PROPERTIES_KEY);\n if (associationProperties) {\n for (const [key, value] of Object.entries(associationProperties)) {\n if (Object.keys(ASSOCIATION_PROPERTIES_OVERRIDES).includes(key)) {\n span.setAttribute(ASSOCIATION_PROPERTIES_OVERRIDES[key], value);\n } else if (key === \"tracing_level\") {\n span.setAttribute(\"lmnr.internal.tracing_level\", value);\n } else {\n span.setAttribute(`${ASSOCIATION_PROPERTIES}.${key}`, value);\n }\n }\n }\n\n makeSpanOtelV2Compatible(span);\n this.instance.onStart((span as Span), parentContext);\n }\n\n onEnd(span: ReadableSpan | OTelV2ReadableSpan): void {\n // By default, we call the original onEnd.\n makeSpanOtelV2Compatible(span);\n this.instance.onEnd(span as Span);\n }\n}\n","// This class could be just an initialization of the OTLP exporter,\n// but OTel v2 has some breaking changes, so we're applying\n// a small backward-compatibility fix here.\n\nimport { Metadata } from \"@grpc/grpc-js\";\nimport { ExportResult } from \"@opentelemetry/core\";\nimport {\n OTLPTraceExporter as ExporterGrpc,\n} from \"@opentelemetry/exporter-trace-otlp-grpc\";\nimport {\n OTLPTraceExporter as ExporterHttp,\n} from \"@opentelemetry/exporter-trace-otlp-proto\";\nimport { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\n\nimport { makeSpanOtelV2Compatible } from \"./compat\";\n\nexport class LaminarSpanExporter implements SpanExporter {\n private exporter: SpanExporter;\n\n constructor(options: {\n baseUrl?: string;\n port?: number;\n apiKey?: string;\n forceHttp?: boolean;\n timeoutMillis?: number;\n } = {}) {\n const url = options.baseUrl ?? process?.env?.LMNR_BASE_URL ?? 'https://api.lmnr.ai';\n const port = options.port ?? (\n url.match(/:\\d{1,5}$/g)\n ? parseInt(url.match(/:\\d{1,5}$/g)![0].slice(1))\n : (options.forceHttp ? 443 : 8443));\n const urlWithoutSlash = url.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n\n const key = options.apiKey ?? process?.env?.LMNR_PROJECT_API_KEY;\n if (key === undefined) {\n throw new Error(\n 'Please initialize the Laminar object with your project API key ' +\n 'or set the LMNR_PROJECT_API_KEY environment variable',\n );\n }\n\n if (options.forceHttp) {\n this.exporter = new ExporterHttp({\n url: `${urlWithoutSlash}:${port}/v1/traces`,\n headers: {\n 'Authorization': `Bearer ${key}`,\n },\n timeoutMillis: options.timeoutMillis ?? 30000,\n });\n } else {\n const metadata = new Metadata();\n metadata.set('authorization', `Bearer ${key}`);\n this.exporter = new ExporterGrpc({\n url: `${urlWithoutSlash}:${port}`,\n metadata,\n timeoutMillis: options.timeoutMillis ?? 30000,\n });\n }\n }\n\n export(\n items: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ) {\n // ==== //\n // OTel v2 has renamed the instrumentationLibrary field to instrumentationScope,\n // but spans may be created by older versions of the SDK that don't have that change.\n // This is a small hack to support those older spans.\n items.forEach(makeSpanOtelV2Compatible);\n // ==== //\n\n return this.exporter.export(items, resultCallback);\n }\n\n async shutdown(): Promise<void> {\n return this.exporter.shutdown();\n }\n\n async forceFlush(): Promise<void> {\n return this.exporter.forceFlush?.();\n }\n}\n\n","import { context, Span, trace } from \"@opentelemetry/api\";\nimport { suppressTracing } from \"@opentelemetry/core\";\n\nimport { LaminarSpanContext } from \"../../types\";\nimport { initializeLogger, isOtelAttributeValueType, tryToOtelSpanContext } from \"../../utils\";\nimport { getTracer, shouldSendTraces } from \".\";\nimport { SPAN_INPUT, SPAN_OUTPUT } from \"./attributes\";\nimport {\n ASSOCIATION_PROPERTIES_KEY,\n} from \"./utils\";\n\nconst logger = initializeLogger();\n\nexport type DecoratorConfig = {\n name: string;\n associationProperties?: { [name: string]: string };\n input?: unknown;\n ignoreInput?: boolean;\n ignoreOutput?: boolean;\n inputParameters?: unknown[];\n suppressTracing?: boolean;\n parentSpanContext?: string | LaminarSpanContext;\n};\n\nexport function observeBase<\n A extends unknown[],\n F extends (...args: A) => ReturnType<F>,\n>(\n {\n name,\n associationProperties,\n input,\n ignoreInput,\n ignoreOutput,\n inputParameters,\n suppressTracing: shouldSuppressTracing,\n parentSpanContext,\n }: DecoratorConfig,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n) {\n let entityContext = context.active();\n\n const currentAssociationProperties = entityContext.getValue(ASSOCIATION_PROPERTIES_KEY);\n\n // TODO: Remove this once we've removed older deprecated methods, such as\n // withMetadata, withSession.\n if (associationProperties) {\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n { ...(currentAssociationProperties ?? {}), ...associationProperties },\n );\n }\n // ================================\n\n if (parentSpanContext) {\n const spanContext = tryToOtelSpanContext(parentSpanContext);\n entityContext = trace.setSpan(entityContext, trace.wrapSpanContext(spanContext));\n }\n\n if (shouldSuppressTracing) {\n entityContext = suppressTracing(entityContext);\n }\n\n return context.with(entityContext, () =>\n getTracer().startActiveSpan(\n name,\n {},\n entityContext,\n async (span: Span) => {\n if (shouldSendTraces() && !ignoreInput) {\n try {\n const spanInput = inputParameters ?? args;\n if (input !== undefined) {\n span.setAttribute(\n SPAN_INPUT,\n serialize(input),\n );\n } else if (\n spanInput.length === 1 &&\n typeof spanInput[0] === \"object\" &&\n !(spanInput[0] instanceof Map)\n ) {\n span.setAttribute(\n SPAN_INPUT,\n serialize(spanInput[0]),\n );\n } else {\n // pass an array of the arguments without names\n // Need to convert it to hashmap from argument name to value,\n // if we figure out how to do it elegantly\n span.setAttribute(\n SPAN_INPUT,\n serialize(spanInput.length > 0 ? spanInput : {}),\n );\n }\n } catch (error) {\n logger.warn(\"Failed to serialize input: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // Remove span type from association properties after the span is created\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { \"span_type\": spanType, ...rest } = associationProperties ?? {};\n // TODO: Remove this once we've removed older deprecated methods, such as\n // withMetadata, withSession.\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n { ...(currentAssociationProperties ?? {}), ...rest },\n );\n // ================================\n Object.entries(rest).forEach(([key, value]) => {\n if (isOtelAttributeValueType(value)) {\n span.setAttribute(key, value);\n } else {\n span.setAttribute(key, JSON.stringify(value));\n }\n });\n\n let res: unknown;\n try {\n res = fn.apply(thisArg, args);\n } catch (error) {\n span.recordException(error as Error);\n span.end();\n throw error;\n }\n\n if (res instanceof Promise) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return res.then((resolvedRes) => {\n try {\n if (shouldSendTraces() && !ignoreOutput) {\n span.setAttribute(\n SPAN_OUTPUT,\n serialize(resolvedRes),\n );\n }\n } catch (error) {\n logger.warn(\"Failed to serialize async output: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n } finally {\n span.end();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return resolvedRes;\n })\n .catch((error) => {\n span.recordException(error as Error);\n span.end();\n throw error;\n });\n }\n try {\n if (shouldSendTraces() && !ignoreOutput) {\n span.setAttribute(\n SPAN_OUTPUT,\n serialize(res),\n );\n }\n } catch (error) {\n logger.warn(\"Failed to serialize output: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n } finally {\n span.end();\n }\n\n return res;\n },\n ),\n );\n}\n\nconst normalizePayload = (payload: unknown, seen: WeakSet<any>): unknown => {\n if (payload instanceof Map) {\n return Array.from(payload.entries());\n } else if (Array.isArray(payload)) {\n return payload.map((value) => normalizePayload(value, seen));\n } else if (!payload) {\n return payload;\n } else if (typeof payload === \"object\") {\n if (seen.has(payload)) {\n return \"[Circular reference]\";\n }\n seen.add(payload);\n\n // serialize object one by one\n const output: any = {};\n Object.entries(payload as any).forEach(([key, value]) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n output[key] = normalizePayload(value, seen);\n });\n return output;\n }\n\n return payload;\n};\n\nconst serialize = (payload: unknown): string =>\n JSON.stringify(normalizePayload(payload, new WeakSet()));\n","import { trace } from \"@opentelemetry/api\";\nimport cliProgress from \"cli-progress\";\n\nimport { LaminarClient } from \"./client\";\nimport { EvaluationDataset, LaminarDataset } from \"./datasets\";\nimport { observe } from \"./decorators\";\nimport { Laminar } from \"./laminar\";\nimport { InitializeOptions } from \"./opentelemetry-lib/interfaces\";\nimport { SPAN_TYPE } from \"./opentelemetry-lib/tracing/attributes\";\nimport {EvaluationDatapoint} from \"./types\";\nimport {\n initializeLogger,\n newUUID,\n otelSpanIdToUUID,\n otelTraceIdToUUID,\n Semaphore,\n StringUUID,\n} from \"./utils\";\n\nconst DEFAULT_CONCURRENCY = 5;\nconst MAX_EXPORT_BATCH_SIZE = 64;\n\ndeclare global {\n // eslint-disable-next-line no-var\n var _evaluations: Evaluation<any, any, any>[] | undefined;\n // If true, then we need to set the evaluation globally without running it\n // eslint-disable-next-line no-var\n var _set_global_evaluation: boolean;\n}\n\nconst logger = initializeLogger();\n\nconst getEvaluationUrl = (projectId: string, evaluationId: string, baseUrl?: string): string => {\n let url = baseUrl ?? \"https://api.lmnr.ai\";\n if (url === \"https://api.lmnr.ai\") {\n url = \"https://www.lmnr.ai\";\n }\n url = url.replace(/\\/$/, '');\n\n if (/localhost|127\\.0\\.0\\.1/.test(url)) {\n const port = url.match(/:\\d{1,5}$/g)?.[0]?.slice(1);\n if (!port) {\n // As a best effort, we assume that the frontend is running on port 5667\n url = url + \":5667\";\n }\n }\n return `${url}/project/${projectId}/evaluations/${evaluationId}`;\n};\n\nconst getAverageScores =\n <D, T, O>(results: EvaluationDatapoint<D, T, O>[]): Record<string, number> => {\n const perScoreValues: Record<string, number[]> = {};\n for (const result of results) {\n for (const key in result.scores) {\n const score = result.scores[key];\n if (perScoreValues[key] && score !== null) {\n perScoreValues[key].push(score);\n } else {\n perScoreValues[key] = score !== null ? [score] : [];\n }\n }\n }\n\n const averageScores: Record<string, number> = {};\n for (const key in perScoreValues) {\n averageScores[key] = perScoreValues[key].reduce((a, b) => a + b, 0)\n / perScoreValues[key].length;\n }\n\n return averageScores;\n };\n\n/**\n * Configuration for the Evaluator\n */\ninterface EvaluatorConfig {\n /**\n * The number of data points to evaluate in parallel at a time. Defaults to 5.\n */\n concurrencyLimit?: number;\n /**\n * The project API key to use for the evaluation. If not provided,\n * the API key from the environment variable `LMNR_PROJECT_API_KEY` will be used.\n */\n projectApiKey?: string;\n /**\n * The base URL of the Laminar API. If not provided, the default is\n * `https://api.lmnr.ai`. Useful with self-hosted Laminar instances.\n * Do NOT include the port in the URL, use `httpPort` and `grpcPort` instead.\n */\n baseUrl?: string;\n /**\n * The HTTP port of the Laminar API. If not provided, the default is 443.\n */\n httpPort?: number;\n /**\n * The gRPC port of the Laminar API. If not provided, the default is 8443.\n */\n grpcPort?: number;\n /**\n * Object with modules to instrument. If not provided, all\n * available modules are instrumented.\n * See {@link https://docs.lmnr.ai/tracing/automatic-instrumentation}\n */\n instrumentModules?: InitializeOptions['instrumentModules'];\n /**\n * If true, then the spans will not be batched.\n */\n traceDisableBatch?: boolean;\n /**\n * Timeout for trace export. Defaults to 30_000 (30 seconds), which is over\n * the default OTLP exporter timeout of 10_000 (10 seconds).\n */\n traceExportTimeoutMillis?: number;\n /**\n * Defines default log level for SDK and all instrumentations.\n */\n logLevel?: \"debug\" | \"info\" | \"warn\" | \"error\";\n\n /**\n * Maximum number of spans to export at a time. Defaults to 64.\n */\n traceExportBatchSize?: number;\n}\n\n/**\n * Datapoint is a single data point in the evaluation. `D` is the type of the input data,\n * `T` is the type of the target data.\n */\nexport type Datapoint<D, T> = {\n /**\n * input to the executor function. Must be json serializable. Required.\n */\n data: D;\n /**\n * input to the evaluator function (alongside the executor output).\n * Must be json serializable.\n */\n target?: T;\n /**\n * metadata to the evaluator function. Must be json serializable.\n */\n metadata?: Record<string, any>;\n};\n\n/**\n * HumanEvaluator is a class to register a human evaluator.\n */\nexport class HumanEvaluator {}\n\nexport type EvaluatorFunctionReturn = number | Record<string, number>;\n\n/**\n * EvaluatorFunction is a function that takes the output of the executor and the\n * target data, and returns a score. The score can be a single number or a record\n * of string keys and number values. The latter is useful for evaluating\n * multiple criteria in one go instead of running multiple evaluators.\n */\nexport type EvaluatorFunction<O, T> = (output: O, target?: T, ...args: any[]) =>\n EvaluatorFunctionReturn | Promise<EvaluatorFunctionReturn>;\n\ninterface EvaluationConstructorProps<D, T, O> {\n /**\n * List of data points to evaluate. `data` is the input to the executor function,\n * `target` is the input to the evaluator function.\n */\n data: (Datapoint<D, T>[]) | EvaluationDataset<D, T>;\n /**\n * The executor function. Takes the data point + any additional arguments\n * and returns the output to evaluate.\n */\n executor: (data: D, ...args: any[]) => O | Promise<O>;\n /**\n * Evaluator functions and names. Each evaluator function takes the output of\n * the executor _and_ the target data, and returns a score. The score can be a\n * single number or a dict of string keys and number values. If the score is a\n * single number, it will be named after the evaluator function. Evaluator\n * function names must contain only letters, digits, hyphens, underscores,\n * or spaces.\n */\n evaluators: Record<string, EvaluatorFunction<O, T> | HumanEvaluator>;\n /**\n * Name of the evaluation. If not provided, a random name will be assigned.\n */\n name?: string;\n /**\n * Optional group id of the evaluation. Only evaluations within the same\n * group_id can be visually compared. Defaults to \"default\".\n */\n groupName?: string;\n /**\n * Optional metadata to evaluation\n */\n metadata?: Record<string, any>;\n /**\n * Optional override configurations for the evaluator.\n */\n config?: EvaluatorConfig;\n}\n\n/**\n * Reports the whole progress to the console.\n */\nclass EvaluationReporter {\n private cliProgress: cliProgress.SingleBar = new cliProgress.SingleBar(\n {},\n cliProgress.Presets.shades_classic,\n );\n private progressCounter: number = 0;\n private baseUrl: string;\n\n constructor(\n baseUrl?: string,\n ) {\n this.baseUrl = baseUrl ?? 'https://api.lmnr.ai';\n }\n\n public start({ length }: { length: number }) {\n this.cliProgress.start(length, 0);\n }\n\n public update(batchLength: number) {\n this.progressCounter += batchLength;\n this.cliProgress.update(this.progressCounter);\n }\n\n // Call either error or stop, not both\n public stopWithError(error: Error) {\n this.cliProgress.stop();\n process.stdout.write(`\\nError: ${error.message}\\n`);\n }\n\n // Call either error or stop, not both\n public stop({\n averageScores,\n projectId,\n evaluationId,\n }: { averageScores: Record<string, number>, projectId: string, evaluationId: string }) {\n this.cliProgress.stop();\n const url = getEvaluationUrl(projectId, evaluationId, this.baseUrl);\n process.stdout.write(`\\nCheck results at ${url}\\n`);\n process.stdout.write('\\nAverage scores:\\n');\n for (const key in averageScores) {\n process.stdout.write(`${key}: ${JSON.stringify(averageScores[key])}\\n`);\n }\n process.stdout.write('\\n');\n }\n}\n\nexport class Evaluation<D, T, O> {\n private isFinished: boolean = false;\n private progressReporter: EvaluationReporter;\n private data: Datapoint<D, T>[] | EvaluationDataset<D, T>;\n private executor: (data: D, ...args: any[]) => O | Promise<O>;\n private evaluators: Record<string, EvaluatorFunction<O, T> | HumanEvaluator>;\n private groupName?: string;\n private name?: string;\n private metadata?: Record<string, any>;\n private concurrencyLimit: number = DEFAULT_CONCURRENCY;\n private traceDisableBatch: boolean = false;\n private traceExportTimeoutMillis?: number;\n private traceExportBatchSize: number = MAX_EXPORT_BATCH_SIZE;\n private uploadPromises: Promise<any>[] = [];\n private client: LaminarClient;\n\n constructor({\n data, executor, evaluators, groupName, name, metadata, config,\n }: EvaluationConstructorProps<D, T, O>) {\n if (Object.keys(evaluators).length === 0) {\n throw new Error('No evaluators provided');\n }\n\n const evaluatorNameRegex = /^[\\w\\s-]+$/;\n // Validate evaluator keys\n for (const key in evaluators) {\n if (!evaluatorNameRegex.test(key)) {\n throw new Error(\n `Invalid evaluator key: \"${key}\".` +\n \"Keys must only contain letters, digits, hyphens, underscores, or spaces.\",\n );\n }\n }\n\n this.progressReporter = new EvaluationReporter(config?.baseUrl);\n this.data = data;\n this.executor = executor;\n this.evaluators = evaluators;\n this.groupName = groupName;\n this.metadata = metadata;\n this.name = name;\n\n if (Laminar.initialized()) {\n this.client = new LaminarClient({\n baseUrl: Laminar.getHttpUrl(),\n projectApiKey: Laminar.getProjectApiKey(),\n });\n if (config?.projectApiKey && config.projectApiKey !== Laminar.getProjectApiKey()) {\n logger.warn('Laminar was already initialized with a different project API key. ' +\n 'Ignoring the project API key from the evaluation config.');\n }\n return;\n }\n\n const key = config?.projectApiKey ?? process.env.LMNR_PROJECT_API_KEY;\n if (key === undefined) {\n throw new Error(\n 'Please initialize the Laminar object with your project API key ' +\n 'or set the LMNR_PROJECT_API_KEY environment variable',\n );\n }\n\n const url = config?.baseUrl ?? process?.env?.LMNR_BASE_URL ?? 'https://api.lmnr.ai';\n const httpPort = config?.httpPort ?? (\n url.match(/:\\d{1,5}$/g)\n ? parseInt(url.match(/:\\d{1,5}$/g)![0].slice(1))\n : 443);\n const urlWithoutSlash = url.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n const baseHttpUrl = `${urlWithoutSlash}:${httpPort}`;\n\n this.client = new LaminarClient({\n baseUrl: baseHttpUrl,\n projectApiKey: key,\n });\n\n if (config) {\n if (config.concurrencyLimit && config.concurrencyLimit < 1) {\n logger.warn(\n `concurrencyLimit must be greater than 0. Setting to default of ${DEFAULT_CONCURRENCY}`,\n );\n this.concurrencyLimit = DEFAULT_CONCURRENCY;\n } else {\n this.concurrencyLimit = config.concurrencyLimit ?? DEFAULT_CONCURRENCY;\n }\n this.traceDisableBatch = config.traceDisableBatch ?? false;\n this.traceExportTimeoutMillis = config.traceExportTimeoutMillis;\n this.traceExportBatchSize = config.traceExportBatchSize ?? MAX_EXPORT_BATCH_SIZE;\n }\n\n Laminar.initialize({\n projectApiKey: config?.projectApiKey,\n baseUrl: config?.baseUrl,\n httpPort: config?.httpPort,\n grpcPort: config?.grpcPort,\n instrumentModules: config?.instrumentModules,\n disableBatch: this.traceDisableBatch,\n traceExportTimeoutMillis: this.traceExportTimeoutMillis,\n maxExportBatchSize: this.traceExportBatchSize,\n });\n }\n\n public async run(): Promise<Record<string, number>> {\n if (this.isFinished) {\n throw new Error('Evaluation is already finished');\n }\n if (this.data instanceof LaminarDataset) {\n this.data.setClient(this.client);\n }\n\n this.progressReporter.start({ length: await this.getLength() });\n let resultDatapoints: EvaluationDatapoint<D, T, O>[];\n try {\n const evaluation = await this.client.evals.init(this.name, this.groupName, this.metadata);\n resultDatapoints = await this.evaluateInBatches(evaluation.id);\n const averageScores = getAverageScores(resultDatapoints);\n if (this.uploadPromises.length > 0) {\n await Promise.all(this.uploadPromises);\n }\n this.progressReporter.stop({\n averageScores,\n projectId: evaluation.projectId,\n evaluationId: evaluation.id,\n });\n this.isFinished = true;\n\n await Laminar.shutdown();\n return averageScores;\n } catch (e) {\n this.progressReporter.stopWithError(e as Error);\n this.isFinished = true;\n return {};\n }\n }\n\n public async evaluateInBatches(\n evalId: StringUUID,\n ): Promise<EvaluationDatapoint<D, T, O>[]> {\n const semaphore = new Semaphore(this.concurrencyLimit);\n const tasks: Promise<any>[] = [];\n\n const evaluateTask = async (datapoint: Datapoint<D, T>, index: number):\n Promise<[number, EvaluationDatapoint<D, T, O>]> => {\n try {\n const result = await this.evaluateDatapoint(evalId, datapoint, index);\n this.progressReporter.update(1);\n return [index, result];\n } finally {\n semaphore.release();\n }\n };\n\n for (let i = 0; i < await this.getLength(); i++) {\n await semaphore.acquire();\n const datapoint = Array.isArray(this.data) ? this.data[i] : await this.data.get(i);\n tasks.push(evaluateTask(datapoint, i));\n }\n const results = await Promise.all(tasks);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return results.sort((a, b) => a[0] - b[0]).map(([, result]) => result);\n }\n\n private async evaluateDatapoint(\n evalId: StringUUID,\n datapoint: Datapoint<D, T>,\n index: number,\n ): Promise<EvaluationDatapoint<D, T, O>> {\n return observe({ name: \"evaluation\", traceType: \"EVALUATION\" }, async () => {\n\n trace.getActiveSpan()!.setAttribute(SPAN_TYPE, \"EVALUATION\");\n const executorSpan = Laminar.startSpan({\n name: \"executor\",\n input: datapoint.data,\n });\n executorSpan.setAttribute(SPAN_TYPE, \"EXECUTOR\");\n const executorSpanId = otelSpanIdToUUID(executorSpan.spanContext().spanId);\n const datapointId = newUUID();\n const partialDatapoint = {\n id: datapointId,\n data: datapoint.data,\n target: datapoint.target,\n metadata: datapoint.metadata,\n traceId: otelTraceIdToUUID(trace.getActiveSpan()!.spanContext().traceId),\n executorSpanId,\n index,\n } as EvaluationDatapoint<D, T, O>;\n\n // first create the datapoint in the database and await\n await this.client.evals.saveDatapoints({\n evalId,\n datapoints: [partialDatapoint],\n groupName: this.groupName,\n });\n\n const output = await Laminar.withSpan(\n executorSpan,\n async () => await this.executor(datapoint.data),\n true,\n );\n const target = datapoint.target;\n\n let scores: Record<string, number | null> = {};\n for (const [evaluatorName, evaluator] of Object.entries(this.evaluators)) {\n const value = await observe(\n { name: evaluatorName },\n async (output: O, target?: T) => {\n if (evaluator instanceof HumanEvaluator) {\n trace.getActiveSpan()!.setAttribute(SPAN_TYPE, \"HUMAN_EVALUATOR\");\n return null;\n } else {\n trace.getActiveSpan()!.setAttribute(SPAN_TYPE, \"EVALUATOR\");\n return await evaluator(output, target);\n }\n },\n output,\n target,\n );\n\n if (evaluator instanceof HumanEvaluator) {\n scores[evaluatorName] = null;\n continue;\n }\n\n if (typeof value === 'number') {\n if (isNaN(value)) {\n throw new Error(`Evaluator ${evaluatorName} returned NaN`);\n }\n scores[evaluatorName] = value;\n } else if (value !== null) {\n scores = { ...scores, ...value };\n }\n }\n\n const resultDatapoint = {\n id: datapointId,\n executorOutput: output,\n data: datapoint.data,\n target,\n metadata: datapoint.metadata,\n scores,\n traceId: otelTraceIdToUUID(trace.getActiveSpan()!.spanContext().traceId),\n executorSpanId,\n index,\n } as EvaluationDatapoint<D, T, O>;\n\n const uploadPromise = this.client.evals.saveDatapoints({\n evalId,\n datapoints: [resultDatapoint],\n groupName: this.groupName,\n });\n this.uploadPromises.push(uploadPromise);\n\n return resultDatapoint;\n });\n }\n\n private async getLength(): Promise<number> {\n return this.data instanceof EvaluationDataset ? await this.data.size() : this.data.length;\n }\n}\n\n/**\n * If added to the file which is called through lmnr eval command, then simply\n * registers the evaluation. Otherwise, returns a promise which resolves when\n * the evaluation is finished. If the evaluation has no async logic, then it\n * will be executed synchronously.\n *\n * @param props.data List of data points to evaluate. `data` is the input to the\n * executor function, `target` is the input to the evaluator function.\n * @param props.executor The executor function. Takes the data point + any\n * additional arguments and returns the output to evaluate.\n * @param props.evaluators Map from evaluator name to evaluator function. Each\n * evaluator function takes the output of the executor and the target data, and\n * returns.\n * @param props.name Optional name of the evaluation. Used to easily identify\n * the evaluation in the group.\n * @param props.metadata Optional metadata to evaluation\n * @param props.config Optional override configurations for the evaluator.\n */\nexport async function evaluate<D, T, O>({\n data, executor, evaluators, groupName, name, metadata, config,\n}: EvaluationConstructorProps<D, T, O>): Promise<void> {\n const evaluation = new Evaluation<D, T, O>({\n data,\n executor,\n evaluators,\n name,\n groupName,\n metadata,\n config,\n });\n if (globalThis._set_global_evaluation) {\n // TODO: if we load files concurrently, we need to use a mutex to protect\n // concurrent writes to globalThis._evaluations\n globalThis._evaluations = [...(globalThis._evaluations ?? []), evaluation];\n } else {\n await evaluation.run();\n }\n}\n","import { Datapoint } from \"./evaluations\";\nimport { StringUUID } from \"./utils\";\n\nexport type ChatMessage = {\n role: 'user' | 'assistant' | 'system';\n content: string;\n};\n\nexport type NodeInput = ChatMessage[] | string | boolean | number;\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 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};\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 | 'PIPELINE'\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 */\nexport type LaminarSpanContext = {\n spanId: StringUUID;\n traceId: StringUUID;\n isRemote: boolean;\n};\n","export { LaminarClient } from './client';\nexport { EvaluationDataset as Dataset, LaminarDataset } from './datasets';\nexport { observe, withLabels, withTracingLevel } from './decorators';\nexport {\n Datapoint,\n evaluate,\n EvaluatorFunction,\n EvaluatorFunctionReturn,\n HumanEvaluator,\n} from './evaluations';\nexport { Laminar } from './laminar';\nexport { LaminarSpanProcessor } from './opentelemetry-lib/';\nexport { LaminarAttributes } from './opentelemetry-lib/tracing/attributes';\nexport { getTracer, getTracerProvider } from './opentelemetry-lib/tracing/index';\nexport { initializeLaminarInstrumentations } from './opentelemetry-lib/tracing/instrumentations';\nexport {\n ChatMessage,\n EvaluationDatapoint,\n Event,\n LaminarSpanContext,\n NodeInput,\n TracingLevel,\n} from './types';\nexport { Span } from '@opentelemetry/api';\n"],"mappings":"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","names":["value","logger","context","diag","context","trace","trace","path","trace","path","logger","trace","context","logger","key","baseType","logger","path","context","trace","diag","trace","InstrumentationBase","InstrumentationNodeModuleDefinition","InstrumentationBase","InstrumentationNodeModuleDefinition","diag","observe","trace","agent","diag","trace","InstrumentationBase","InstrumentationNodeModuleDefinition","existsSync","readFile","path","logger","RRWEB_SCRIPT_PATH","path","existsSync","InstrumentationBase","InstrumentationNodeModuleDefinition","diag","context","trace","readFile","context","context","logger","context","trace","diag","context","trace","logger","context","trace","context","trace","logger","key","trace","output","target","TracingLevel","Span"]}
1
+ {"version":3,"sources":["../src/client/resources/agent.ts","../src/utils.ts","../src/opentelemetry-lib/tracing/attributes.ts","../src/client/resources/index.ts","../package.json","../src/version.ts","../src/client/resources/browser-events.ts","../src/client/resources/evals.ts","../src/client/resources/tags.ts","../src/client/index.ts","../src/datasets.ts","../src/decorators.ts","../src/opentelemetry-lib/configuration/index.ts","../src/opentelemetry-lib/tracing/index.ts","../src/opentelemetry-lib/tracing/compat.ts","../src/opentelemetry-lib/tracing/instrumentations.ts","../src/browser/playwright.ts","../src/laminar.ts","../src/opentelemetry-lib/tracing/utils.ts","../src/browser/utils.ts","../src/browser/stagehand.ts","../src/browser/puppeteer.ts","../src/opentelemetry-lib/tracing/processor.ts","../src/opentelemetry-lib/tracing/exporter.ts","../src/opentelemetry-lib/tracing/decorators.ts","../src/evaluations.ts","../src/types.ts","../src/index.ts"],"sourcesContent":["/**\n * Agent resource for interacting with Laminar agents.\n */\n\nimport { trace } from \"@opentelemetry/api\";\n\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.getActiveSpan();\n if (currentSpan && currentSpan.isRecording()) {\n const traceId = otelTraceIdToUUID(currentSpan.spanContext().traceId) as StringUUID;\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","import { AttributeValue, SpanContext, TraceFlags } from '@opentelemetry/api';\nimport * as path from \"path\";\nimport pino, { Level } from 'pino';\nimport { PinoPretty } from 'pino-pretty';\nimport { fileURLToPath } from \"url\";\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { ASSOCIATION_PROPERTIES } from './opentelemetry-lib/tracing/attributes';\nimport { LaminarSpanContext } from './types';\n\nexport function initializeLogger(options?: { colorize?: boolean, level?: Level }) {\n const colorize = options?.colorize ?? true;\n const level = options?.level\n ?? (process.env.LMNR_LOG_LEVEL?.toLowerCase()?.trim() as Level)\n ?? 'info';\n\n return pino(PinoPretty({\n colorize,\n minimumLevel: level,\n }));\n}\n\nconst logger = initializeLogger();\n\nexport type StringUUID = `${string}-${string}-${string}-${string}-${string}`;\n\nexport const isStringUUID = (id: string): id is StringUUID =>\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.test(id);\n\nexport const NIL_UUID: StringUUID = '00000000-0000-0000-0000-000000000000';\n\nexport const newUUID = (): StringUUID => {\n // crypto.randomUUID is available in most of the modern browsers and node,\n // but is not available in \"insecure\" contexts, e.g. not https, not localhost\n // so we fallback to uuidv4 in those cases, which is less secure, but works\n // just fine.\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n } else {\n return uuidv4() as `${string}-${string}-${string}-${string}-${string}`;\n }\n};\n\nexport const otelSpanIdToUUID = (spanId: string): string => {\n let id = spanId.toLowerCase();\n if (id.startsWith('0x')) {\n id = id.slice(2);\n }\n if (id.length !== 16) {\n logger.warn(`Span ID ${spanId} is not 16 hex chars long. ` +\n 'This is not a valid OpenTelemetry span ID.');\n }\n\n if (!/^[0-9a-f]+$/.test(id)) {\n logger.error(`Span ID ${spanId} is not a valid hex string. ` +\n 'Generating a random UUID instead.');\n return newUUID();\n }\n\n return id.padStart(32, '0').replace(\n /^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/,\n '$1-$2-$3-$4-$5',\n );\n};\n\nexport const otelTraceIdToUUID = (traceId: string): string => {\n let id = traceId.toLowerCase();\n if (id.startsWith('0x')) {\n id = id.slice(2);\n }\n if (id.length !== 32) {\n logger.warn(`Trace ID ${traceId} is not 32 hex chars long. ` +\n 'This is not a valid OpenTelemetry trace ID.');\n }\n if (!/^[0-9a-f]+$/.test(id)) {\n logger.error(`Trace ID ${traceId} is not a valid hex string. ` +\n 'Generating a random UUID instead.');\n return newUUID();\n }\n\n return id.replace(\n /^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/,\n '$1-$2-$3-$4-$5',\n );\n};\n\nexport const uuidToOtelTraceId = (uuid: string): string => uuid.replace(/-/g, '');\nexport const uuidToOtelSpanId = (uuid: string): string => uuid.replace(/-/g, '').slice(16);\n\n/**\n * This is a simple implementation of a semaphore to replicate\n * the behavior of the `asyncio.Semaphore` in Python.\n */\nexport class Semaphore {\n /**\n * Number of permits available.\n */\n private _value: number;\n /**\n * List of promises that will be resolved when a permit becomes available.\n */\n private _waiters: ((...args: any[]) => any)[] = [];\n\n constructor(value = 1) {\n if (value < 0) {\n throw new Error(\"Semaphore value must be >= 0\");\n }\n this._value = value;\n this._waiters = [];\n }\n\n async acquire() {\n if (this._value > 0) {\n this._value--;\n return;\n }\n\n // Create a promise that will be resolved when a permit becomes available\n return new Promise(resolve => {\n this._waiters.push(resolve);\n });\n }\n\n release() {\n if (this._waiters.length > 0) {\n // If there are waiters, wake up the first one\n const resolve = this._waiters.shift();\n resolve?.();\n } else {\n this._value++;\n }\n }\n\n // Python-like context manager functionality\n async using<T>(fn: (...args: any[]) => Promise<T>) {\n try {\n await this.acquire();\n return await fn();\n } finally {\n this.release();\n }\n }\n}\n\nexport const tryToOtelSpanContext = (\n spanContext: LaminarSpanContext | Record<string, unknown> | string | SpanContext,\n): SpanContext => {\n if (typeof spanContext === 'string') {\n try {\n const record = JSON.parse(spanContext) as Record<string, unknown>;\n return recordToOtelSpanContext(record);\n } catch (e) {\n throw new Error(`Failed to parse span context ${spanContext}. ` +\n 'The string must be a json representation of a LaminarSpanContext.'\n + `Error: ${e instanceof Error ? e.message : String(e)}`);\n }\n } else if (isRecord(spanContext)) {\n // This covers the `LaminarSpanContext` case too.\n return recordToOtelSpanContext(spanContext);\n } else if (typeof spanContext.traceId === 'string'\n && typeof spanContext.spanId === 'string'\n && spanContext.traceId.length === 32\n && spanContext.spanId.length === 16) {\n logger.warn('The span context is already an OpenTelemetry SpanContext. ' +\n 'Returning it as is. Please use `LaminarSpanContext` objects instead.');\n return spanContext;\n }\n else {\n throw new Error(`Invalid span context ${JSON.stringify(spanContext)}. ` +\n 'Must be a LaminarSpanContext or its json representation.');\n }\n};\n\nconst recordToOtelSpanContext = (record: Record<string, unknown>): SpanContext => {\n if (typeof record.spanId === 'string' && typeof record.traceId === 'string') {\n return {\n spanId: uuidToOtelSpanId(record?.spanId ?? record?.['span_id']),\n traceId: uuidToOtelTraceId(record?.traceId ?? record?.['trace_id']),\n isRemote: record?.isRemote ?? record?.['is_remote'] ?? false,\n traceFlags: record?.traceFlags ?? TraceFlags.SAMPLED,\n } as SpanContext;\n } else {\n throw new Error(`Invalid span context ${JSON.stringify(record)}. ` +\n 'Must be a json representation of a LaminarSpanContext.');\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && !Array.isArray(value) && value !== null;\n\n\nexport const getDirname = () => {\n if (typeof __dirname !== 'undefined') {\n return __dirname;\n }\n\n if (typeof import.meta?.url !== 'undefined') {\n return path.dirname(fileURLToPath(import.meta.url));\n }\n\n return process.cwd();\n};\n\nexport const slicePayload = <T>(value: T, length: number) => {\n if (value === null || value === undefined) {\n return value;\n }\n\n const str = JSON.stringify(value);\n if (str.length <= length) {\n return value;\n }\n\n return (str.slice(0, length) + '...');\n};\n\nexport const isOtelAttributeValueType = (value: unknown): value is AttributeValue => {\n if (typeof value === 'string'\n || typeof value === 'number'\n || typeof value === 'boolean') {\n return true;\n }\n\n if (Array.isArray(value)) {\n const allStrings = value.every(value => (value == null) || typeof value === 'string');\n const allNumbers = value.every(value => (value == null) || typeof value === 'number');\n const allBooleans = value.every(value => (value == null) || typeof value === 'boolean');\n return allStrings || allNumbers || allBooleans;\n }\n return false;\n};\n\nexport const metadataToAttributes = (\n metadata: Record<string, unknown>,\n): Record<string, AttributeValue> => Object.fromEntries(\n Object.entries(metadata).map(([key, value]) => {\n if (isOtelAttributeValueType(value)) {\n return [`${ASSOCIATION_PROPERTIES}.metadata.${key}`, value];\n } else {\n return [`${ASSOCIATION_PROPERTIES}.metadata.${key}`, JSON.stringify(value)];\n }\n }),\n);\n","import { SpanAttributes } from '@traceloop/ai-semantic-conventions';\n\nexport const SPAN_INPUT = \"lmnr.span.input\";\nexport const SPAN_OUTPUT = \"lmnr.span.output\";\nexport const SPAN_TYPE = \"lmnr.span.type\";\nexport const SPAN_PATH = \"lmnr.span.path\";\nexport const SPAN_IDS_PATH = \"lmnr.span.ids_path\";\nexport const SPAN_INSTRUMENTATION_SOURCE = \"lmnr.span.instrumentation_source\";\nexport const SPAN_SDK_VERSION = \"lmnr.span.sdk_version\";\nexport const SPAN_LANGUAGE_VERSION = \"lmnr.span.language_version\";\nexport const OVERRIDE_PARENT_SPAN = \"lmnr.internal.override_parent_span\";\nexport const TRACE_HAS_BROWSER_SESSION = \"lmnr.internal.has_browser_session\";\nexport const EXTRACTED_FROM_NEXT_JS = \"lmnr.span.extracted_from.next_js\";\n\nexport const ASSOCIATION_PROPERTIES = \"lmnr.association.properties\";\nexport const SESSION_ID = \"lmnr.association.properties.session_id\";\nexport const USER_ID = \"lmnr.association.properties.user_id\";\nexport const TRACE_TYPE = \"lmnr.association.properties.trace_type\";\n\nexport const ASSOCIATION_PROPERTIES_OVERRIDES: Record<string, string> = {\n \"span_type\": SPAN_TYPE,\n};\n\nexport const LaminarAttributes = {\n // == This is the minimum set of attributes for a proper LLM span ==\n //\n // not SpanAttributes.LLM_USAGE_PROMPT_TOKENS\n INPUT_TOKEN_COUNT: \"gen_ai.usage.input_tokens\",\n // not SpanAttributes.LLM_USAGE_COMPLETION_TOKENS\n OUTPUT_TOKEN_COUNT: \"gen_ai.usage.output_tokens\",\n TOTAL_TOKEN_COUNT: SpanAttributes.LLM_USAGE_TOTAL_TOKENS,\n PROVIDER: SpanAttributes.LLM_SYSTEM,\n REQUEST_MODEL: SpanAttributes.LLM_REQUEST_MODEL,\n RESPONSE_MODEL: SpanAttributes.LLM_RESPONSE_MODEL,\n //\n // == End of minimum set ==\n // == Additional attributes ==\n //\n INPUT_COST: \"gen_ai.usage.input_cost\",\n OUTPUT_COST: \"gen_ai.usage.output_cost\",\n TOTAL_COST: \"gen_ai.usage.cost\",\n //\n // == End of additional attributes ==\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 \"name\": \"@lmnr-ai/lmnr\",\n \"version\": \"0.6.13\",\n \"description\": \"TypeScript SDK for Laminar AI\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"tsx --test test/*.test.ts\",\n \"lint\": \"eslint\",\n \"lint:fix\": \"eslint --fix\"\n },\n \"files\": [\n \"dist\",\n \"assets\"\n ],\n \"bin\": {\n \"lmnr\": \"./dist/cli.js\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/lmnr-ai/lmnr-ts.git\"\n },\n \"keywords\": [\n \"laminar\",\n \"lmnr\",\n \"sdk\",\n \"lmnr.ai\"\n ],\n \"author\": \"founders@lmnr.ai\",\n \"license\": \"Apache-2.0\",\n \"bugs\": {\n \"url\": \"https://github.com/lmnr-ai/lmnr-ts/issues\"\n },\n \"homepage\": \"https://github.com/lmnr-ai/lmnr-ts#README\",\n \"devDependencies\": {\n \"@anthropic-ai/sdk\": \"^0.39.0\",\n \"@aws-sdk/client-bedrock-runtime\": \"^3.835.0\",\n \"@azure/openai\": \"^2.0.0\",\n \"@browserbasehq/stagehand\": \"^2.3.1\",\n \"@eslint/eslintrc\": \"^3.3.1\",\n \"@eslint/js\": \"^9.29.0\",\n \"@google-cloud/aiplatform\": \"^4.2.0\",\n \"@google-cloud/vertexai\": \"^1.10.0\",\n \"@langchain/core\": \"^0.3.61\",\n \"@pinecone-database/pinecone\": \"^5.1.2\",\n \"@playwright/test\": \"^1.53.1\",\n \"@qdrant/js-client-rest\": \"^1.14.1\",\n \"@stylistic/eslint-plugin\": \"^5.0.0\",\n \"@types/argparse\": \"^2.0.17\",\n \"@types/cli-progress\": \"^3.11.6\",\n \"@types/node\": \"^24.0.3\",\n \"@types/semver\": \"^7.7.0\",\n \"@types/uuid\": \"^10.0.0\",\n \"chromadb\": \"^2.4.6\",\n \"cohere-ai\": \"^7.17.1\",\n \"eslint-plugin-simple-import-sort\": \"^12.1.1\",\n \"eslint-plugin-unused-imports\": \"^4.1.4\",\n \"langchain\": \"^0.3.29\",\n \"llamaindex\": \"^0.9.19\",\n \"nock\": \"^14.0.5\",\n \"openai\": \"^4.104.0\",\n \"playwright\": \"^1.53.1\",\n \"puppeteer\": \"^24.10.2\",\n \"puppeteer-core\": \"^24.10.2\",\n \"together-ai\": \"^0.14.0\",\n \"tsup\": \"^8.5.0\",\n \"tsx\": \"^4.20.3\",\n \"typescript\": \"^5.8.3\",\n \"typescript-eslint\": \"^8.35.0\"\n },\n \"dependencies\": {\n \"@grpc/grpc-js\": \"^1.13.4\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/context-async-hooks\": \"^1.30.1\",\n \"@opentelemetry/core\": \"^1.30.1\",\n \"@opentelemetry/exporter-trace-otlp-grpc\": \"^0.57.2\",\n \"@opentelemetry/exporter-trace-otlp-proto\": \"^0.57.2\",\n \"@opentelemetry/instrumentation\": \"^0.57.2\",\n \"@opentelemetry/otlp-exporter-base\": \"^0.57.2\",\n \"@opentelemetry/otlp-grpc-exporter-base\": \"^0.57.2\",\n \"@opentelemetry/resources\": \"^1.30.1\",\n \"@opentelemetry/sdk-node\": \"^0.57.2\",\n \"@opentelemetry/sdk-trace-base\": \"^1.30.1\",\n \"@opentelemetry/sdk-trace-base-v2\": \"npm:@opentelemetry/sdk-trace-base@2.0.0\",\n \"@opentelemetry/sdk-trace-node\": \"^1.30.1\",\n \"@opentelemetry/semantic-conventions\": \"^1.34.0\",\n \"@traceloop/ai-semantic-conventions\": \"^0.12.0\",\n \"@traceloop/instrumentation-anthropic\": \"^0.12.0\",\n \"@traceloop/instrumentation-azure\": \"^0.12.0\",\n \"@traceloop/instrumentation-bedrock\": \"^0.12.0\",\n \"@traceloop/instrumentation-chromadb\": \"^0.12.0\",\n \"@traceloop/instrumentation-cohere\": \"^0.12.0\",\n \"@traceloop/instrumentation-langchain\": \"^0.12.0\",\n \"@traceloop/instrumentation-llamaindex\": \"^0.12.0\",\n \"@traceloop/instrumentation-openai\": \"^0.12.0\",\n \"@traceloop/instrumentation-pinecone\": \"^0.12.0\",\n \"@traceloop/instrumentation-qdrant\": \"^0.12.0\",\n \"@traceloop/instrumentation-together\": \"^0.12.1\",\n \"@traceloop/instrumentation-vertexai\": \"^0.12.0\",\n \"argparse\": \"^2.0.1\",\n \"cli-progress\": \"^3.12.0\",\n \"esbuild\": \"^0.25.5\",\n \"glob\": \"^11.0.3\",\n \"pino\": \"^9.7.0\",\n \"pino-pretty\": \"^13.0.0\",\n \"uuid\": \"^11.1.0\",\n \"zod\": \"^3.25.67\"\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/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 { EvaluationDatapoint, GetDatapointsResponse, InitEvaluationResponse } from \"../../types\";\nimport { newUUID, slicePayload, StringUUID } from \"../../utils\";\nimport { BaseResource } from \".\";\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, 100),\n target: slicePayload(d.target, 100),\n })),\n groupName: groupName ?? null,\n }),\n });\n\n if (!response.ok) {\n await this.handleError(response);\n }\n }\n\n /**\n * Get evaluation datapoints.\n *\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 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","/** Resource for tagging traces. */\n\n\nimport { isStringUUID, otelTraceIdToUUID, StringUUID } 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) as StringUUID;\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 { AgentResource } from \"./resources/agent\";\nimport { BrowserEventsResource } from \"./resources/browser-events\";\nimport { EvalsResource } from \"./resources/evals\";\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 _evals: EvalsResource;\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 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 this.baseUrl = `${baseUrl?.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '') ?? '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._evals = new EvalsResource(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 evals() {\n return this._evals;\n }\n\n public get tags() {\n return this._tags;\n }\n}\n","import { LaminarClient } from './client';\nimport { Datapoint } from './evaluations';\n\nconst DEFAULT_FETCH_SIZE = 25;\n\nexport abstract class EvaluationDataset<D, T> {\n public async slice(start: number, end: number): Promise<Datapoint<D, T>[]> {\n const result = [];\n for (let i = Math.max(start, 0); i < Math.min(end, await this.size()); i++) {\n result.push(await this.get(i));\n }\n return result;\n }\n public abstract size(): Promise<number> | number;\n public abstract get(index: number): Promise<Datapoint<D, T>> | Datapoint<D, T>;\n}\n\nexport class LaminarDataset<D, T> extends EvaluationDataset<D, T> {\n private fetchedItems: Datapoint<D, T>[] = [];\n private len: number | null = null;\n private offset: number = 0;\n private fetchSize: number;\n private name: string;\n private client: LaminarClient | undefined = undefined;\n\n constructor(name: string, fetchSize?: number) {\n super();\n this.name = name;\n this.fetchSize = fetchSize || DEFAULT_FETCH_SIZE;\n }\n\n public setClient(client: LaminarClient) {\n this.client = client;\n }\n\n private async fetchBatch() {\n if (!this.client) {\n throw new Error('Client not set');\n }\n const resp = await this.client.evals.getDatapoints<D, T>({\n datasetName: this.name,\n offset: this.offset,\n limit: this.fetchSize,\n });\n this.fetchedItems = this.fetchedItems.concat(resp.items);\n this.offset = this.fetchedItems.length;\n if (this.len === null) {\n this.len = resp.totalCount;\n }\n }\n\n public async size(): Promise<number> {\n if (this.len === null) {\n await this.fetchBatch();\n }\n return this.len!;\n }\n public async get(index: number): Promise<Datapoint<D, T>> {\n if (index >= this.fetchedItems.length) {\n await this.fetchBatch();\n }\n return this.fetchedItems[index];\n }\n}\n","import { context } from \"@opentelemetry/api\";\n\nimport { observeBase } from './opentelemetry-lib';\nimport { ASSOCIATION_PROPERTIES_KEY } from \"./opentelemetry-lib/tracing/utils\";\nimport { LaminarSpanContext, TraceType, TracingLevel } from './types';\nimport { metadataToAttributes } from \"./utils\";\n\ninterface ObserveOptions {\n name?: string;\n sessionId?: string;\n userId?: string;\n traceType?: TraceType;\n spanType?: 'DEFAULT' | 'LLM' | 'TOOL' | 'EVALUATOR' | 'EVALUATION' | 'EXECUTOR';\n input?: unknown;\n ignoreInput?: boolean;\n ignoreOutput?: boolean;\n parentSpanContext?: string | LaminarSpanContext;\n metadata?: Record<string, any>;\n tags?: string[];\n}\n\n/**\n * The main decorator entrypoint for Laminar. This is used to wrap\n * functions and methods to create spans.\n *\n * @param name - Name of the span. Function name is used if not specified.\n * @param sessionId - Session ID to associate with the span and the following context.\n * @param userId - User ID to associate with the span and the following context.\n * This is different from the id of a Laminar user.\n * @param traceType – Type of the trace. Unless it is within evaluation, it should be 'DEFAULT'.\n * @param spanType - Type of the span. 'DEFAULT' is used if not specified. If the type is 'LLM',\n * you must manually specify some attributes. See `Laminar.setSpanAttributes` for more\n * information.\n * @param input - Force override the input for the span. If not specified, the input will be the\n * arguments passed to the function.\n * @param ignoreInput - Whether to ignore the input altogether.\n * @param ignoreOutput - Whether to ignore the output altogether.\n * @param metadata - Metadata to add to a trace for further filtering. Must be JSON serializable.\n * @param tags - Tags to associate with the span.\n * @returns Returns the result of the wrapped function.\n * @throws Exception - Re-throws the exception if the wrapped function throws an exception.\n *\n * @example\n * ```typescript\n * import { observe } from '@lmnr-ai/lmnr';\n *\n * await observe({ name: 'my_function' }, () => {\n * // Your code here\n * });\n */\nexport async function observe<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n {\n name,\n sessionId,\n userId,\n traceType,\n spanType,\n input,\n ignoreInput,\n ignoreOutput,\n parentSpanContext,\n metadata,\n tags,\n }: ObserveOptions, fn: F, ...args: A): Promise<ReturnType<F>> {\n if (fn === undefined || typeof fn !== \"function\") {\n throw new Error(\"Invalid `observe` usage. Second argument `fn` must be a function.\");\n }\n\n let associationProperties = {};\n if (sessionId) {\n associationProperties = { ...associationProperties, \"session_id\": sessionId };\n }\n if (traceType) {\n associationProperties = { ...associationProperties, \"trace_type\": traceType };\n }\n if (spanType) {\n associationProperties = { ...associationProperties, \"span_type\": spanType };\n }\n if (userId) {\n associationProperties = { ...associationProperties, \"user_id\": userId };\n }\n if (tags) {\n associationProperties = { ...associationProperties, \"tags\": tags };\n }\n if (metadata) {\n const metadataAttributes = metadataToAttributes(metadata);\n if (metadataAttributes && Object.keys(metadataAttributes).length > 0) {\n associationProperties = { ...associationProperties, ...metadataAttributes };\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return await observeBase<A, F>({\n name: name ?? fn.name,\n associationProperties,\n input,\n ignoreInput,\n ignoreOutput,\n parentSpanContext,\n }, fn, undefined, ...args);\n}\n\n/**\n * Sets the labels for any spans inside the function. This is useful for adding\n * labels to the spans created in the auto-instrumentations. Returns the result\n * of the wrapped function, so you can use it in an `await` statement if needed.\n *\n * Requirements:\n * - Labels must be created in your project in advance.\n * - Keys must be strings from your label names.\n * - Values must be strings matching the label's allowed values.\n *\n * @param labels - The labels to set.\n * @returns The result of the wrapped function.\n *\n * @example\n * ```typescript\n * import { withLabels } from '@lmnr-ai/lmnr';\n *\n * const result = await withLabels({ endpoint: \"ft-openai-<id>\" }, () => {\n * openai.chat.completions.create({});\n * });\n * ```\n */\nexport function withLabels<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n labels: string[],\n fn: F,\n ...args: A\n): ReturnType<F> {\n let entityContext = context.active();\n const currentAssociationProperties = entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {};\n const oldLabels = (currentAssociationProperties as Record<string, any>).labels ?? [];\n const newLabels = [...oldLabels, ...labels];\n\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n {\n ...currentAssociationProperties,\n labels: newLabels,\n },\n );\n\n const result = context.with(entityContext, () => fn(...args));\n\n const newAssociationProperties = (\n entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {}\n ) as Record<string, any>;\n\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n { ...newAssociationProperties, labels: oldLabels },\n );\n\n return result;\n}\n\n/**\n * Sets the tracing level for any spans inside the function. This is useful for\n * conditionally disabling the tracing for certain functions.\n * Tracing level must be one of the values in {@link TracingLevel}. Returns the\n * result of the wrapped function, so you can use it in an `await` statement if\n * needed.\n *\n * @param tracingLevel - The tracing level to set.\n * @returns The result of the wrapped function.\n *\n * @example\n * ```typescript\n * import { withTracingLevel, TracingLevel } from '@lmnr-ai/lmnr';\n *\n * const result = await withTracingLevel(TracingLevel.META_ONLY, () => {\n * openai.chat.completions.create({});\n * });\n * ```\n */\nexport function withTracingLevel<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n tracingLevel: TracingLevel,\n fn: F,\n ...args: A\n): ReturnType<F> {\n let entityContext = context.active();\n const currentAssociationProperties = entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {};\n\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n { ...currentAssociationProperties, \"tracing_level\": tracingLevel },\n );\n\n const result = context.with(entityContext, () => fn(...args));\n\n const newAssociationProperties = (\n entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {}\n ) as Record<string, any>;\n delete newAssociationProperties[\"tracing_level\"];\n\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n newAssociationProperties,\n );\n\n return result;\n}\n","import { diag, DiagConsoleLogger, DiagLogLevel } from \"@opentelemetry/api\";\n\nimport { InitializeOptions } from \"../interfaces\";\nimport { startTracing } from \"../tracing\";\n\nexport let _configuration: InitializeOptions | undefined;\n\n/**\n * Initializes the SDK.\n * Must be called once before any other SDK methods.\n *\n * @param options - The options to initialize the SDK. See the {@link InitializeOptions}\n * for details.\n * @throws {InitializationError} if the configuration is invalid or if failed to fetch\n * feature data.\n */\nexport const initializeTracing = (options: InitializeOptions) => {\n if (_configuration) {\n return;\n }\n\n if (!options.baseUrl) {\n options.baseUrl =\n process.env.LMNR_BASE_URL || \"https://api.lmnr.ai:8443\";\n }\n if (!options.apiKey) {\n options.apiKey = process.env.LMNR_PROJECT_API_KEY;\n }\n\n _configuration = Object.freeze(options);\n\n if (options.logLevel) {\n diag.setLogger(\n new DiagConsoleLogger(),\n {\n logLevel: logLevelToOtelLogLevel(options.logLevel),\n suppressOverrideMessage: true,\n },\n );\n }\n\n startTracing(_configuration);\n};\n\nconst logLevelToOtelLogLevel = (\n logLevel: \"debug\" | \"info\" | \"warn\" | \"error\",\n) => {\n switch (logLevel) {\n case \"debug\":\n return DiagLogLevel.DEBUG;\n case \"info\":\n return DiagLogLevel.INFO;\n case \"warn\":\n return DiagLogLevel.WARN;\n case \"error\":\n return DiagLogLevel.ERROR;\n }\n};\n\nexport const _resetConfiguration = () => {\n _configuration = undefined;\n};\n","import { context, trace, Tracer, TracerProvider } from \"@opentelemetry/api\";\nimport { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks';\nimport { registerInstrumentations } from \"@opentelemetry/instrumentation\";\nimport { AlwaysOnSampler } from \"@opentelemetry/sdk-trace-base\";\nimport {\n NodeTracerProvider,\n} from \"@opentelemetry/sdk-trace-node\";\nimport { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from \"@opentelemetry/semantic-conventions\";\n\nimport { version as SDK_VERSION } from \"../../../package.json\";\nimport { initializeLogger } from \"../../utils\";\nimport { _configuration } from \"../configuration\";\nimport { InitializeOptions } from \"../interfaces\";\nimport { createResource } from \"./compat\";\nimport { initializeLaminarInstrumentations } from \"./instrumentations\";\nimport { LaminarSpanProcessor } from \"./processor\";\nimport { isGlobalContextManagerConfigured } from \"./utils\";\n\nconst logger = initializeLogger();\n\nlet spanProcessor: LaminarSpanProcessor;\nlet tracerProvider: TracerProvider | undefined;\nlet _baseHttpUrl: string = \"https://api.lmnr.ai:443\";\nlet _apiKey: string | undefined;\n\n/**\n * Initializes the Tracing SDK.\n * Must be called once before any other SDK methods.\n *\n * @param options - The options to initialize the SDK. See the {@link InitializeOptions}\n * for details.\n */\nexport const startTracing = (options: InitializeOptions) => {\n _baseHttpUrl = `${options.baseUrl}:${options.httpPort ?? 443}`;\n _apiKey = options.apiKey;\n\n const instrumentations = initializeLaminarInstrumentations({\n baseUrl: _baseHttpUrl,\n apiKey: _apiKey,\n suppressContentTracing: !shouldSendTraces(),\n instrumentModules: options.instrumentModules,\n });\n\n const port = options.forceHttp ? options.httpPort : options.port;\n spanProcessor = new LaminarSpanProcessor({\n baseUrl: options.baseUrl,\n port,\n apiKey: options.apiKey,\n forceHttp: options.forceHttp,\n traceExportTimeoutMillis: options.traceExportTimeoutMillis,\n maxExportBatchSize: options.maxExportBatchSize,\n exporter: options.exporter,\n disableBatch: options.disableBatch,\n });\n\n const newProvider = new NodeTracerProvider({\n spanProcessors: [spanProcessor],\n sampler: new AlwaysOnSampler(),\n resource: createResource(\n {\n [ATTR_SERVICE_NAME]: \"laminar-tracer-resource\",\n [ATTR_SERVICE_VERSION]: SDK_VERSION,\n },\n ),\n });\n\n tracerProvider = newProvider;\n\n // Usually, we would do `tracerProvider.register()`, which does three things:\n // 1. Sets the global tracer provider\n // 2. Sets the global context manager to a default one, unless we specify a custom one\n // 3. Sets the global propagator to a default one, unless we specify a custom one\n // We don't do that, because Opentelemetry only allows setting these global\n // OTel API instances once.\n //\n // Instead, we do the following:\n // 1. Carry the global tracer provider around without globally registering it.\n // - Set this tracer provider in the auto-instrumentations from OpenLLMetry\n // - expose the `getTracer` function, which will return a tracer from our\n // tracer provider.\n // 2. Set a context manager globally, only if we are the first ones to do so.\n // - If we are not the first ones, we don't set the global context manager.\n // - If an existing context manager is not broken, it suffices for our purposes\n // for carrying the parent span context.\n // - If any library tries to do so afterwards (and they will, e.g. @vercel/otel\n // or @sentry/node do tracerProvider.register() internally), there will be\n // an error message at their initialization.\n // - We recommend to initialize Laminar after other tracing libraries to avoid that\n // 3. We don't do anything about the propagator, because no Laminar functionality\n // depends on it. We might want to revisit this in the future w.r.t. `LaminarSpanContext`.\n\n // This is a small hack to only set the global context manager if there is none.\n if (!isGlobalContextManagerConfigured()) {\n const contextManager = new AsyncLocalStorageContextManager();\n contextManager.enable();\n context.setGlobalContextManager(contextManager);\n logger.debug('Laminar set global OTel Context Manager');\n }\n logger.debug('Global OTel Context Manager exists');\n\n\n logger.debug(`Laminar registering ${instrumentations.length} instrumentations`);\n // Similarly, we carry our global tracer provider around without globally\n // registering it.\n registerInstrumentations({\n instrumentations,\n tracerProvider: newProvider,\n });\n};\n\nexport const patchModules = (modules: InitializeOptions[\"instrumentModules\"]) => {\n const instrumentations = initializeLaminarInstrumentations({\n baseUrl: _baseHttpUrl,\n apiKey: _apiKey,\n instrumentModules: modules,\n suppressContentTracing: !shouldSendTraces(),\n });\n registerInstrumentations({\n instrumentations,\n tracerProvider: tracerProvider,\n });\n};\n\n\nexport const shouldSendTraces = () => {\n if (!_configuration) {\n /**\n * We've only seen this happen in Next.js where apparently\n * the initialization in `instrumentation.ts` somehow does not\n * respect `Object.freeze`. Unlike original OpenLLMetry/Traceloop,\n * we return true here, because we have other mechanisms\n * {@link withTracingLevel} to disable tracing inputs and outputs.\n */\n return true;\n }\n\n if (\n _configuration.traceContent === false ||\n (process.env.TRACELOOP_TRACE_CONTENT || \"true\").toLowerCase() === \"false\"\n ) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Get the tracer provider. Returns Laminar's tracer provider if Laminar is initialized,\n * otherwise returns the global tracer provider.\n * @returns The tracer provider.\n */\nexport const getTracerProvider = (): TracerProvider => tracerProvider ?? trace.getTracerProvider();\n\n/**\n * Get the tracer.\n * @returns Laminar's tracer if Laminar is initialized,\n * otherwise returns Laminar's tracer from the global tracer provider\n *\n * @example\n * // instrumentation.ts\n * import { Laminar } from '@lmnr-ai/lmnr';\n * Laminar.initialize()\n *\n * // File that calls AI SDK.\n * import { getTracer } from '@lmnr-ai/lmnr';\n * import { openai } from \"@ai-sdk/openai\";\n * import { generateText } from \"ai\";\n *\n * const response = await generateText({\n * model: openai(\"gpt-4.1-nano\"),\n * prompt: \"What is the capital of France?\",\n * experimental_telemetry: {\n * isEnabled: true,\n * tracer: getTracer(),\n * }\n * })\n */\nexport const getTracer = (): Tracer => {\n const TRACER_NAME = \"lmnr.tracer\";\n const TRACER_VERSION = \"0.0.1\";\n const provider = getTracerProvider();\n return provider.getTracer(TRACER_NAME, TRACER_VERSION);\n};\n\nexport const forceFlush = async () => {\n await spanProcessor.forceFlush();\n};\n","// Forward-compatibility with OTel v2 / v0.200 SDKs\nimport { Resource } from \"@opentelemetry/resources\";\nimport { ReadableSpan, Span as SdkSpan } from \"@opentelemetry/sdk-trace-base\";\nimport {\n ReadableSpan as OTelV2ReadableSpan,\n Span as OTelV2Span,\n} from \"@opentelemetry/sdk-trace-base-v2\";\n\n// In-place edits on span object for compatibility between OTel v1 and v2 SDKs\nexport const makeSpanOtelV2Compatible = (\n span: SdkSpan | OTelV2Span | ReadableSpan | OTelV2ReadableSpan,\n) => {\n if ((span as unknown as OTelV2Span).instrumentationScope\n && !(span as unknown as SdkSpan).instrumentationLibrary) {\n // Making the spans from V2 compatible with V1\n Object.assign(span, {\n instrumentationLibrary: (span as unknown as OTelV2Span).instrumentationScope,\n });\n } else if ((span as unknown as SdkSpan).instrumentationLibrary\n && !(span as unknown as OTelV2Span).instrumentationScope) {\n // Making the spans from V1 compatible with V2\n Object.assign(span, {\n instrumentationScope: (span as unknown as SdkSpan).instrumentationLibrary,\n });\n }\n};\n\nexport const getParentSpanId = (\n span: SdkSpan | OTelV2Span | ReadableSpan | OTelV2ReadableSpan,\n): string | undefined => (span as unknown as OTelV2Span).parentSpanContext?.spanId\n ?? (span as unknown as SdkSpan).parentSpanId;\n\nexport const createResource = (\n attributes: Record<string, string>,\n) =>\n // For v2 this would be:\n // const { resourceFromAttributes } = require(\"@opentelemetry/resources\");\n // return resourceFromAttributes(attributes);\n new Resource(attributes);\n","import { Instrumentation } from \"@opentelemetry/instrumentation\";\nimport { AnthropicInstrumentation } from \"@traceloop/instrumentation-anthropic\";\nimport { AzureOpenAIInstrumentation } from \"@traceloop/instrumentation-azure\";\nimport { BedrockInstrumentation } from \"@traceloop/instrumentation-bedrock\";\nimport { ChromaDBInstrumentation } from \"@traceloop/instrumentation-chromadb\";\nimport { CohereInstrumentation } from \"@traceloop/instrumentation-cohere\";\nimport { LangChainInstrumentation } from \"@traceloop/instrumentation-langchain\";\nimport { LlamaIndexInstrumentation } from \"@traceloop/instrumentation-llamaindex\";\nimport { OpenAIInstrumentation } from \"@traceloop/instrumentation-openai\";\nimport { PineconeInstrumentation } from \"@traceloop/instrumentation-pinecone\";\nimport { QdrantInstrumentation } from \"@traceloop/instrumentation-qdrant\";\nimport { TogetherInstrumentation } from \"@traceloop/instrumentation-together\";\nimport {\n AIPlatformInstrumentation,\n VertexAIInstrumentation,\n} from \"@traceloop/instrumentation-vertexai\";\n\nimport { PlaywrightInstrumentation, StagehandInstrumentation } from \"../../browser\";\nimport { PuppeteerInstrumentation } from \"../../browser/puppeteer\";\nimport { LaminarClient } from \"../../client\";\nimport { InitializeOptions } from \"../interfaces\";\n\n/**\n * Initialize and return Laminar instrumentations.\n * Useful to use with libraries that initialize tracing and can register passed\n * instrumentations.\n *\n * @param options\n * @param {string} options.baseUrl - Base URL of the Laminar API.\n * @param {string} options.apiKey - Laminar project API key. If not provided, will use\n * the LMNR_PROJECT_API_KEY environment variable.\n * @param {number} options.httpPort - Laminar API http port. If not provided, will use\n * the port from the baseUrl or defaults to 443. Only required for Playwright/Puppeteer\n * instrumentations for sending browser sessions.\n * @param {boolean} options.suppressContentTracing - Whether to suppress content tracing.\n * @param {InitializeOptions[\"instrumentModules\"]} options.instrumentModules - Record of modules\n * to instrument.\n * If not provided, all auto-instrumentable modules will be instrumented, which include\n * LLM calls (OpenAI, Anthropic, etc), Langchain, VectorDB calls (Pinecone, Qdrant, etc).\n * Pass an empty object {} to disable any kind of automatic instrumentation.\n * If you only want to auto-instrument specific modules, then pass them in the object.\n *\n * @returns {Instrumentation[]} Array of enabled instrumentations. It is your responsibility\n * to enable them and register them with the OpenTelemetry SDK. For example, you could use\n * registerInstrumentations from the opentelemetry-api to register them.\n */\nexport const initializeLaminarInstrumentations = (\n options: {\n baseUrl?: string,\n apiKey?: string,\n httpPort?: number,\n suppressContentTracing?: boolean,\n instrumentModules?: InitializeOptions[\"instrumentModules\"],\n } = {},\n) => {\n const url = options.baseUrl ?? process?.env?.LMNR_BASE_URL ?? 'https://api.lmnr.ai';\n const port = options.httpPort ?? (\n url.match(/:\\d{1,5}$/g)\n ? parseInt(url.match(/:\\d{1,5}$/g)![0].slice(1))\n : 443);\n const urlWithoutSlash = url.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n const client = new LaminarClient({\n baseUrl: `${urlWithoutSlash}:${port}`,\n projectApiKey: options.apiKey ?? process.env.LMNR_PROJECT_API_KEY!,\n });\n\n return options?.instrumentModules !== undefined\n ? manuallyInitInstrumentations(\n client,\n options.instrumentModules,\n options.suppressContentTracing,\n )\n : initInstrumentations(\n client,\n options.suppressContentTracing,\n );\n};\n\nconst initInstrumentations = (\n client: LaminarClient,\n suppressContentTracing?: boolean,\n): Instrumentation[] => {\n const enrichTokens = false;\n const instrumentations: Instrumentation[] = [];\n\n instrumentations.push(new OpenAIInstrumentation({\n enrichTokens,\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new AnthropicInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new AzureOpenAIInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new CohereInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new VertexAIInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new AIPlatformInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new BedrockInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new PineconeInstrumentation());\n\n instrumentations.push(new LangChainInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new LlamaIndexInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new TogetherInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new ChromaDBInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n instrumentations.push(new QdrantInstrumentation({\n traceContent: !suppressContentTracing,\n }));\n\n const playwrightInstrumentation = new PlaywrightInstrumentation(client);\n instrumentations.push(playwrightInstrumentation);\n\n instrumentations.push(new StagehandInstrumentation(playwrightInstrumentation));\n\n instrumentations.push(new PuppeteerInstrumentation(client));\n\n return instrumentations;\n};\n\nconst manuallyInitInstrumentations = (\n client: LaminarClient,\n instrumentModules: InitializeOptions[\"instrumentModules\"],\n suppressContentTracing?: boolean,\n): Instrumentation[] => {\n const enrichTokens = false;\n const instrumentations: Instrumentation[] = [];\n let playwrightInstrumentation: PlaywrightInstrumentation | undefined;\n\n if (instrumentModules?.OpenAI && instrumentModules?.openAI) {\n throw new Error(\n \"`openAI` is deprecated, but both `OpenAI` and `openAI` are provided. \" +\n \"Please use `OpenAI` only.\",\n );\n }\n\n if (instrumentModules?.openAI) {\n const openAIInstrumentation = new OpenAIInstrumentation({\n enrichTokens,\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(openAIInstrumentation);\n openAIInstrumentation.manuallyInstrument(instrumentModules.openAI);\n }\n\n if (instrumentModules?.OpenAI) {\n const openAIInstrumentation = new OpenAIInstrumentation({\n enrichTokens,\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(openAIInstrumentation);\n openAIInstrumentation.manuallyInstrument(instrumentModules.OpenAI);\n }\n\n if (instrumentModules?.anthropic) {\n const anthropicInstrumentation = new AnthropicInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(anthropicInstrumentation);\n anthropicInstrumentation.manuallyInstrument(instrumentModules.anthropic as any);\n }\n\n if (instrumentModules?.azureOpenAI) {\n const azureOpenAIInstrumentation = new AzureOpenAIInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(azureOpenAIInstrumentation as Instrumentation);\n azureOpenAIInstrumentation.manuallyInstrument(instrumentModules.azureOpenAI);\n }\n\n if (instrumentModules?.cohere) {\n const cohereInstrumentation = new CohereInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(cohereInstrumentation);\n cohereInstrumentation.manuallyInstrument(instrumentModules.cohere);\n }\n\n if (instrumentModules?.google_vertexai) {\n const vertexaiInstrumentation = new VertexAIInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(vertexaiInstrumentation);\n vertexaiInstrumentation.manuallyInstrument(\n instrumentModules.google_vertexai,\n );\n }\n\n if (instrumentModules?.google_aiplatform) {\n const aiplatformInstrumentation = new AIPlatformInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(aiplatformInstrumentation);\n aiplatformInstrumentation.manuallyInstrument(\n instrumentModules.google_aiplatform,\n );\n }\n\n if (instrumentModules?.bedrock) {\n const bedrockInstrumentation = new BedrockInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(bedrockInstrumentation);\n bedrockInstrumentation.manuallyInstrument(instrumentModules.bedrock);\n }\n\n if (instrumentModules?.pinecone) {\n const instrumentation = new PineconeInstrumentation();\n instrumentations.push(instrumentation as Instrumentation);\n instrumentation.manuallyInstrument(instrumentModules.pinecone);\n }\n\n if (instrumentModules?.langchain) {\n const langchainInstrumentation = new LangChainInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(langchainInstrumentation);\n langchainInstrumentation.manuallyInstrument(instrumentModules.langchain);\n }\n\n if (instrumentModules?.llamaIndex) {\n const llamaIndexInstrumentation = new LlamaIndexInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(llamaIndexInstrumentation);\n llamaIndexInstrumentation.manuallyInstrument(instrumentModules.llamaIndex);\n }\n\n if (instrumentModules?.chromadb) {\n const chromadbInstrumentation = new ChromaDBInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(chromadbInstrumentation);\n chromadbInstrumentation.manuallyInstrument(instrumentModules.chromadb);\n }\n\n if (instrumentModules?.qdrant) {\n const qdrantInstrumentation = new QdrantInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(qdrantInstrumentation);\n qdrantInstrumentation.manuallyInstrument(instrumentModules.qdrant);\n }\n\n if (instrumentModules?.together) {\n const togetherInstrumentation = new TogetherInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(togetherInstrumentation);\n togetherInstrumentation.manuallyInstrument(instrumentModules.together as any);\n }\n\n if (instrumentModules?.playwright) {\n playwrightInstrumentation = new PlaywrightInstrumentation(client);\n instrumentations.push(playwrightInstrumentation);\n playwrightInstrumentation.manuallyInstrument(instrumentModules.playwright);\n }\n\n if (instrumentModules?.puppeteer) {\n const puppeteerInstrumentation = new PuppeteerInstrumentation(client);\n instrumentations.push(puppeteerInstrumentation);\n puppeteerInstrumentation.manuallyInstrument(instrumentModules.puppeteer);\n }\n\n if (instrumentModules?.stagehand) {\n if (!playwrightInstrumentation) {\n playwrightInstrumentation = new PlaywrightInstrumentation(client);\n instrumentations.push(playwrightInstrumentation);\n }\n const stagehandInstrumentation = new StagehandInstrumentation(playwrightInstrumentation);\n instrumentations.push(stagehandInstrumentation);\n stagehandInstrumentation.manuallyInstrument(instrumentModules.stagehand);\n }\n\n return instrumentations;\n};\n","import { diag, Span, trace } from '@opentelemetry/api';\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\nimport { existsSync } from 'fs';\nimport { readFile } from \"fs/promises\";\nimport path from \"path\";\nimport type * as PlaywrightLib from \"playwright\";\nimport type { Browser, BrowserContext, Page } from 'playwright';\n\nimport { version as SDK_VERSION } from \"../../package.json\";\nimport { LaminarClient } from '../client';\nimport { observe } from '../decorators';\nimport { Laminar } from '../laminar';\nimport { TRACE_HAS_BROWSER_SESSION } from '../opentelemetry-lib/tracing/attributes';\nimport { getDirname, initializeLogger, newUUID, NIL_UUID, StringUUID } from '../utils';\nimport { collectAndSendPageEvents } from \"./utils\";\n\nconst logger = initializeLogger();\n\nconst RRWEB_SCRIPT_PATH = (() => {\n const fileName = 'rrweb.umd.min.cjs';\n const standardPath = path.join(getDirname(), '..', 'assets', 'rrweb', fileName);\n // Fallback paths for different environments and tests\n const fallbackPaths = [\n path.join(getDirname(), '..', '..', 'assets', 'rrweb', fileName), // For tests\n path.join(process.cwd(), 'assets', 'rrweb', fileName), // Using cwd\n path.join(process.cwd(), '@lmnr-ai/lmnr', 'assets', 'rrweb', fileName), // Absolute path\n ];\n\n try {\n if (existsSync(standardPath)) {\n return standardPath;\n }\n\n for (const fallbackPath of fallbackPaths) {\n if (existsSync(fallbackPath)) {\n return fallbackPath;\n }\n }\n\n // If no path exists, return the standard path and let it fail with a clear error\n return standardPath;\n } catch {\n // In case fs.existsSync fails, return the standard path\n return standardPath;\n }\n})();\n\n/* eslint-disable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return\n*/\nexport class PlaywrightInstrumentation extends InstrumentationBase {\n private _patchedBrowsers: Set<Browser> = new Set();\n private _patchedContexts: Set<BrowserContext> = new Set();\n private _patchedPages: Set<Page> = new Set();\n private _parentSpan: Span | undefined;\n private _client: LaminarClient;\n\n constructor(client: LaminarClient) {\n super(\n \"@lmnr/playwright-instrumentation\",\n SDK_VERSION,\n {\n enabled: true,\n },\n );\n this._parentSpan = undefined;\n this._client = client;\n }\n\n // It's the caller's responsibility to ensure the span is ended\n public setParentSpan(span: Span) {\n this._parentSpan = span;\n }\n\n protected init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(\n \"playwright\",\n // TODO: test if the older versions work\n ['>=1.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return module;\n }\n\n public manuallyInstrument(pwModule: {\n chromium?: typeof PlaywrightLib.chromium,\n firefox?: typeof PlaywrightLib.firefox,\n webkit?: typeof PlaywrightLib.webkit,\n }) {\n const browsers = [pwModule.chromium, pwModule.firefox, pwModule.webkit] as const;\n\n for (const browserType of browsers) {\n if (browserType) {\n this._wrap(\n browserType,\n 'launch',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n browserType,\n 'connect',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n browserType,\n 'connectOverCDP',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n browserType,\n 'launchPersistentContext',\n this.patchBrowserNewContext(),\n );\n }\n }\n\n return pwModule;\n }\n\n private patch(moduleExports: typeof PlaywrightLib, moduleVersion?: string) {\n diag.debug(`patching playwright ${moduleVersion}`);\n const browsers = ['chromium', 'firefox', 'webkit'] as const;\n\n for (const browserType of browsers) {\n if (moduleExports[browserType]) {\n // First we need to patch the browser launch to get access to the Page class\n this._wrap(\n moduleExports[browserType],\n `launch`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports[browserType],\n `connect`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports[browserType],\n 'connectOverCDP',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports[browserType],\n 'launchPersistentContext',\n this.patchBrowserNewContext(),\n );\n }\n }\n\n return moduleExports;\n }\n\n private unpatch(moduleExports: typeof PlaywrightLib, moduleVersion?: string) {\n diag.debug(`unpatching playwright ${moduleVersion}`);\n const browsers = ['chromium', 'firefox', 'webkit'] as const;\n\n for (const browserType of browsers) {\n if (moduleExports[browserType]) {\n // First we need to patch the browser launch to get access to the Page class\n this._wrap(\n moduleExports[browserType],\n `launch`,\n this.patchNewBrowser(),\n );\n }\n }\n\n for (const browser of this._patchedBrowsers) {\n this._unwrap(browser, 'newContext');\n this._unwrap(browser, 'newPage');\n }\n for (const context of this._patchedContexts) {\n this._unwrap(context, 'newPage');\n }\n for (const page of this._patchedPages) {\n this._unwrap(page, 'close');\n }\n }\n\n private patchNewBrowser() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: any[]) {\n const browser: Browser = await original.call(this, ...args);\n if (!plugin._parentSpan) {\n plugin._parentSpan = Laminar.startSpan({\n name: 'playwright',\n });\n }\n\n for (const context of browser.contexts()) {\n await Promise.all(context.pages().map(page => plugin.patchPage(page)));\n plugin._wrap(\n context,\n 'newPage',\n plugin.patchBrowserContextNewPage(),\n );\n context.on('page', (page: Page) => plugin.patchPage(page));\n plugin._patchedContexts.add(context);\n }\n\n plugin._wrap(\n browser,\n 'newContext',\n plugin.patchBrowserNewContext(),\n );\n\n plugin._wrap(\n browser,\n 'newPage',\n plugin.patchBrowserNewPage(),\n );\n\n plugin._wrap(\n browser,\n 'close',\n plugin.patchBrowserClose(),\n );\n\n plugin._patchedBrowsers.add(browser);\n return browser;\n };\n }\n\n private patchBrowserClose() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: unknown[]) {\n await original.call(this, ...args);\n if (plugin._parentSpan?.isRecording()) {\n plugin._parentSpan?.end();\n }\n };\n }\n\n private patchBrowserNewContext() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: unknown[]) {\n const context: BrowserContext = await original.bind(this).apply(this, args);\n if (!plugin._parentSpan) {\n plugin._parentSpan = Laminar.startSpan({\n name: 'playwright',\n });\n }\n // Patch pages that are created manually from Playwright\n plugin._wrap(\n context,\n 'newPage',\n plugin.patchBrowserContextNewPage(),\n );\n plugin._wrap(\n context,\n 'close',\n plugin.patchBrowserContextClose(),\n );\n // Patch pages created by browser, e.g. new tab\n context.on('page', async (page) => plugin.patchPage(page));\n\n // Patch pages that are already created\n for (const page of context.pages()) {\n await plugin.patchPage(page);\n }\n\n plugin._patchedContexts.add(context);\n return context;\n };\n }\n\n private patchBrowserContextClose() {\n const plugin = this;\n return (original: Function) => async function method(this: BrowserContext, ...args: unknown[]) {\n await original.bind(this).apply(this, args);\n if (plugin._parentSpan?.isRecording()) {\n plugin._parentSpan.end();\n }\n };\n }\n\n private patchBrowserNewPage() {\n return (original: Function) => async function method(this: Browser, ...args: unknown[]) {\n const page = await original.bind(this).apply(this, args);\n if (!page) {\n return null;\n }\n // TODO: investigate why this creates a separate empty span and no events\n // await plugin.patchPage(page);\n return page;\n };\n }\n\n public patchBrowserContextNewPage() {\n const plugin = this;\n return (original: Function) => async function method(this: BrowserContext, ...args: unknown[]) {\n const page = await original.bind(this).apply(this, args);\n if (!plugin._parentSpan) {\n plugin._parentSpan = Laminar.startSpan({\n name: 'playwright',\n });\n }\n if (!page) {\n return null;\n }\n\n await plugin.patchPage(page);\n\n return page;\n };\n }\n\n public async patchPage(page: Page) {\n return await Laminar.withSpan(this._parentSpan!, async () => {\n // Note: be careful with await here, if the await is removed,\n // this creates a race condition, and playwright fails.\n await observe({ name: 'playwright.page' }, async () => {\n await this._patchPage(page);\n });\n });\n }\n\n private async _patchPage(page: Page) {\n const originalBringToFront = page.bringToFront.bind(page);\n page.bringToFront = async () => {\n await originalBringToFront();\n await page.evaluate(() => {\n if ((window as any).lmnrRrweb) {\n try {\n (window as any).lmnrRrweb.record.takeFullSnapshot();\n } catch (error) {\n console.error(\"Failed to take full snapshot: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n });\n };\n\n page.addListener(\"domcontentloaded\", (p: Page) => {\n this.injectRrweb(p).catch(error => {\n logger.error(\"Failed to inject rrweb: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n\n await this.injectRrweb(page);\n this._patchedPages.add(page);\n\n trace.getActiveSpan()?.setAttribute(TRACE_HAS_BROWSER_SESSION, true);\n\n const traceId = trace.getActiveSpan()?.spanContext().traceId as StringUUID ?? NIL_UUID;\n const sessionId = newUUID();\n const interval = setInterval(() => {\n if (page.isClosed()) {\n clearInterval(interval);\n return;\n }\n collectAndSendPageEvents(this._client, page, sessionId, traceId)\n .catch(error => {\n logger.error(\"Event collection stopped: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }, 2000);\n\n page.addListener('close', async () => {\n clearInterval(interval);\n await collectAndSendPageEvents(this._client, page, sessionId, traceId);\n for (const otherPage of page.context().pages().reverse()) {\n try {\n await otherPage.bringToFront();\n break;\n } catch (error) {\n logger.debug(\"Failed to bring page to front: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n });\n }\n\n private async injectRrweb(page: Page) {\n // Wait for the page to be in a ready state first\n await page.waitForLoadState('domcontentloaded');\n const tryRunScript = async (\n script: (...args: any[]) => Promise<any>,\n maxAttempts: number = 5,\n ) => {\n for (let i = 0; i < maxAttempts; i++) {\n try {\n return await script();\n } catch (error) {\n logger.error(\"Operation \" + script.name + \" failed: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n await new Promise(resolve => setTimeout(resolve, 500));\n }\n };\n\n const isRrwebPresent = await page.evaluate(() =>\n typeof (window as any).lmnrRrweb !== 'undefined',\n );\n\n // Load rrweb and set up recording\n if (!isRrwebPresent) {\n const script = await readFile(RRWEB_SCRIPT_PATH, 'utf8');\n await tryRunScript(async function injectRrweb() {\n await page.evaluate(script);\n const res = await page.waitForFunction(\n () => 'lmnrRrweb' in window || (window as any).lmnrRrweb,\n {\n timeout: 5000,\n },\n );\n if (!res) {\n throw new Error('Failed to inject rrweb');\n }\n });\n }\n\n // Update the recording setup to include trace ID\n await tryRunScript(async function setupRrwebCollection() {\n await page.evaluate(() => {\n const HEARTBEAT_INTERVAL = 1000; // 1 second heartbeat\n\n (window as any).lmnrRrwebEventsBatch = new Set();\n\n const compressEventData = async (data: any) => {\n const jsonString = JSON.stringify(data);\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 return Array.from(new Uint8Array(compressedData));\n };\n\n (window as any).lmnrGetAndClearEvents = () => {\n const events = (window as any).lmnrRrwebEventsBatch;\n (window as any).lmnrRrwebEventsBatch = new Set();\n return Array.from(events);\n };\n\n setInterval(() => {\n (window as any).lmnrRrweb.record.addCustomEvent('heartbeat', {\n title: document.title,\n url: document.URL,\n });\n }, HEARTBEAT_INTERVAL);\n\n (window as any).lmnrRrweb.record({\n async emit(event: any) {\n const compressedEvent = {\n ...event,\n data: await compressEventData(event.data),\n };\n (window as any).lmnrRrwebEventsBatch.add(compressedEvent);\n },\n recordCanvas: true,\n collectFonts: true,\n recordCrossOriginIframes: true,\n });\n });\n });\n };\n}\n/* eslint-enable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return\n*/\n","import {\n Attributes,\n AttributeValue,\n Context,\n context as contextApi,\n isSpanContextValid,\n Span,\n TimeInput,\n trace,\n} from '@opentelemetry/api';\n\nimport { InitializeOptions, initializeTracing } from './opentelemetry-lib';\nimport { forceFlush, getTracer, patchModules } from './opentelemetry-lib/tracing/';\nimport {\n ASSOCIATION_PROPERTIES,\n LaminarAttributes,\n SESSION_ID,\n SPAN_INPUT,\n SPAN_OUTPUT,\n SPAN_TYPE,\n USER_ID,\n} from './opentelemetry-lib/tracing/attributes';\nimport { ASSOCIATION_PROPERTIES_KEY } from './opentelemetry-lib/tracing/utils';\nimport { LaminarSpanContext } from './types';\nimport {\n initializeLogger,\n isOtelAttributeValueType,\n metadataToAttributes,\n otelSpanIdToUUID,\n otelTraceIdToUUID,\n StringUUID,\n tryToOtelSpanContext,\n} from './utils';\n\nconst logger = initializeLogger();\n\ninterface LaminarInitializeProps {\n projectApiKey?: string;\n baseUrl?: string;\n httpPort?: number;\n grpcPort?: number;\n instrumentModules?: InitializeOptions[\"instrumentModules\"];\n disableBatch?: boolean;\n traceExportTimeoutMillis?: number;\n logLevel?: \"debug\" | \"info\" | \"warn\" | \"error\";\n maxExportBatchSize?: number;\n forceHttp?: boolean;\n}\n\ntype LaminarAttributesProp = Record<\n typeof LaminarAttributes[keyof typeof LaminarAttributes],\n AttributeValue\n>;\n\nexport class Laminar {\n private static baseHttpUrl: string;\n private static projectApiKey: string;\n private static isInitialized: boolean = false;\n /**\n * Initialize Laminar context across the application.\n * This method must be called before using any other Laminar methods or decorators.\n *\n * @param {LaminarInitializeProps} props - Configuration object.\n * @param {string} props.projectApiKey - Laminar project api key. You can generate one by going\n * to the projects settings page on the Laminar dashboard.\n * If not specified, it will try to read from the LMNR_PROJECT_API_KEY environment variable.\n * @param {string} props.baseUrl - Laminar API url. Do not include the port, use\n * `httpPort` and `grpcPort` instead.\n * If not specified, defaults to https://api.lmnr.ai.\n * @param {number} props.httpPort - Laminar API http port.\n * If not specified, defaults to 443.\n * @param {number} props.grpcPort - Laminar API grpc port.\n * If not specified, defaults to 8443.\n * @param {InitializeOptions[\"instrumentModules\"]} props.instrumentModules - Record\n * of modules to instrument.\n * If not specified, all auto-instrumentable modules will be instrumented, which include\n * LLM calls (OpenAI, Anthropic, etc), Langchain, VectorDB calls (Pinecone, Qdrant, etc).\n * Pass an empty object {} to disable any kind of automatic instrumentation.\n * If you only want to auto-instrument specific modules, then pass them in the object.\n * @param {boolean} props.disableBatch - Whether to disable batching of spans. Useful for debug\n * environments. If true, spans will be sent immediately using {@link SimpleSpanProcessor}\n * instead of {@link BatchSpanProcessor}.\n * @param {number} props.traceExportTimeoutMillis - Timeout for trace export.\n * Defaults to 30_000 (30 seconds),\n * which is over the default OTLP exporter timeout of 10_000 (10 seconds).\n * @param {string} props.logLevel - OTel log level. Defaults to \"error\".\n * @param {number} props.maxExportBatchSize - Maximum number of spans to export in a single batch.\n * Ignored when `disableBatch` is true.\n * @param {boolean} props.forceHttp - Whether to force HTTP export. Not recommended.\n *\n * @example\n * import { Laminar } from '@lmnr-ai/lmnr';\n * import { OpenAI } from 'openai';\n * import * as ChainsModule from \"langchain/chains\";\n *\n * // Initialize Laminar while auto-instrumenting Langchain and OpenAI modules.\n * Laminar.initialize({\n * projectApiKey: \"<LMNR_PROJECT_API_KEY>\",\n * instrumentModules: {\n * langchain: {\n * chainsModule: ChainsModule\n * },\n * openAI: OpenAI\n * }\n * });\n *\n * @throws {Error} - If project API key is not set\n */\n public static initialize({\n projectApiKey,\n baseUrl,\n httpPort,\n grpcPort,\n instrumentModules,\n disableBatch,\n traceExportTimeoutMillis,\n logLevel,\n maxExportBatchSize,\n forceHttp,\n }: LaminarInitializeProps = {}) {\n const key = projectApiKey ?? process?.env?.LMNR_PROJECT_API_KEY;\n if (key === undefined) {\n throw new Error(\n 'Please initialize the Laminar object with your project API key ' +\n 'or set the LMNR_PROJECT_API_KEY environment variable',\n );\n }\n this.projectApiKey = key;\n const url = baseUrl ?? process?.env?.LMNR_BASE_URL ?? 'https://api.lmnr.ai';\n const port = httpPort ?? (\n url.match(/:\\d{1,5}$/g)\n ? parseInt(url.match(/:\\d{1,5}$/g)![0].slice(1))\n : 443);\n const urlWithoutSlash = url.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n this.baseHttpUrl = `${urlWithoutSlash}:${port}`;\n\n this.isInitialized = true;\n\n initializeTracing({\n baseUrl: urlWithoutSlash,\n apiKey: this.projectApiKey,\n port: grpcPort,\n forceHttp,\n httpPort,\n silenceInitializationMessage: true,\n instrumentModules,\n logLevel: logLevel ?? \"error\",\n disableBatch,\n maxExportBatchSize,\n traceExportTimeoutMillis,\n });\n }\n\n /**\n * Patch modules manually. Use this in setups where {@link Laminar.initialize()}\n * and in particular its `instrumentModules` option is not working, e.g. in\n * Next.js place Laminar initialize in `instrumentation.ts`, and then patch\n * the modules in server components or API routes.\n *\n * Make sure to call this after {@link Laminar.initialize()}.\n *\n * @param {InitializeOptions[\"instrumentModules\"]} modules - Record of modules to instrument.\n */\n public static patch(modules: InitializeOptions[\"instrumentModules\"]) {\n if (!this.isInitialized) {\n logger.warn(\"Laminar must be initialized before patching modules. Skipping patch.\");\n return;\n }\n if (!modules || Object.keys(modules).length === 0) {\n throw new Error(\"Pass at least one module to patch\");\n }\n patchModules(modules);\n }\n\n /**\n * Check if Laminar has been initialized. Utility to make sure other methods\n * are called after initialization.\n */\n public static initialized(): boolean {\n return this.isInitialized;\n }\n\n /**\n * Associates an event with the current span. If event with such name never\n * existed, Laminar will create a new event and infer its type from the value.\n * If the event already exists, Laminar will append the value to the event\n * if and only if the value is of a matching type. Otherwise, the event won't\n * be recorded. Supported types are string, number, and boolean. If the value\n * is `null`, event is considered a boolean tag with the value of `true`.\n *\n * @param {string} name - The name of the event.\n * @param {AttributeValue} value - The value of the event. Must be a primitive type. If not\n * specified, boolean true is assumed in the backend.\n * @param {TimeInput} timestamp - The timestamp of the event. If not specified, relies on\n * the underlying OpenTelemetry implementation.\n * If specified as an integer, it must be epoch nanoseconds.\n */\n public static event(\n name: string,\n value?: AttributeValue,\n timestamp?: TimeInput,\n ) {\n const currentSpan = trace.getActiveSpan();\n if (currentSpan === undefined || !isSpanContextValid(currentSpan.spanContext())) {\n logger.warn(\"`Laminar().event()` called outside of span context.\" +\n ` Event '${name}' will not be recorded in the trace.` +\n \" Make sure to wrap the function with `observe` or `withSpan`\",\n );\n return;\n }\n\n const event: Attributes = {\n \"lmnr.event.type\": \"default\",\n };\n if (value !== undefined) {\n event[\"lmnr.event.value\"] = value;\n }\n\n currentSpan.addEvent(name, event, timestamp);\n }\n\n /**\n * @deprecated Use `sessionId` in {@link observe} or `session_id` in\n * {@link Laminar.setSpanSessionId} instead.\n * Sets the session information for the current span and returns the\n * context to use for the following spans. Returns the result of the\n * function execution, so can be used in an `await` statement.\n *\n * @param {string} sessionId - The session ID to associate with the context.\n * @param {Function} fn - Function to execute within the session context.\n * @returns {T} The result of the function execution.\n *\n * @example\n * import { Laminar, observe } from '@lmnr-ai/lmnr';\n * const result = await Laminar.withSession(\"session1234\", async () => {\n * // Your code here\n * });\n */\n public static withSession<T>(\n sessionId: string,\n fn: () => T,\n ): T {\n const currentSpan = trace.getActiveSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n if (sessionId) {\n currentSpan.setAttribute(SESSION_ID, sessionId);\n }\n }\n let associationProperties = {};\n if (sessionId) {\n associationProperties = { ...associationProperties, \"session_id\": sessionId };\n }\n\n let entityContext = contextApi.active();\n const currentAssociationProperties = entityContext.getValue(ASSOCIATION_PROPERTIES_KEY);\n if (associationProperties && Object.keys(associationProperties).length > 0) {\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n { ...(currentAssociationProperties ?? {}), ...associationProperties },\n );\n }\n return contextApi.with(entityContext, fn);\n }\n\n /**\n * @deprecated Use {@link Laminar.setTraceMetadata} or the `metadata` option in\n * {@link observe} instead.\n *\n * Sets the metadata for the current span and returns the context to use for\n * the following spans. Returns the result of the function execution, so can\n * be used in an `await` statement.\n *\n * @param metadata - The metadata to associate with the context. Set of string key\n * string value pairs.\n * @param fn - Function to execute within the metadata context.\n * @returns The result of the function execution.\n *\n * @example\n * import { Laminar } from '@lmnr-ai/lmnr';\n * const result = await Laminar.withMetadata(\n * {\n * \"my_metadata_key\": \"my_metadata_value\"\n * },\n * async () => {\n * // Your code here\n * }\n * );\n */\n public static withMetadata<T>(\n metadata: Record<string, string>,\n fn: () => T,\n ): T {\n const currentSpan = trace.getActiveSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n for (const [key, value] of Object.entries(metadata)) {\n currentSpan.setAttribute(`${ASSOCIATION_PROPERTIES}.metadata.${key}`, value);\n }\n }\n\n const metadataAttributes = Object.fromEntries(\n Object.entries(metadata).map(([key, value]) => {\n if (isOtelAttributeValueType(value)) {\n return [`metadata.${key}`, value];\n } else {\n return [`metadata.${key}`, JSON.stringify(value)];\n }\n }),\n );\n\n let entityContext = contextApi.active();\n const currentAssociationProperties = entityContext.getValue(ASSOCIATION_PROPERTIES_KEY);\n if (metadataAttributes && Object.keys(metadataAttributes).length > 0) {\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n { ...(currentAssociationProperties ?? {}), ...metadataAttributes },\n );\n }\n return contextApi.with(entityContext, fn);\n }\n\n /**\n * Set attributes for the current span. Useful for manual\n * instrumentation.\n * @param {LaminarAttributesProp} attributes - The attributes to set for the current span.\n *\n * @example\n * import { Laminar as L, observe } from '@lmnr-ai/laminar';\n * await observe({ name: 'mySpanName', spanType: 'LLM' }, async (msg: string) => {\n * const response = await myCustomCallToOpenAI(msg);\n * L.setSpanAttributes({\n * [LaminarAttributes.PROVIDER]: 'openai',\n * [LaminarAttributes.REQUEST_MODEL]: \"requested_model\",\n * [LaminarAttributes.RESPONSE_MODEL]: response.model,\n * [LaminarAttributes.INPUT_TOKEN_COUNT]: response.usage.prompt_tokens,\n * [LaminarAttributes.OUTPUT_TOKEN_COUNT]: response.usage.completion_tokens,\n * })\n * }, userMessage);\n */\n public static setSpanAttributes(\n attributes: LaminarAttributesProp,\n ) {\n const currentSpan = trace.getActiveSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n for (const [key, value] of Object.entries(attributes)) {\n currentSpan.setAttribute(key, value);\n }\n }\n }\n\n /**\n * Set the output of the current span. Useful for manual instrumentation.\n * @param output - Output of the span. Will be sent as an attribute, so must\n * be serializable to JSON.\n */\n public static setSpanOutput(output: any) {\n if (output == null) {\n return;\n }\n const currentSpan = trace.getActiveSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n currentSpan.setAttribute(SPAN_OUTPUT, JSON.stringify(output));\n }\n }\n\n public static setTraceMetadata(metadata: Record<string, any>) {\n const currentSpan = trace.getActiveSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n const metadataAttributes = metadataToAttributes(metadata);\n currentSpan.setAttributes(metadataAttributes);\n }\n }\n\n public static setTraceSessionId(sessionId: string) {\n const currentSpan = trace.getActiveSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n currentSpan.setAttribute(SESSION_ID, sessionId);\n }\n }\n\n public static setTraceUserId(userId: string) {\n const currentSpan = trace.getActiveSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n currentSpan.setAttribute(USER_ID, userId);\n }\n }\n\n public static setSpanTags(tags: string[]) {\n const currentSpan = trace.getActiveSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n currentSpan.setAttribute(`${ASSOCIATION_PROPERTIES}.tags`, tags);\n }\n }\n\n /**\n * Start a new span, but don't set it as active. Useful for\n * manual instrumentation. If span type is 'LLM', you should report usage\n * manually. See {@link setSpanAttributes} for more information.\n *\n * @param {Object} options\n * @param {string} options.name - name of the span\n * @param {any} options.input - input to the span. Will be sent as an attribute, so must\n * be JSON serializable\n * @param {string} options.spanType - type of the span. Defaults to 'DEFAULT'\n * @param {Context} options.context - raw OpenTelemetry context to bind the span to.\n * @param {string} options.parentSpanContext - parent span context to bind the span to.\n * @param {string[]} options.labels - [DEPRECATED] labels to associate with the span.\n * @param {string} options.tags - tags to associate with the span.\n * @returns The started span.\n *\n * @example\n * import { Laminar, observe } from '@lmnr-ai/lmnr';\n * const foo = async (span: Span) => {\n * await Laminar.withSpan(span, async () => {\n * await observe({ name: 'foo' }, async () => {\n * // Your code here\n * })\n * })\n * };\n * const bar = async (span: Span) => {\n * await Laminar.withSpan(span, async () => {\n * await openai_client.chat.completions.create();\n * })\n * };\n *\n * const parentSpan = Laminar.startSpan({name: \"outer\"});\n * foo(parentSpan);\n * await bar(parentSpan);\n * // IMPORTANT: Don't forget to end the span!\n * parentSpan.end();\n *\n * // Results in:\n * // | outer\n * // | | foo\n * // | | | ...\n * // | | bar\n * // | | | openai.chat\n */\n public static startSpan({\n name,\n input,\n spanType,\n context,\n parentSpanContext,\n labels,\n tags,\n userId,\n sessionId,\n metadata,\n }: {\n name: string,\n input?: any,\n spanType?: 'LLM' | 'DEFAULT' | 'TOOL',\n context?: Context,\n parentSpanContext?: string | LaminarSpanContext,\n labels?: string[],\n tags?: string[],\n userId?: string,\n sessionId?: string,\n metadata?: Record<string, any>,\n }): Span {\n let entityContext = context ?? contextApi.active();\n if (parentSpanContext) {\n const spanContext = tryToOtelSpanContext(parentSpanContext);\n entityContext = trace.setSpan(entityContext, trace.wrapSpanContext(spanContext));\n }\n const labelProperties = labels ? { [`${ASSOCIATION_PROPERTIES}.labels`]: labels } : {};\n const tagProperties = tags ? { [`${ASSOCIATION_PROPERTIES}.tags`]: tags } : {};\n const userIdProperties = userId ? { [USER_ID]: userId } : {};\n const sessionIdProperties = sessionId ? { [SESSION_ID]: sessionId } : {};\n const metadataProperties = metadata\n ? metadataToAttributes(metadata)\n : {};\n const attributes = {\n [SPAN_TYPE]: spanType ?? 'DEFAULT',\n ...labelProperties,\n ...tagProperties,\n ...userIdProperties,\n ...sessionIdProperties,\n ...metadataProperties,\n };\n const span = getTracer().startSpan(name, { attributes }, entityContext);\n if (input) {\n span.setAttribute(SPAN_INPUT, JSON.stringify(input));\n }\n return span;\n }\n\n /**\n * A utility wrapper around OpenTelemetry's `context.with()`. Useful for\n * passing spans around in manual instrumentation:\n *\n * @param {Span} span - Parent span to bind the execution to.\n * @param {Function} fn - Function to execute within the span context.\n * @param {boolean} endOnExit - Whether to end the span after the function has\n * executed. Defaults to `false`. If `false`, you MUST manually call\n * `span.end()` at the end of the execution, so that spans are not lost.\n * @returns The result of the function execution.\n *\n * See {@link startSpan} docs for a usage example\n */\n public static withSpan<T>(span: Span, fn: () => T, endOnExit?: boolean): T | Promise<T> {\n return contextApi.with(trace.setSpan(contextApi.active(), span), () => {\n try {\n const result = fn();\n if (result instanceof Promise) {\n return result.finally(() => {\n if (endOnExit !== undefined && endOnExit) {\n span.end();\n }\n });\n }\n if (endOnExit !== undefined && endOnExit) {\n span.end();\n }\n return result;\n }\n catch (error) {\n span.recordException(error as Error);\n if (endOnExit !== undefined && endOnExit) {\n span.end();\n }\n throw error;\n }\n });\n }\n\n public static serializeLaminarSpanContext(span?: Span): string | null {\n const laminarSpanContext = this.getLaminarSpanContext(span);\n if (laminarSpanContext === null) {\n return null;\n }\n return JSON.stringify(laminarSpanContext);\n };\n\n public static getLaminarSpanContext(span?: Span): LaminarSpanContext | null {\n const currentSpan = span ?? trace.getActiveSpan();\n if (currentSpan === undefined || !isSpanContextValid(currentSpan.spanContext())) {\n return null;\n }\n return {\n traceId: otelTraceIdToUUID(currentSpan.spanContext().traceId) as StringUUID,\n spanId: otelSpanIdToUUID(currentSpan.spanContext().spanId) as StringUUID,\n isRemote: currentSpan.spanContext().isRemote ?? false,\n };\n }\n\n /**\n * Get the trace id of the current span. Returns null if there is no active span.\n * @returns {StringUUID | null} The trace id of the current span.\n */\n public static getTraceId(): StringUUID | null {\n return this.getLaminarSpanContext()?.traceId ?? null;\n }\n\n public static async flush() {\n if (this.isInitialized) {\n logger.debug(\"Flushing spans\");\n await forceFlush();\n }\n }\n\n public static async shutdown() {\n if (this.isInitialized) {\n logger.debug(\"Shutting down Laminar\");\n await forceFlush();\n // other shutdown should go here\n }\n }\n\n public static getHttpUrl(): string {\n return this.baseHttpUrl;\n }\n\n public static getProjectApiKey(): string {\n return this.projectApiKey;\n }\n}\n","import {\n Context,\n context,\n createContextKey,\n ROOT_CONTEXT,\n} from \"@opentelemetry/api\";\n\n// Function to check if a global context manager is already configured\nexport const isGlobalContextManagerConfigured = () => {\n // Create a temporary context key for testing\n const testKey = createContextKey('lmnr-test-context-manager-check');\n\n // Create a context with this key\n const testContext = ROOT_CONTEXT.setValue(testKey, 'lmnr-test-value');\n\n // Try to make this context active\n let isContextManagerWorking = false;\n\n context.with(testContext, () => {\n // If the context manager is configured and enabled,\n // active() should return our test context\n const activeContext = context.active();\n isContextManagerWorking = activeContext.getValue(testKey) === 'lmnr-test-value';\n });\n\n return isContextManagerWorking;\n};\n\nexport const SPAN_PATH_KEY = createContextKey(\"span_path\");\nexport const ASSOCIATION_PROPERTIES_KEY = createContextKey(\n \"association_properties\",\n);\n\nexport const getSpanPath = (entityContext: Context): string | undefined => {\n const path = entityContext.getValue(SPAN_PATH_KEY) as string | undefined;\n return path ? `${path}` : undefined;\n};\n","import { LLMClient } from \"@browserbasehq/stagehand\";\nimport { Page as PlaywrightPage } from \"playwright\";\nimport { Page as PuppeteerPage } from \"puppeteer\";\nimport { z } from \"zod\";\n\nimport { LaminarClient } from \"..\";\nimport { initializeLogger, StringUUID } from \"../utils\";\n\nconst logger = initializeLogger();\n\n/**\n * If the first argument is a string, return an object with the name of the method\n * and the argument as the value.\n * Otherwise, return the shallow copy of the arguments.\n *\n * This is useful for Stagehand, where the first argument is often a string, but is named\n * 'instruction', so we add a name to it on the spans.\n *\n * @param args - Args of a function.\n * @param name - The name to add on the first argument if it is a string.\n * @returns The arguments as an object with the name of the method and the argument\n * as the value, or the arguments as is.\n */\nexport const nameArgsOrCopy = (args: any[], name: string = \"instruction\") => {\n if (args.length === 1 && typeof args[0] === 'string') {\n return { [name]: args[0] };\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return [...args];\n};\n\n\nexport const collectAndSendPageEvents = async (\n client: LaminarClient,\n page: PlaywrightPage | PuppeteerPage,\n sessionId: StringUUID,\n traceId: StringUUID,\n) => {\n try {\n if (page.isClosed()) {\n return;\n }\n\n // Puppeteer pages have the same evaluate method, but Typescript\n // isn't liking that the signature is different.\n const hasFunction = await (page as PlaywrightPage).evaluate(\n () => typeof (window as any).lmnrGetAndClearEvents === 'function',\n );\n if (!hasFunction) {\n return;\n }\n\n // Puppeteer pages have the same evaluate method, but TypeScript\n // isn't liking that the signature is different.\n\n /* eslint-disable @typescript-eslint/no-unsafe-return */\n const events = await (page as PlaywrightPage).evaluate(\n async () => {\n if (typeof (window as any).lmnrGetAndClearEvents !== 'function') {\n return [];\n }\n return await (window as any).lmnrGetAndClearEvents();\n },\n );\n /* eslint-enable @typescript-eslint/no-unsafe-return */\n if (events == null || events.length === 0) {\n return;\n }\n\n await client.browserEvents.send({\n sessionId,\n traceId,\n events,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"Execution context was destroyed\")\n || message.includes(\"Target page, context or browser has been closed\")) {\n logger.debug(`Tried to flush events from a closed page. Continuing...`);\n } else {\n logger.error(`Error sending events: ${message}`);\n }\n }\n};\n\n// Removes the heavy client prop and the apiKey to avoid security issues\nexport const cleanStagehandLLMClient = (llmClient: LLMClient | object): Omit<LLMClient, \"client\"> =>\n Object.fromEntries(\n Object.entries(llmClient)\n .filter(([key]) => key !== \"client\")\n .map(([key, value]) =>\n key === \"clientOptions\"\n ? [\n key,\n Object.fromEntries(\n Object.entries(value).filter(([key]) => key !== \"apiKey\"),\n ),\n ]\n : [key, value],\n ),\n ) as Omit<LLMClient, \"client\">;\n\n\nexport const prettyPrintZodSchema = (schema: z.AnyZodObject, indent = 2): string => {\n if (!(schema instanceof z.ZodObject)) {\n throw new Error('Not a Zod object schema');\n }\n\n const indentString = ' '.repeat(indent);\n\n const shape = schema.shape;\n const entries = Object.entries(shape);\n\n const reconstructed: string[] = entries.map(([key, value]) => {\n // Base type detection function\n const getBaseType = (val: z.ZodTypeAny): string => {\n if (val instanceof z.ZodString) {\n return 'z.string()';\n }\n if (val instanceof z.ZodNumber) {\n return 'z.number()';\n }\n if (val instanceof z.ZodBoolean) {\n return 'z.boolean()';\n }\n if (val instanceof z.ZodArray) {\n const elementType = val.element;\n if (elementType instanceof z.ZodObject) {\n return `z.array(${prettyPrintZodSchema(elementType)})`;\n } else {\n return `z.array(${getBaseType(elementType)})`;\n }\n }\n if (val instanceof z.ZodObject) {\n return prettyPrintZodSchema(val);\n }\n if (val instanceof z.ZodEnum) {\n // Try to extract enum values\n const enumValues = (val as any)._def?.values;\n if (Array.isArray(enumValues)) {\n return `z.enum([${enumValues.map(v => `'${v}'`).join(', ')}])`;\n }\n return 'z.enum([...])';\n }\n if (val instanceof z.ZodLiteral) {\n const literalValue = (val as any)._def?.value;\n if (typeof literalValue === 'string') {\n return `z.literal('${literalValue}')`;\n }\n return `z.literal(${literalValue})`;\n }\n if (val instanceof z.ZodUnion) {\n const options = (val as any)._def?.options;\n if (Array.isArray(options)) {\n return `z.union([${options.map(getBaseType).join(', ')}])`;\n }\n return 'z.union([...])';\n }\n if (val instanceof z.ZodDate) {\n return 'z.date()';\n }\n if (val instanceof z.ZodRecord) {\n const keyType = (val as any)._def?.keyType;\n const valueType = (val as any)._def?.valueType;\n\n let keyTypeStr = 'z.string()';\n if (keyType && keyType !== z.string()) {\n keyTypeStr = getBaseType(keyType);\n }\n\n let valueTypeStr = 'z.any()';\n if (valueType) {\n valueTypeStr = getBaseType(valueType);\n }\n\n return `z.record(${keyTypeStr}, ${valueTypeStr})`;\n }\n if (val instanceof z.ZodMap) {\n const keyType = (val as any)._def?.keyType;\n const valueType = (val as any)._def?.valueType;\n\n let keyTypeStr = 'z.any()';\n if (keyType) {\n keyTypeStr = getBaseType(keyType);\n }\n\n let valueTypeStr = 'z.any()';\n if (valueType) {\n valueTypeStr = getBaseType(valueType);\n }\n\n return `z.map(${keyTypeStr}, ${valueTypeStr})`;\n }\n if (val instanceof z.ZodTuple) {\n const items = (val as any)._def?.items;\n\n if (Array.isArray(items)) {\n const itemsTypeStr = items.map(item => getBaseType(item)).join(', ');\n return `z.tuple([${itemsTypeStr}])`;\n }\n return 'z.tuple([])';\n }\n if (val instanceof z.ZodNullable) {\n return `${getBaseType((val as any)._def.innerType)}.nullable()`;\n }\n if (val instanceof z.ZodOptional) {\n return `${getBaseType((val as any)._def.innerType)}.optional()`;\n }\n // Add more type checks as needed\n return 'z.any()';\n };\n\n // Check for modifiers and description\n const applyModifiers = (val: z.ZodTypeAny, baseType: string): string => {\n let result = baseType;\n let currentVal = val;\n\n // Check for .nullable() modifier\n if (currentVal instanceof z.ZodNullable) {\n result = `${getBaseType((currentVal as any)._def.innerType)}.nullable()`;\n currentVal = (currentVal as any)._def.innerType;\n }\n\n // Check for .optional() modifier\n if (currentVal instanceof z.ZodOptional) {\n if (!result.endsWith('.nullable()')) {\n result = `${getBaseType((currentVal as any)._def.innerType)}.optional()`;\n }\n currentVal = (currentVal as any)._def.innerType;\n }\n\n // Check for description\n const description = (val as any)?._def?.description;\n if (typeof description === 'string') {\n result += `.describe('${description.replace(/'/g, \"\\\\'\")}')`;\n }\n\n return result;\n };\n\n const baseType = getBaseType(value as z.ZodTypeAny);\n const finalType = applyModifiers(value as z.ZodTypeAny, baseType);\n\n return `${indentString}${key}: ${finalType},`;\n });\n\n return `z.object({\\n${reconstructed.join('\\n')}\\n})`;\n};\n\n\n// copied from https://github.com/browserbase/stagehand/blob/main/lib/llm/LLMProvider.ts#L62\n// We should either keep this in sync or replace with a simple heuristic, such as\n// if model name starts with `gpt` or `gemini` or `claude`.\nexport const modelToProviderMap: Record<string, string> = {\n \"gpt-4.1\": \"openai\",\n \"gpt-4.1-mini\": \"openai\",\n \"gpt-4.1-nano\": \"openai\",\n \"o4-mini\": \"openai\",\n //prettier-ignore\n \"o3\": \"openai\",\n \"o3-mini\": \"openai\",\n //prettier-ignore\n \"o1\": \"openai\",\n \"o1-mini\": \"openai\",\n \"gpt-4o\": \"openai\",\n \"gpt-4o-mini\": \"openai\",\n \"gpt-4o-2024-08-06\": \"openai\",\n \"gpt-4.5-preview\": \"openai\",\n \"o1-preview\": \"openai\",\n \"claude-3-5-sonnet-latest\": \"anthropic\",\n \"claude-3-5-sonnet-20240620\": \"anthropic\",\n \"claude-3-5-sonnet-20241022\": \"anthropic\",\n \"claude-3-7-sonnet-20250219\": \"anthropic\",\n \"claude-3-7-sonnet-latest\": \"anthropic\",\n \"cerebras-llama-3.3-70b\": \"cerebras\",\n \"cerebras-llama-3.1-8b\": \"cerebras\",\n \"groq-llama-3.3-70b-versatile\": \"groq\",\n \"groq-llama-3.3-70b-specdec\": \"groq\",\n \"gemini-1.5-flash\": \"google\",\n \"gemini-1.5-pro\": \"google\",\n \"gemini-1.5-flash-8b\": \"google\",\n \"gemini-2.0-flash-lite\": \"google\",\n \"gemini-2.0-flash\": \"google\",\n \"gemini-2.5-flash-preview-04-17\": \"google\",\n \"gemini-2.5-pro-preview-03-25\": \"google\",\n};\n","import type * as StagehandLib from \"@browserbasehq/stagehand\";\nimport { ActOptions, LLMClient, Page as StagehandPage } from \"@browserbasehq/stagehand\";\nimport { diag, Span, trace } from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\nimport { z } from \"zod\";\n\nimport { version as SDK_VERSION } from \"../../package.json\";\nimport { observe as laminarObserve } from \"../decorators\";\nimport { Laminar } from \"../laminar\";\nimport { SPAN_TYPE } from \"../opentelemetry-lib/tracing/attributes\";\nimport { PlaywrightInstrumentation } from \"./playwright\";\nimport {\n cleanStagehandLLMClient,\n modelToProviderMap,\n nameArgsOrCopy,\n prettyPrintZodSchema,\n} from \"./utils\";\n\ninterface GlobalLLMClientOptions {\n // named `type` in Stagehand\n provider: \"openai\" | \"anthropic\" | \"cerebras\" | \"groq\" | (string & {})\n model: string\n}\n\ntype AgentClient = {\n execute: (\n instructionOrOptions: string | StagehandLib.AgentExecuteOptions,\n ) => Promise<StagehandLib.AgentResult>;\n};\n\n/* eslint-disable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return\n*/\nexport class StagehandInstrumentation extends InstrumentationBase {\n private playwrightInstrumentation: PlaywrightInstrumentation;\n private _parentSpan: Span | undefined;\n private globalLLMClientOptions: GlobalLLMClientOptions | undefined;\n private globalAgentOptions: StagehandLib.AgentConfig | undefined;\n\n constructor(playwrightInstrumentation: PlaywrightInstrumentation) {\n super(\n \"@lmnr/browserbase-stagehand-instrumentation\",\n SDK_VERSION,\n {\n enabled: true,\n },\n );\n this.playwrightInstrumentation = playwrightInstrumentation;\n }\n\n protected init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(\n \"@browserbasehq/stagehand\",\n ['>=1.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return module;\n }\n\n private patch(moduleExports: typeof StagehandLib, moduleVersion?: string) {\n diag.debug(`patching stagehand ${moduleVersion}`);\n // Check if Stagehand is non-configurable\n const descriptor = Object.getOwnPropertyDescriptor(moduleExports, 'Stagehand');\n if (descriptor && !descriptor.configurable) {\n // Create a proxy for the entire module exports\n const originalStagehand = moduleExports.Stagehand;\n const patchedConstructor = this.patchStagehandConstructor()(originalStagehand);\n\n // Create a proxy for the module exports\n return new Proxy(moduleExports, {\n get: (target, prop) => {\n if (prop === 'Stagehand') {\n return patchedConstructor;\n }\n return target[prop as keyof typeof target];\n },\n });\n } else {\n // If it's configurable, use the standard _wrap method\n this._wrap(\n moduleExports,\n 'Stagehand',\n this.patchStagehandConstructor(),\n );\n\n return moduleExports;\n }\n }\n\n public manuallyInstrument(Stagehand: typeof StagehandLib.Stagehand) {\n diag.debug('manually instrumenting stagehand');\n\n // Since we can't replace the Stagehand constructor directly due to non-configurable property,\n // we'll patch the prototype methods of the existing constructor\n\n // First, patch the init method on the prototype\n if (Stagehand && Stagehand.prototype) {\n this._wrap(\n Stagehand.prototype,\n 'init',\n this.patchStagehandInit(),\n );\n this._wrap(\n Stagehand.prototype,\n 'close',\n this.patchStagehandClose(),\n );\n }\n }\n\n private unpatch(moduleExports: typeof StagehandLib, moduleVersion?: string) {\n diag.debug(`unpatching stagehand ${moduleVersion}`);\n this._unwrap(moduleExports, 'Stagehand');\n\n if (moduleExports.Stagehand) {\n this._unwrap(moduleExports.Stagehand.prototype, 'init');\n this._unwrap(moduleExports.Stagehand.prototype, 'close');\n if (moduleExports.Stagehand.prototype?.page) {\n this._unwrap(moduleExports.Stagehand.prototype.page, 'act');\n this._unwrap(moduleExports.Stagehand.prototype.page, 'extract');\n this._unwrap(moduleExports.Stagehand.prototype.page, 'observe');\n const observeHandler = (moduleExports.Stagehand.prototype.page as any).observeHandler;\n if (observeHandler) {\n this._unwrap(observeHandler, 'observe');\n }\n const extractHandler = (moduleExports.Stagehand.prototype.page as any).extractHandler;\n if (extractHandler) {\n this._unwrap(extractHandler, 'textExtract');\n this._unwrap(extractHandler, 'domExtract');\n }\n const actHandler = (moduleExports.Stagehand.prototype.page as any).actHandler;\n if (actHandler) {\n this._unwrap(actHandler, 'act');\n }\n }\n }\n\n return moduleExports;\n }\n\n private patchStagehandConstructor() {\n const instrumentation = this;\n\n return (Original: typeof StagehandLib.Stagehand) => {\n // Create a constructor function that maintains the same signature\n const Stagehand = function (this: InstanceType<typeof Original>, ...args: any[]) {\n // Only apply if this is a new instance\n if (!(this instanceof Stagehand)) {\n return new (Stagehand as any)(...args);\n }\n\n const instance = new Original(args.length > 0 ? args[0] : undefined);\n Object.assign(this, instance);\n\n instrumentation._wrap(\n this,\n 'init',\n instrumentation.patchStagehandInit(),\n );\n\n instrumentation._wrap(\n this,\n 'close',\n instrumentation.patchStagehandClose(),\n );\n\n return this;\n } as unknown as typeof Original;\n\n // Copy static properties\n Object.setPrototypeOf(Stagehand, Original);\n // Copy prototype properties\n Stagehand.prototype = Object.create(Original.prototype);\n Stagehand.prototype.constructor = Stagehand;\n\n return Stagehand;\n };\n }\n\n private patchStagehandInit() {\n const instrumentation = this;\n\n return (original: Function) => async function method(this: any, ...args: any[]) {\n // Make sure the parent span is set before calling the original init method\n // so that playwright instrumentation does not set its default parent span\n instrumentation._parentSpan = Laminar.startSpan({\n name: 'Stagehand',\n });\n instrumentation.playwrightInstrumentation.setParentSpan(instrumentation._parentSpan);\n\n const result = await original.bind(this).apply(this, args);\n\n await instrumentation.playwrightInstrumentation.patchPage(this.page);\n\n instrumentation._wrap(\n this,\n 'agent',\n instrumentation.patchStagehandAgentInitializer(),\n );\n\n instrumentation.patchStagehandPage(this.stagehandPage);\n instrumentation.globalLLMClientOptions = {\n provider: this.llmClient.type,\n model: this.llmClient.modelName,\n };\n instrumentation._wrap(\n this.llmClient,\n 'createChatCompletion',\n instrumentation.patchStagehandLLMClientCreateChatCompletion(),\n );\n return result;\n };\n }\n\n private patchStagehandClose() {\n const instrumentation = this;\n return (original: Function) => async function method(this: any, ...args: any[]) {\n if (instrumentation._parentSpan && instrumentation._parentSpan.isRecording()) {\n instrumentation._parentSpan.end();\n }\n await original.bind(this).apply(this, args);\n };\n }\n\n private patchStagehandPage(page: StagehandPage) {\n const actHandler = (page as any).actHandler;\n if (actHandler) {\n if (actHandler.act) {\n this._wrap(\n actHandler,\n 'act',\n this.patchStagehandV1ActHandlerAct(),\n );\n }\n if (actHandler.actFromObserveResult) {\n this._wrap(\n actHandler,\n 'actFromObserveResult',\n this.patchStagehandV2ActHandlerActFromObserveResult(),\n );\n }\n if (actHandler.observeAct) {\n this._wrap(\n actHandler,\n 'observeAct',\n this.patchStagehandV2ActHandlerObserveAct(),\n );\n }\n }\n\n const observeHandler = (page as any).observeHandler;\n if (observeHandler) {\n this._wrap(\n observeHandler,\n 'observe',\n this.patchStagehandObserveHandler(),\n );\n }\n\n const extractHandler = (page as any).extractHandler;\n if (extractHandler) {\n if (extractHandler.textExtract) {\n this._wrap(\n extractHandler,\n 'textExtract',\n this.patchStagehandExtractHandlerTextExtract(),\n );\n }\n\n if (extractHandler.domExtract) {\n this._wrap(\n extractHandler,\n 'domExtract',\n this.patchStagehandExtractHandlerDomExtract(),\n );\n }\n }\n\n this._wrap(\n page,\n 'act',\n this.patchStagehandGlobalMethod('act'),\n );\n\n this._wrap(\n page,\n 'extract',\n this.patchStagehandGlobalMethod('extract'),\n );\n\n this._wrap(\n page,\n 'observe',\n this.patchStagehandGlobalMethod('observe'),\n );\n }\n\n private patchStagehandGlobalMethod(methodName: string) {\n const instrumentation = this;\n return (original: (...args: any[]) => Promise<any>) =>\n async function method(this: any, ...args: any[]) {\n const input = nameArgsOrCopy(args);\n if (methodName === \"extract\"\n && Array.isArray(input)\n && input.length > 0 && (input[0])?.schema\n ) {\n // We need to clone the input object to avoid mutating the original object\n // because the original object is passed to the LLM client\n const { schema, ...rest } = input[0];\n let prettySchema = schema?.shape;\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n input[0] = { ...rest, schema: prettySchema };\n }\n return await Laminar.withSpan(instrumentation._parentSpan!, async () =>\n await laminarObserve(\n {\n name: `stagehand.${methodName}`,\n input,\n },\n async (thisArg, ...rest) => await original.apply(thisArg, ...rest),\n this, args,\n ),\n );\n };\n }\n\n private patchStagehandV1ActHandlerAct() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function act(this: any, ...args: any[]) {\n return await laminarObserve(\n {\n name: 'stagehand.actHandler.act',\n input: {\n action: args[0].action,\n llmClient: cleanStagehandLLMClient(args[0].llmClient ?? {}),\n chunksSeen: args[0].chunksSeen,\n steps: args[0].steps,\n requestId: args[0].requestId,\n schema: args[0].schema,\n retries: args[0].retries,\n variables: args[0].variables,\n previousSelectors: args[0].previousSelectors,\n skipActionCacheForThisStep: args[0].skipActionCacheForThisStep,\n domSettleTimeoutMs: args[0].domSettleTimeoutMs,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandV2ActHandlerActFromObserveResult() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function act(this: any, ...args: any[]) {\n return await laminarObserve(\n {\n name: 'stagehand.actHandler.actFromObserveResult',\n input: {\n observe: args?.[0] ?? null,\n domSettleTimeoutMs: args?.[1] ?? null,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandV2ActHandlerObserveAct() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function act(this: any, ...args: any[]) {\n const actOptions = args?.[0] as ActOptions | undefined;\n const llmClient = args.filter((arg) =>\n Object.keys(arg).includes('modelName'),\n )[0] as LLMClient | undefined;\n const requestId = typeof args?.[3] === 'string' ? args?.[3] : null;\n return await laminarObserve(\n {\n name: 'stagehand.actHandler.observeAct',\n input: {\n action: actOptions?.action,\n modelName: actOptions?.modelName,\n variables: actOptions?.variables,\n domSettleTimeoutMs: actOptions?.domSettleTimeoutMs,\n timeoutMs: actOptions?.timeoutMs,\n llmClient: cleanStagehandLLMClient(llmClient ?? {}),\n requestId: requestId,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandExtractHandlerTextExtract() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function textExtract(this: any, ...args: any[]) {\n const schema = (args[0].schema as z.AnyZodObject);\n let prettySchema = schema?.shape;\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n return await laminarObserve(\n {\n name: 'stagehand.extractHandler.textExtract',\n input: {\n instruction: args[0].instruction,\n llmClient: cleanStagehandLLMClient(args[0].llmClient ?? {}),\n requestId: args[0].requestId,\n schema: prettySchema,\n content: args[0].content,\n domSettleTimeoutMs: args[0].domSettleTimeoutMs,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandExtractHandlerDomExtract() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function domExtract(this: any, ...args: any[]) {\n const schema = (args[0].schema as z.AnyZodObject);\n let prettySchema = schema?.shape;\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n\n return await laminarObserve(\n {\n name: 'stagehand.extractHandler.domExtract',\n input: {\n instruction: args[0].instruction,\n llmClient: cleanStagehandLLMClient(args[0].llmClient ?? {}),\n requestId: args[0].requestId,\n schema: prettySchema,\n content: args[0].content,\n chunksSeen: args[0].chunksSeen,\n domSettleTimeoutMs: args[0].domSettleTimeoutMs,\n },\n },\n async () => await original.apply(this, args),\n );\n };\n }\n\n private patchStagehandObserveHandler() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function observe(this: any, ...args: any[]) {\n\n return await laminarObserve(\n {\n name: 'stagehand.observeHandler.observe',\n input: {\n instruction: args[0].instruction,\n llmClient: cleanStagehandLLMClient(args[0].llmClient ?? {}),\n requestId: args[0].requestId,\n returnAction: args[0].returnAction,\n onlyVisible: args[0].onlyVisible,\n drawOverlay: args[0].drawOverlay,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandLLMClientCreateChatCompletion() {\n const instrumentation = this;\n return (original: (...args: any[]) => Promise<any>) =>\n async function createChatCompletion(this: any, ...args: any[]) {\n const options = args[0] as StagehandLib.CreateChatCompletionOptions;\n return await laminarObserve({\n name: \"createChatCompletion\",\n // input and output are set as gen_ai.prompt and gen_ai.completion\n ignoreInput: true,\n ignoreOutput: true,\n }, async () => {\n const span = trace.getActiveSpan()!;\n const innerOptions = options.options;\n const recordedProvider = instrumentation.globalLLMClientOptions?.provider;\n const provider = (\n recordedProvider === \"aisdk\"\n && instrumentation.globalLLMClientOptions?.model\n )\n ? (modelToProviderMap[instrumentation.globalLLMClientOptions.model] ?? \"aisdk\")\n : recordedProvider;\n span.setAttributes({\n [SPAN_TYPE]: \"LLM\",\n ...(innerOptions.temperature ? {\n \"gen_ai.request.temperature\": innerOptions.temperature,\n } : {}),\n ...(innerOptions.top_p ? {\n \"gen_ai.request.top_p\": innerOptions.top_p,\n } : {}),\n ...(innerOptions.frequency_penalty ? {\n \"gen_ai.request.frequency_penalty\": innerOptions.frequency_penalty,\n } : {}),\n ...(innerOptions.presence_penalty ? {\n \"gen_ai.request.presence_penalty\": innerOptions.presence_penalty,\n } : {}),\n ...(innerOptions.maxTokens !== undefined ? {\n \"gen_ai.request.max_tokens\": innerOptions.maxTokens,\n } : {}),\n ...(instrumentation.globalLLMClientOptions ? {\n \"gen_ai.request.model\": instrumentation.globalLLMClientOptions.model,\n \"gen_ai.system\": provider,\n } : {}),\n });\n innerOptions.messages?.forEach((message, index) => {\n span.setAttributes({\n [`gen_ai.prompt.${index}.role`]: message.role,\n [`gen_ai.prompt.${index}.content`]: JSON.stringify(message.content),\n });\n });\n innerOptions.tools?.forEach((tool, index) => {\n span.setAttributes({\n [`llm.request.functions.${index}.name`]: tool.name,\n [`llm.request.functions.${index}.description`]: tool.description,\n [`llm.request.functions.${index}.parameters`]: JSON.stringify(tool.parameters),\n });\n });\n\n const result = await original.bind(this).apply(this, args) as StagehandLib.LLMResponse;\n span.setAttributes({\n \"gen_ai.response.model\": result.model,\n \"gen_ai.usage.input_tokens\": result.usage.prompt_tokens,\n \"gen_ai.usage.output_tokens\": result.usage.completion_tokens,\n \"llm.usage.total_tokens\": result.usage.total_tokens,\n });\n\n result.choices?.forEach(choice => {\n const index = choice.index;\n span.setAttributes({\n [`gen_ai.completion.${index}.finish_reason`]: choice.finish_reason,\n [`gen_ai.completion.${index}.role`]: choice.message.role,\n });\n if (choice.message.content) {\n span.setAttribute(\n `gen_ai.completion.${index}.content`,\n JSON.stringify(choice.message.content),\n );\n }\n choice.message.tool_calls?.forEach((toolCall, toolCallIndex) => {\n span.setAttributes({\n [`gen_ai.completion.${index}.message.tool_calls.${toolCallIndex}.id`]: toolCall.id,\n [`gen_ai.completion.${index}.message.tool_calls.${toolCallIndex}.name`]:\n toolCall.function.name,\n [`gen_ai.completion.${index}.message.tool_calls.${toolCallIndex}.arguments`]:\n JSON.stringify(toolCall.function.arguments),\n });\n });\n });\n\n if (!result.choices || result.choices.length === 0) {\n const data = (result as any).data;\n if (data) {\n span.setAttributes({\n \"gen_ai.completion.0.role\": \"assistant\",\n \"gen_ai.completion.0.content\": typeof data === \"string\"\n ? data\n : JSON.stringify(data),\n });\n }\n }\n\n return result;\n });\n };\n }\n\n private patchStagehandAgentInitializer() {\n const instrumentation = this;\n return (original: (...args: any[]) => any) =>\n function agent(this: any, ...args: any[]) {\n if (args.length > 0 && typeof args[0] === 'object') {\n instrumentation.globalAgentOptions = args[0];\n }\n const agent = original.bind(this).apply(this, args);\n instrumentation.patchStagehandAgent(agent);\n return agent;\n };\n }\n\n private patchStagehandAgent(agent: AgentClient) {\n this._wrap(\n agent,\n 'execute',\n this.patchStagehandAgentExecute(),\n );\n }\n\n private patchStagehandAgentExecute() {\n const instrumentation = this;\n return (original: (this: any, ...args: any[]) => Promise<any>) =>\n async function execute(this: any, ...args: any[]) {\n const input = nameArgsOrCopy(args);\n\n return await Laminar.withSpan(instrumentation._parentSpan!, async () =>\n await laminarObserve(\n {\n name: 'stagehand.agent.execute',\n input,\n },\n async () => await laminarObserve(\n {\n name: 'execute',\n // input and output are set as gen_ai.prompt and gen_ai.completion\n ignoreInput: true,\n ignoreOutput: true,\n spanType: \"LLM\",\n },\n async () => {\n const span = trace.getActiveSpan()!;\n const provider = instrumentation.globalAgentOptions?.provider\n ?? instrumentation.globalLLMClientOptions?.provider;\n const model = instrumentation.globalAgentOptions?.model\n ?? instrumentation.globalLLMClientOptions?.model;\n span.setAttributes({\n ...(provider ? { \"gen_ai.system\": provider } : {}),\n ...(model ? { \"gen_ai.request.model\": model } : {}),\n });\n\n let promptIndex = 0;\n if (instrumentation.globalAgentOptions?.instructions) {\n span.setAttributes({\n \"gen_ai.prompt.0.content\": instrumentation.globalAgentOptions.instructions,\n \"gen_ai.prompt.0.role\": \"system\",\n });\n promptIndex++;\n }\n\n const instruction = typeof input === 'string' ? input : (input as any).instruction;\n if (instruction) {\n span.setAttributes({\n [`gen_ai.prompt.${promptIndex}.content`]: instruction,\n [`gen_ai.prompt.${promptIndex}.role`]: \"user\",\n });\n }\n\n const result: StagehandLib.AgentResult = await original\n .bind(this)\n .apply(this, args);\n\n if (result.completed && result.success && result.message) {\n const content = [{ type: \"text\", text: result.message }];\n if (result.actions && result.actions.length > 0) {\n content.push({\n type: \"text\",\n text: JSON.stringify({ actions: result.actions }),\n });\n }\n span.setAttributes({\n \"gen_ai.completion.0.content\": JSON.stringify(content),\n \"gen_ai.completion.0.role\": \"assistant\",\n });\n } else if (result.completed && !result.success) {\n span.recordException(new Error(result.message));\n }\n if (result.usage) {\n span.setAttributes({\n \"gen_ai.usage.input_tokens\": result.usage.input_tokens,\n \"gen_ai.usage.output_tokens\": result.usage.output_tokens,\n \"llm.usage.total_tokens\":\n result.usage.input_tokens + result.usage.output_tokens,\n });\n }\n return result;\n },\n ),\n ),\n );\n };\n }\n}\n/* eslint-enable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return\n*/\n","import { diag, Span, trace } from '@opentelemetry/api';\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\nimport { existsSync } from 'fs';\nimport { readFile } from \"fs/promises\";\nimport path from \"path\";\nimport type * as PuppeteerLib from \"puppeteer\";\nimport type { Browser, BrowserContext, Page } from 'puppeteer';\nimport type * as PuppeteerCoreLib from \"puppeteer-core\";\n\nimport { version as SDK_VERSION } from \"../../package.json\";\nimport { LaminarClient } from '../client';\nimport { observe } from '../decorators';\nimport { Laminar } from '../laminar';\nimport { TRACE_HAS_BROWSER_SESSION } from '../opentelemetry-lib/tracing/attributes';\nimport { getDirname, initializeLogger, newUUID, NIL_UUID, StringUUID } from '../utils';\nimport { collectAndSendPageEvents } from \"./utils\";\n\nconst logger = initializeLogger();\n\nconst RRWEB_SCRIPT_PATH = (() => {\n const fileName = 'rrweb.umd.min.cjs';\n const standardPath = path.join(getDirname(), '..', 'assets', 'rrweb', fileName);\n // Fallback paths for different environments and tests\n const fallbackPaths = [\n path.join(getDirname(), '..', '..', 'assets', 'rrweb', fileName), // For tests\n path.join(process.cwd(), 'assets', 'rrweb', fileName), // Using cwd\n path.join(process.cwd(), '@lmnr-ai/lmnr', 'assets', 'rrweb', fileName), // Absolute path\n ];\n\n try {\n if (existsSync(standardPath)) {\n return standardPath;\n }\n\n for (const fallbackPath of fallbackPaths) {\n if (existsSync(fallbackPath)) {\n return fallbackPath;\n }\n }\n\n // If no path exists, return the standard path and let it fail with a clear error\n return standardPath;\n } catch {\n // In case fs.existsSync fails, return the standard path\n return standardPath;\n }\n})();\n\n/* eslint-disable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return\n*/\nexport class PuppeteerInstrumentation extends InstrumentationBase {\n private _patchedBrowsers: Set<Browser> = new Set();\n private _patchedContexts: Set<BrowserContext> = new Set();\n private _patchedPages: Set<Page> = new Set();\n private _parentSpan: Span | undefined;\n private _client: LaminarClient;\n\n constructor(client: LaminarClient) {\n super(\n \"@lmnr/puppeteer-instrumentation\",\n SDK_VERSION,\n {\n enabled: true,\n },\n );\n this._parentSpan = undefined;\n this._client = client;\n }\n\n // It's the caller's responsibility to ensure the span is ended\n public setParentSpan(span: Span) {\n this._parentSpan = span;\n }\n\n protected init(): InstrumentationModuleDefinition[] {\n const puppeteerInstrumentation = new InstrumentationNodeModuleDefinition(\n \"puppeteer\",\n // About two years before first writing this instrumentation\n // and apparently no big breaking changes afterwards\n // https://github.com/puppeteer/puppeteer/releases\n ['>=19.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n const puppeteerCoreInstrumentation = new InstrumentationNodeModuleDefinition(\n \"puppeteer-core\",\n ['>=19.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return [puppeteerInstrumentation, puppeteerCoreInstrumentation];\n }\n\n public manuallyInstrument(puppeteerModule: typeof PuppeteerLib | typeof PuppeteerCoreLib) {\n this._wrap(\n puppeteerModule,\n 'launch',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n puppeteerModule,\n 'connect',\n this.patchNewBrowser(),\n );\n\n return puppeteerModule;\n }\n\n private patch(\n moduleExports: typeof PuppeteerLib | typeof PuppeteerCoreLib,\n moduleVersion?: string,\n ) {\n diag.debug(`patching puppeteer ${moduleVersion}`);\n this._wrap(\n moduleExports,\n `launch`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports.PuppeteerNode.prototype,\n `launch`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports,\n `connect`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports.Puppeteer.prototype,\n `connect`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports.default,\n `launch`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports.default,\n `connect`,\n this.patchNewBrowser(),\n );\n\n return moduleExports;\n }\n\n private unpatch(moduleExports: typeof PuppeteerLib, moduleVersion?: string) {\n diag.debug(`unpatching puppeteer ${moduleVersion}`);\n this._unwrap(\n moduleExports,\n `launch`,\n );\n\n this._unwrap(\n moduleExports,\n `connect`,\n );\n\n this._unwrap(\n moduleExports.PuppeteerNode.prototype,\n `launch`,\n );\n\n this._unwrap(\n moduleExports.Puppeteer.prototype,\n `connect`,\n );\n\n this._unwrap(\n moduleExports.default,\n `connect`,\n );\n\n this._unwrap(\n moduleExports.default,\n `launch`,\n );\n }\n\n private patchNewBrowser() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: any[]) {\n const browser: Browser = await original.call(this, ...args);\n if (!plugin._parentSpan) {\n plugin._parentSpan = Laminar.startSpan({\n name: 'puppeteer',\n });\n }\n\n for (const context of browser.browserContexts()) {\n plugin._wrap(\n context,\n 'newPage',\n plugin.patchBrowserContextNewPage(),\n );\n await Promise.all((await context.pages()).map(page => plugin.patchPage(page)));\n context.on('targetcreated', (target) => {\n target.page().then(page => {\n if (page) {\n plugin.patchPage(page).catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }\n })\n .catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n plugin._patchedContexts.add(context);\n }\n\n plugin._wrap(\n browser,\n 'createBrowserContext',\n plugin.patchBrowserNewContext(),\n );\n\n plugin._wrap(\n browser,\n 'newPage',\n plugin.patchBrowserNewPage(),\n );\n\n plugin._wrap(\n browser,\n 'close',\n plugin.patchBrowserClose(),\n );\n\n plugin._patchedBrowsers.add(browser);\n return browser;\n };\n }\n\n private patchBrowserClose() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: unknown[]) {\n await original.call(this, ...args);\n if (plugin._parentSpan?.isRecording()) {\n plugin._parentSpan?.end();\n }\n };\n }\n\n private patchBrowserNewContext() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: unknown[]) {\n const context: BrowserContext = await original.bind(this).apply(this, args);\n if (!plugin._parentSpan) {\n plugin._parentSpan = Laminar.startSpan({\n name: 'puppeteer',\n });\n }\n // Patch pages that are created manually from Puppeteer\n plugin._wrap(\n context,\n 'newPage',\n plugin.patchBrowserContextNewPage(),\n );\n plugin._wrap(\n context,\n 'close',\n plugin.patchBrowserContextClose(),\n );\n // Patch pages created by browser, e.g. new tab\n context.on('targetcreated', (target) => {\n target.page().then(page => {\n if (page) {\n plugin.patchPage(page).catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }\n })\n .catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n context.on('targetchanged', (target) => {\n target.page().then(page => {\n if (page) {\n plugin.patchPage(page).catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }\n })\n .catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n\n // Patch pages that are already created\n for (const page of await context.pages()) {\n await plugin.patchPage(page);\n }\n\n plugin._patchedContexts.add(context);\n return context;\n };\n }\n\n private patchBrowserContextClose() {\n const plugin = this;\n return (original: Function) => async function method(this: BrowserContext, ...args: unknown[]) {\n await original.bind(this).apply(this, args);\n if (plugin._parentSpan?.isRecording()) {\n plugin._parentSpan.end();\n }\n };\n }\n\n private patchBrowserNewPage() {\n return (original: Function) => async function method(this: Browser, ...args: unknown[]) {\n const page = await original.bind(this).apply(this, args);\n if (!page) {\n return null;\n }\n // TODO: investigate why this creates a separate empty span and no events\n // await plugin.patchPage(page);\n return page;\n };\n }\n\n public patchBrowserContextNewPage() {\n const plugin = this;\n return (original: Function) => async function method(this: BrowserContext, ...args: unknown[]) {\n const page = await original.bind(this).apply(this, args);\n if (!plugin._parentSpan) {\n plugin._parentSpan = Laminar.startSpan({\n name: 'puppeteer',\n });\n }\n if (!page) {\n return null;\n }\n\n await plugin.patchPage(page);\n\n return page;\n };\n }\n\n public async patchPage(page: Page) {\n return await Laminar.withSpan(this._parentSpan!, async () => {\n await observe({ name: 'puppeteer.page' }, async () => {\n await this._patchPage(page);\n });\n });\n }\n\n private async _patchPage(page: Page) {\n page.on(\"domcontentloaded\", () => {\n this.injectRrweb(page).catch(error => {\n logger.error(\"Failed to inject rrweb: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n\n const originalBringToFront = page.bringToFront.bind(page);\n page.bringToFront = async () => {\n await originalBringToFront();\n await page.evaluate(() => {\n if ((window as any).lmnrRrweb) {\n try {\n (window as any).lmnrRrweb.record.takeFullSnapshot();\n } catch (error) {\n console.error(\"Failed to take full snapshot: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n });\n };\n await this.injectRrweb(page);\n this._patchedPages.add(page);\n\n trace.getActiveSpan()?.setAttribute(TRACE_HAS_BROWSER_SESSION, true);\n\n const traceId = trace.getActiveSpan()?.spanContext().traceId as StringUUID ?? NIL_UUID;\n const sessionId = newUUID();\n const interval = setInterval(() => {\n if (page.isClosed()) {\n clearInterval(interval);\n return;\n }\n collectAndSendPageEvents(this._client, page, sessionId, traceId)\n .catch(error => {\n logger.error(\"Event collection stopped: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }, 2000);\n\n page.on('close', () => {\n clearInterval(interval);\n collectAndSendPageEvents(this._client, page, sessionId, traceId).catch(error => {\n logger.error(\"Event collection stopped: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n }\n\n private async injectRrweb(page: Page) {\n // Wait for the page to be in a ready state first\n const tryRunScript = async (\n script: (...args: any[]) => Promise<any>,\n maxAttempts: number = 5,\n ) => {\n for (let i = 0; i < maxAttempts; i++) {\n try {\n return await script();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes(\"Execution context was destroyed\")) {\n logger.info(errorMessage);\n } else {\n logger.error(\"Operation \" + script.name + \" failed: \" + errorMessage);\n }\n }\n await new Promise(resolve => setTimeout(resolve, 500));\n }\n };\n\n const isRrwebPresent = await page.evaluate(() =>\n typeof (window as any).lmnrRrweb !== 'undefined',\n );\n\n // Load rrweb and set up recording\n if (!isRrwebPresent) {\n const script = await readFile(RRWEB_SCRIPT_PATH, 'utf8');\n await tryRunScript(async function injectRrweb() {\n await page.evaluate(script);\n const res = await (page).waitForFunction(\n () => 'lmnrRrweb' in window || (window as any).lmnrRrweb,\n {\n timeout: 5000,\n },\n );\n if (!res) {\n throw new Error('Failed to inject rrweb');\n }\n });\n }\n\n // Update the recording setup to include trace ID\n await tryRunScript(async function setupRrwebCollection() {\n await page.evaluate(() => {\n const HEARTBEAT_INTERVAL = 1000; // 1 second heartbeat\n\n (window as any).lmnrRrwebEventsBatch = new Set();\n\n const compressEventData = async (data: any) => {\n const jsonString = JSON.stringify(data);\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 return Array.from(new Uint8Array(compressedData));\n };\n\n (window as any).lmnrGetAndClearEvents = () => {\n const events = (window as any).lmnrRrwebEventsBatch;\n (window as any).lmnrRrwebEventsBatch = new Set();\n return Array.from(events);\n };\n\n setInterval(() => {\n (window as any).lmnrRrweb.record.addCustomEvent('heartbeat', {\n title: document.title,\n url: document.URL,\n });\n }, HEARTBEAT_INTERVAL);\n\n (window as any).lmnrRrweb.record({\n async emit(event: any) {\n // Ignore events from all tabs except the current one\n const compressedEvent = {\n ...event,\n data: await compressEventData(event.data),\n };\n (window as any).lmnrRrwebEventsBatch.add(compressedEvent);\n },\n recordCanvas: true,\n collectFonts: true,\n recordCrossOriginIframes: true,\n });\n });\n });\n };\n}\n/* eslint-enable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return\n*/\n","import { Context, context } from \"@opentelemetry/api\";\nimport {\n BatchSpanProcessor,\n ReadableSpan,\n SimpleSpanProcessor,\n Span,\n SpanExporter,\n SpanProcessor,\n} from \"@opentelemetry/sdk-trace-base\";\nimport {\n ReadableSpan as OTelV2ReadableSpan,\n Span as OTelV2Span,\n} from \"@opentelemetry/sdk-trace-base-v2\";\n\nimport { version as SDK_VERSION } from \"../../../package.json\";\nimport { otelSpanIdToUUID } from \"../../utils\";\nimport { getLangVersion } from \"../../version\";\nimport {\n ASSOCIATION_PROPERTIES,\n ASSOCIATION_PROPERTIES_OVERRIDES,\n SPAN_IDS_PATH,\n SPAN_INSTRUMENTATION_SOURCE,\n SPAN_LANGUAGE_VERSION,\n SPAN_PATH,\n SPAN_SDK_VERSION,\n} from \"./attributes\";\nimport {\n getParentSpanId,\n makeSpanOtelV2Compatible,\n} from \"./compat\";\nimport { LaminarSpanExporter } from \"./exporter\";\nimport {\n ASSOCIATION_PROPERTIES_KEY,\n getSpanPath,\n SPAN_PATH_KEY,\n} from \"./utils\";\n\ninterface LaminarSpanProcessorOptions {\n /**\n * The base URL of the Laminar API. Optional.\n * Defaults to https://api.lmnr.ai.\n */\n baseUrl?: string;\n /**\n * The port of the Laminar API. Optional.\n * Defaults to 8443.\n */\n port?: number;\n /**\n * Laminar project API key. Optional.\n * If not provided, the LMNR_PROJECT_API_KEY environment variable will be used.\n */\n apiKey?: string;\n /**\n * The maximum number of spans to export at a time. Optional.\n * Defaults to 512.\n */\n maxExportBatchSize?: number;\n /**\n * Whether to disable batching. Optional.\n * Defaults to false.\n */\n disableBatch?: boolean;\n /**\n * Whether to force HTTP and use OpenTelemetry HTTP/protobuf exporter.\n * Not recommended with Laminar backends.\n * Optional.\n * Defaults to false.\n */\n forceHttp?: boolean;\n /**\n * The timeout for sending traces data. Optional.\n * Defaults to 30 seconds.\n */\n traceExportTimeoutMillis?: number;\n\n /**\n * The exporter to use. Optional. If specified, some of the other options will be ignored.\n * Defaults to a new LaminarSpanExporter.\n */\n exporter?: SpanExporter;\n}\n\nexport class LaminarSpanProcessor implements SpanProcessor {\n private instance: BatchSpanProcessor | SimpleSpanProcessor;\n private readonly _spanIdToPath: Map<string, string[]> = new Map();\n private readonly _spanIdLists: Map<string, string[]> = new Map();\n\n /**\n * @param {object} options - The options for the Laminar span processor.\n * @param {string} options.baseUrl - The base URL of the Laminar API.\n * @param {number} options.port - The port of the Laminar API.\n * @param {string} options.apiKey - Laminar project API key or any other\n * authorization set as bearer token.\n * @param {boolean} options.disableBatch - Whether to disable batching (uses SimpleSpanProcessor).\n * @param {number} options.maxExportBatchSize - The maximum number of spans to export at a time\n * if disableBatch is false.\n * @param {number} options.traceExportTimeoutMillis - The timeout for sending traces data.\n * Defaults to 30 seconds.\n * @param {boolean} options.forceHttp - Whether to force HTTP and use OpenTelemetry\n * HTTP/protobuf exporter.\n * Not recommended with Laminar backends.\n */\n constructor(options: LaminarSpanProcessorOptions = {}) {\n const exporter = options.exporter ?? new LaminarSpanExporter(options);\n this.instance = options.disableBatch\n ? new SimpleSpanProcessor(exporter)\n : new BatchSpanProcessor(exporter, {\n maxExportBatchSize: options.maxExportBatchSize ?? 512,\n exportTimeoutMillis: options.traceExportTimeoutMillis ?? 30000,\n });\n }\n\n forceFlush(): Promise<void> {\n return this.instance.forceFlush();\n }\n\n shutdown(): Promise<void> {\n return this.instance.shutdown();\n }\n\n onStart(span: Span | OTelV2Span, parentContext: Context): void {\n const contextSpanPath = getSpanPath(parentContext ?? context.active());\n const parentSpanId = getParentSpanId(span);\n const parentSpanPath = contextSpanPath\n ?? (parentSpanId !== undefined\n ? this._spanIdToPath.get(parentSpanId)\n : undefined);\n const spanId = span.spanContext().spanId;\n const parentSpanIdsPath = parentSpanId\n ? this._spanIdLists.get(parentSpanId)\n : [];\n const spanPath = parentSpanPath ? [...parentSpanPath, span.name] : [span.name];\n\n const spanIdUuid = otelSpanIdToUUID(spanId);\n const spanIdsPath = parentSpanIdsPath ? [...parentSpanIdsPath, spanIdUuid] : [spanIdUuid];\n\n span.setAttribute(SPAN_IDS_PATH, spanIdsPath);\n this._spanIdLists.set(spanId, spanIdsPath);\n\n span.setAttribute(SPAN_PATH, spanPath);\n context.active().setValue(SPAN_PATH_KEY, spanPath);\n this._spanIdToPath.set(spanId, spanPath);\n\n span.setAttribute(SPAN_INSTRUMENTATION_SOURCE, \"javascript\");\n span.setAttribute(SPAN_SDK_VERSION, SDK_VERSION);\n const langVersion = getLangVersion();\n if (langVersion) {\n span.setAttribute(SPAN_LANGUAGE_VERSION, langVersion);\n }\n\n // This sets the properties only if the context has them\n const associationProperties = context\n .active()\n .getValue(ASSOCIATION_PROPERTIES_KEY);\n if (associationProperties) {\n for (const [key, value] of Object.entries(associationProperties)) {\n if (Object.keys(ASSOCIATION_PROPERTIES_OVERRIDES).includes(key)) {\n span.setAttribute(ASSOCIATION_PROPERTIES_OVERRIDES[key], value);\n } else if (key === \"tracing_level\") {\n span.setAttribute(\"lmnr.internal.tracing_level\", value);\n } else {\n span.setAttribute(`${ASSOCIATION_PROPERTIES}.${key}`, value);\n }\n }\n }\n\n makeSpanOtelV2Compatible(span);\n this.instance.onStart((span as Span), parentContext);\n }\n\n onEnd(span: ReadableSpan | OTelV2ReadableSpan): void {\n // By default, we call the original onEnd.\n makeSpanOtelV2Compatible(span);\n this.instance.onEnd(span as Span);\n }\n}\n","// This class could be just an initialization of the OTLP exporter,\n// but OTel v2 has some breaking changes, so we're applying\n// a small backward-compatibility fix here.\n\nimport { Metadata } from \"@grpc/grpc-js\";\nimport { ExportResult } from \"@opentelemetry/core\";\nimport {\n OTLPTraceExporter as ExporterGrpc,\n} from \"@opentelemetry/exporter-trace-otlp-grpc\";\nimport {\n OTLPTraceExporter as ExporterHttp,\n} from \"@opentelemetry/exporter-trace-otlp-proto\";\nimport { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\n\nimport { makeSpanOtelV2Compatible } from \"./compat\";\n\nexport class LaminarSpanExporter implements SpanExporter {\n private exporter: SpanExporter;\n\n constructor(options: {\n baseUrl?: string;\n port?: number;\n apiKey?: string;\n forceHttp?: boolean;\n timeoutMillis?: number;\n } = {}) {\n const url = options.baseUrl ?? process?.env?.LMNR_BASE_URL ?? 'https://api.lmnr.ai';\n const port = options.port ?? (\n url.match(/:\\d{1,5}$/g)\n ? parseInt(url.match(/:\\d{1,5}$/g)![0].slice(1))\n : (options.forceHttp ? 443 : 8443));\n const urlWithoutSlash = url.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n\n const key = options.apiKey ?? process?.env?.LMNR_PROJECT_API_KEY;\n if (key === undefined) {\n throw new Error(\n 'Please initialize the Laminar object with your project API key ' +\n 'or set the LMNR_PROJECT_API_KEY environment variable',\n );\n }\n\n if (options.forceHttp) {\n this.exporter = new ExporterHttp({\n url: `${urlWithoutSlash}:${port}/v1/traces`,\n headers: {\n 'Authorization': `Bearer ${key}`,\n },\n timeoutMillis: options.timeoutMillis ?? 30000,\n });\n } else {\n const metadata = new Metadata();\n metadata.set('authorization', `Bearer ${key}`);\n this.exporter = new ExporterGrpc({\n url: `${urlWithoutSlash}:${port}`,\n metadata,\n timeoutMillis: options.timeoutMillis ?? 30000,\n });\n }\n }\n\n export(\n items: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ) {\n // ==== //\n // OTel v2 has renamed the instrumentationLibrary field to instrumentationScope,\n // but spans may be created by older versions of the SDK that don't have that change.\n // This is a small hack to support those older spans.\n items.forEach(makeSpanOtelV2Compatible);\n // ==== //\n\n return this.exporter.export(items, resultCallback);\n }\n\n async shutdown(): Promise<void> {\n return this.exporter.shutdown();\n }\n\n async forceFlush(): Promise<void> {\n return this.exporter.forceFlush?.();\n }\n}\n\n","import { context, Span, trace } from \"@opentelemetry/api\";\nimport { suppressTracing } from \"@opentelemetry/core\";\n\nimport { LaminarSpanContext } from \"../../types\";\nimport { initializeLogger, isOtelAttributeValueType, tryToOtelSpanContext } from \"../../utils\";\nimport { getTracer, shouldSendTraces } from \".\";\nimport { SPAN_INPUT, SPAN_OUTPUT, SPAN_TYPE } from \"./attributes\";\nimport {\n ASSOCIATION_PROPERTIES_KEY,\n} from \"./utils\";\n\nconst logger = initializeLogger();\n\nexport type DecoratorConfig = {\n name: string;\n associationProperties?: { [name: string]: string };\n input?: unknown;\n ignoreInput?: boolean;\n ignoreOutput?: boolean;\n inputParameters?: unknown[];\n suppressTracing?: boolean;\n parentSpanContext?: string | LaminarSpanContext;\n};\n\nexport function observeBase<\n A extends unknown[],\n F extends (...args: A) => ReturnType<F>,\n>(\n {\n name,\n associationProperties,\n input,\n ignoreInput,\n ignoreOutput,\n inputParameters,\n suppressTracing: shouldSuppressTracing,\n parentSpanContext,\n }: DecoratorConfig,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n) {\n let entityContext = context.active();\n\n const currentAssociationProperties = entityContext.getValue(ASSOCIATION_PROPERTIES_KEY);\n\n // span type must not be passed down to the context, so remove it\n const { \"span_type\": spanType, ...rest } = associationProperties ?? {};\n if (associationProperties) {\n // TODO: Remove this once we've removed older deprecated methods, such as\n // withMetadata, withSession.\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n { ...(currentAssociationProperties ?? {}), ...rest },\n );\n }\n // ================================\n\n if (parentSpanContext) {\n const spanContext = tryToOtelSpanContext(parentSpanContext);\n entityContext = trace.setSpan(entityContext, trace.wrapSpanContext(spanContext));\n }\n\n if (shouldSuppressTracing) {\n entityContext = suppressTracing(entityContext);\n }\n\n return context.with(entityContext, () =>\n getTracer().startActiveSpan(\n name,\n {},\n entityContext,\n async (span: Span) => {\n if (spanType) {\n span.setAttribute(SPAN_TYPE, spanType);\n }\n\n if (shouldSendTraces() && !ignoreInput) {\n try {\n const spanInput = inputParameters ?? args;\n if (input !== undefined) {\n span.setAttribute(\n SPAN_INPUT,\n serialize(input),\n );\n } else if (\n spanInput.length === 1 &&\n typeof spanInput[0] === \"object\" &&\n !(spanInput[0] instanceof Map)\n ) {\n span.setAttribute(\n SPAN_INPUT,\n serialize(spanInput[0]),\n );\n } else {\n // pass an array of the arguments without names\n // Need to convert it to hashmap from argument name to value,\n // if we figure out how to do it elegantly\n span.setAttribute(\n SPAN_INPUT,\n serialize(spanInput.length > 0 ? spanInput : {}),\n );\n }\n } catch (error) {\n logger.warn(\"Failed to serialize input: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // ================================\n Object.entries(associationProperties || {}).forEach(([key, value]) => {\n if (isOtelAttributeValueType(value)) {\n span.setAttribute(key, value);\n } else {\n span.setAttribute(key, JSON.stringify(value));\n }\n });\n\n let res: unknown;\n try {\n res = fn.apply(thisArg, args);\n } catch (error) {\n span.recordException(error as Error);\n span.end();\n throw error;\n }\n\n if (res instanceof Promise) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return res.then((resolvedRes) => {\n try {\n if (shouldSendTraces() && !ignoreOutput) {\n span.setAttribute(\n SPAN_OUTPUT,\n serialize(resolvedRes),\n );\n }\n } catch (error) {\n logger.warn(\"Failed to serialize async output: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n } finally {\n span.end();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return resolvedRes;\n })\n .catch((error) => {\n span.recordException(error as Error);\n span.end();\n throw error;\n });\n }\n try {\n if (shouldSendTraces() && !ignoreOutput) {\n span.setAttribute(\n SPAN_OUTPUT,\n serialize(res),\n );\n }\n } catch (error) {\n logger.warn(\"Failed to serialize output: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n } finally {\n span.end();\n }\n\n return res;\n },\n ),\n );\n}\n\nconst normalizePayload = (payload: unknown, seen: WeakSet<any>): unknown => {\n if (payload instanceof Map) {\n return Array.from(payload.entries());\n } else if (Array.isArray(payload)) {\n return payload.map((value) => normalizePayload(value, seen));\n } else if (!payload) {\n return payload;\n } else if (typeof payload === \"object\") {\n if (seen.has(payload)) {\n return \"[Circular reference]\";\n }\n seen.add(payload);\n\n // serialize object one by one\n const output: any = {};\n Object.entries(payload as any).forEach(([key, value]) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n output[key] = normalizePayload(value, seen);\n });\n return output;\n }\n\n return payload;\n};\n\nconst serialize = (payload: unknown): string =>\n JSON.stringify(normalizePayload(payload, new WeakSet()));\n","import { trace } from \"@opentelemetry/api\";\nimport * as cliProgress from \"cli-progress\";\n\nimport { LaminarClient } from \"./client\";\nimport { EvaluationDataset, LaminarDataset } from \"./datasets\";\nimport { observe } from \"./decorators\";\nimport { Laminar } from \"./laminar\";\nimport { InitializeOptions } from \"./opentelemetry-lib/interfaces\";\nimport { SPAN_TYPE } from \"./opentelemetry-lib/tracing/attributes\";\nimport { EvaluationDatapoint } from \"./types\";\nimport {\n initializeLogger,\n newUUID,\n otelSpanIdToUUID,\n otelTraceIdToUUID,\n Semaphore,\n StringUUID,\n} from \"./utils\";\n\nconst DEFAULT_CONCURRENCY = 5;\nconst MAX_EXPORT_BATCH_SIZE = 64;\n\ndeclare global {\n // eslint-disable-next-line no-var\n var _evaluations: Evaluation<any, any, any>[] | undefined;\n // If true, then we need to set the evaluation globally without running it\n // eslint-disable-next-line no-var\n var _set_global_evaluation: boolean;\n}\n\nconst logger = initializeLogger();\n\nconst getEvaluationUrl = (projectId: string, evaluationId: string, baseUrl?: string): string => {\n let url = baseUrl ?? \"https://api.lmnr.ai\";\n if (url === \"https://api.lmnr.ai\") {\n url = \"https://www.lmnr.ai\";\n }\n url = url.replace(/\\/$/, '');\n\n if (/localhost|127\\.0\\.0\\.1/.test(url)) {\n const port = url.match(/:\\d{1,5}$/g)?.[0]?.slice(1);\n if (!port) {\n // As a best effort, we assume that the frontend is running on port 5667\n url = url + \":5667\";\n }\n }\n return `${url}/project/${projectId}/evaluations/${evaluationId}`;\n};\n\nconst getAverageScores =\n <D, T, O>(results: EvaluationDatapoint<D, T, O>[]): Record<string, number> => {\n const perScoreValues: Record<string, number[]> = {};\n for (const result of results) {\n for (const key in result.scores) {\n const score = result.scores[key];\n if (perScoreValues[key] && score !== null) {\n perScoreValues[key].push(score);\n } else {\n perScoreValues[key] = score !== null ? [score] : [];\n }\n }\n }\n\n const averageScores: Record<string, number> = {};\n for (const key in perScoreValues) {\n averageScores[key] = perScoreValues[key].reduce((a, b) => a + b, 0)\n / perScoreValues[key].length;\n }\n\n return averageScores;\n };\n\n/**\n * Configuration for the Evaluator\n */\ninterface EvaluatorConfig {\n /**\n * The number of data points to evaluate in parallel at a time. Defaults to 5.\n */\n concurrencyLimit?: number;\n /**\n * The project API key to use for the evaluation. If not provided,\n * the API key from the environment variable `LMNR_PROJECT_API_KEY` will be used.\n */\n projectApiKey?: string;\n /**\n * The base URL of the Laminar API. If not provided, the default is\n * `https://api.lmnr.ai`. Useful with self-hosted Laminar instances.\n * Do NOT include the port in the URL, use `httpPort` and `grpcPort` instead.\n */\n baseUrl?: string;\n /**\n * The HTTP port of the Laminar API. If not provided, the default is 443.\n */\n httpPort?: number;\n /**\n * The gRPC port of the Laminar API. If not provided, the default is 8443.\n */\n grpcPort?: number;\n /**\n * Object with modules to instrument. If not provided, all\n * available modules are instrumented.\n * See {@link https://docs.lmnr.ai/tracing/automatic-instrumentation}\n */\n instrumentModules?: InitializeOptions['instrumentModules'];\n /**\n * If true, then the spans will not be batched.\n */\n traceDisableBatch?: boolean;\n /**\n * Timeout for trace export. Defaults to 30_000 (30 seconds), which is over\n * the default OTLP exporter timeout of 10_000 (10 seconds).\n */\n traceExportTimeoutMillis?: number;\n /**\n * Defines default log level for SDK and all instrumentations.\n */\n logLevel?: \"debug\" | \"info\" | \"warn\" | \"error\";\n\n /**\n * Maximum number of spans to export at a time. Defaults to 64.\n */\n traceExportBatchSize?: number;\n}\n\n/**\n * Datapoint is a single data point in the evaluation. `D` is the type of the input data,\n * `T` is the type of the target data.\n */\nexport type Datapoint<D, T> = {\n /**\n * input to the executor function. Must be json serializable. Required.\n */\n data: D;\n /**\n * input to the evaluator function (alongside the executor output).\n * Must be json serializable.\n */\n target?: T;\n /**\n * metadata to the evaluator function. Must be json serializable.\n */\n metadata?: Record<string, any>;\n};\n\n/**\n * HumanEvaluator is a class to register a human evaluator.\n */\nexport class HumanEvaluator { }\n\nexport type EvaluatorFunctionReturn = number | Record<string, number>;\n\n/**\n * EvaluatorFunction is a function that takes the output of the executor and the\n * target data, and returns a score. The score can be a single number or a record\n * of string keys and number values. The latter is useful for evaluating\n * multiple criteria in one go instead of running multiple evaluators.\n */\nexport type EvaluatorFunction<O, T> = (output: O, target?: T, ...args: any[]) =>\n EvaluatorFunctionReturn | Promise<EvaluatorFunctionReturn>;\n\ninterface EvaluationConstructorProps<D, T, O> {\n /**\n * List of data points to evaluate. `data` is the input to the executor function,\n * `target` is the input to the evaluator function.\n */\n data: (Datapoint<D, T>[]) | EvaluationDataset<D, T>;\n /**\n * The executor function. Takes the data point + any additional arguments\n * and returns the output to evaluate.\n */\n executor: (data: D, ...args: any[]) => O | Promise<O>;\n /**\n * Evaluator functions and names. Each evaluator function takes the output of\n * the executor _and_ the target data, and returns a score. The score can be a\n * single number or a dict of string keys and number values. If the score is a\n * single number, it will be named after the evaluator function. Evaluator\n * function names must contain only letters, digits, hyphens, underscores,\n * or spaces.\n */\n evaluators: Record<string, EvaluatorFunction<O, T> | HumanEvaluator>;\n /**\n * Name of the evaluation. If not provided, a random name will be assigned.\n */\n name?: string;\n /**\n * Optional group id of the evaluation. Only evaluations within the same\n * group_id can be visually compared. Defaults to \"default\".\n */\n groupName?: string;\n /**\n * Optional metadata to evaluation\n */\n metadata?: Record<string, any>;\n /**\n * Optional override configurations for the evaluator.\n */\n config?: EvaluatorConfig;\n}\n\n/**\n * Reports the whole progress to the console.\n */\nclass EvaluationReporter {\n private cliProgress: cliProgress.SingleBar = new cliProgress.SingleBar(\n {},\n cliProgress.Presets.shades_classic,\n );\n private progressCounter: number = 0;\n private baseUrl: string;\n\n constructor(\n baseUrl?: string,\n ) {\n this.baseUrl = baseUrl ?? 'https://api.lmnr.ai';\n }\n\n public start({ length }: { length: number }) {\n this.cliProgress.start(length, 0);\n }\n\n public update(batchLength: number) {\n this.progressCounter += batchLength;\n this.cliProgress.update(this.progressCounter);\n }\n\n // Call either error or stop, not both\n public stopWithError(error: Error) {\n this.cliProgress.stop();\n process.stdout.write(`\\nError: ${error.message}\\n`);\n }\n\n // Call either error or stop, not both\n public stop({\n averageScores,\n projectId,\n evaluationId,\n }: { averageScores: Record<string, number>, projectId: string, evaluationId: string }) {\n this.cliProgress.stop();\n const url = getEvaluationUrl(projectId, evaluationId, this.baseUrl);\n process.stdout.write(`\\nCheck results at ${url}\\n`);\n process.stdout.write('\\nAverage scores:\\n');\n for (const key in averageScores) {\n process.stdout.write(`${key}: ${JSON.stringify(averageScores[key])}\\n`);\n }\n process.stdout.write('\\n');\n }\n}\n\nexport class Evaluation<D, T, O> {\n private isFinished: boolean = false;\n private progressReporter: EvaluationReporter;\n private data: Datapoint<D, T>[] | EvaluationDataset<D, T>;\n private executor: (data: D, ...args: any[]) => O | Promise<O>;\n private evaluators: Record<string, EvaluatorFunction<O, T> | HumanEvaluator>;\n private groupName?: string;\n private name?: string;\n private metadata?: Record<string, any>;\n private concurrencyLimit: number = DEFAULT_CONCURRENCY;\n private traceDisableBatch: boolean = false;\n private traceExportTimeoutMillis?: number;\n private traceExportBatchSize: number = MAX_EXPORT_BATCH_SIZE;\n private uploadPromises: Promise<any>[] = [];\n private client: LaminarClient;\n\n constructor({\n data, executor, evaluators, groupName, name, metadata, config,\n }: EvaluationConstructorProps<D, T, O>) {\n if (Object.keys(evaluators).length === 0) {\n throw new Error('No evaluators provided');\n }\n\n const evaluatorNameRegex = /^[\\w\\s-]+$/;\n // Validate evaluator keys\n for (const key in evaluators) {\n if (!evaluatorNameRegex.test(key)) {\n throw new Error(\n `Invalid evaluator key: \"${key}\".` +\n \"Keys must only contain letters, digits, hyphens, underscores, or spaces.\",\n );\n }\n }\n\n this.progressReporter = new EvaluationReporter(config?.baseUrl);\n this.data = data;\n this.executor = executor;\n this.evaluators = evaluators;\n this.groupName = groupName;\n this.metadata = metadata;\n this.name = name;\n\n if (Laminar.initialized()) {\n this.client = new LaminarClient({\n baseUrl: Laminar.getHttpUrl(),\n projectApiKey: Laminar.getProjectApiKey(),\n });\n if (config?.projectApiKey && config.projectApiKey !== Laminar.getProjectApiKey()) {\n logger.warn('Laminar was already initialized with a different project API key. ' +\n 'Ignoring the project API key from the evaluation config.');\n }\n return;\n }\n\n const key = config?.projectApiKey ?? process.env.LMNR_PROJECT_API_KEY;\n if (key === undefined) {\n throw new Error(\n 'Please initialize the Laminar object with your project API key ' +\n 'or set the LMNR_PROJECT_API_KEY environment variable',\n );\n }\n\n const url = config?.baseUrl ?? process?.env?.LMNR_BASE_URL ?? 'https://api.lmnr.ai';\n const httpPort = config?.httpPort ?? (\n url.match(/:\\d{1,5}$/g)\n ? parseInt(url.match(/:\\d{1,5}$/g)![0].slice(1))\n : 443);\n const urlWithoutSlash = url.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n const baseHttpUrl = `${urlWithoutSlash}:${httpPort}`;\n\n this.client = new LaminarClient({\n baseUrl: baseHttpUrl,\n projectApiKey: key,\n });\n\n if (config) {\n if (config.concurrencyLimit && config.concurrencyLimit < 1) {\n logger.warn(\n `concurrencyLimit must be greater than 0. Setting to default of ${DEFAULT_CONCURRENCY}`,\n );\n this.concurrencyLimit = DEFAULT_CONCURRENCY;\n } else {\n this.concurrencyLimit = config.concurrencyLimit ?? DEFAULT_CONCURRENCY;\n }\n this.traceDisableBatch = config.traceDisableBatch ?? false;\n this.traceExportTimeoutMillis = config.traceExportTimeoutMillis;\n this.traceExportBatchSize = config.traceExportBatchSize ?? MAX_EXPORT_BATCH_SIZE;\n }\n\n Laminar.initialize({\n projectApiKey: config?.projectApiKey,\n baseUrl: config?.baseUrl,\n httpPort: config?.httpPort,\n grpcPort: config?.grpcPort,\n instrumentModules: config?.instrumentModules,\n disableBatch: this.traceDisableBatch,\n traceExportTimeoutMillis: this.traceExportTimeoutMillis,\n maxExportBatchSize: this.traceExportBatchSize,\n });\n }\n\n public async run(): Promise<Record<string, number>> {\n if (this.isFinished) {\n throw new Error('Evaluation is already finished');\n }\n if (this.data instanceof LaminarDataset) {\n this.data.setClient(this.client);\n }\n\n this.progressReporter.start({ length: await this.getLength() });\n let resultDatapoints: EvaluationDatapoint<D, T, O>[];\n try {\n const evaluation = await this.client.evals.init(this.name, this.groupName, this.metadata);\n resultDatapoints = await this.evaluateInBatches(evaluation.id);\n const averageScores = getAverageScores(resultDatapoints);\n if (this.uploadPromises.length > 0) {\n await Promise.all(this.uploadPromises);\n }\n this.progressReporter.stop({\n averageScores,\n projectId: evaluation.projectId,\n evaluationId: evaluation.id,\n });\n this.isFinished = true;\n\n await Laminar.shutdown();\n return averageScores;\n } catch (e) {\n this.progressReporter.stopWithError(e as Error);\n this.isFinished = true;\n return {};\n }\n }\n\n public async evaluateInBatches(\n evalId: StringUUID,\n ): Promise<EvaluationDatapoint<D, T, O>[]> {\n const semaphore = new Semaphore(this.concurrencyLimit);\n const tasks: Promise<any>[] = [];\n\n const evaluateTask = async (\n datapoint: Datapoint<D, T>,\n index: number,\n ): Promise<[number, EvaluationDatapoint<D, T, O>]> => {\n try {\n const result = await this.evaluateDatapoint(evalId, datapoint, index);\n this.progressReporter.update(1);\n return [index, result];\n } finally {\n semaphore.release();\n }\n };\n\n for (let i = 0; i < await this.getLength(); i++) {\n await semaphore.acquire();\n const datapoint = Array.isArray(this.data) ? this.data[i] : await this.data.get(i);\n tasks.push(evaluateTask(datapoint, i));\n }\n const results = await Promise.all(tasks);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return results.sort((a, b) => a[0] - b[0]).map(([, result]) => result);\n }\n\n private async evaluateDatapoint(\n evalId: StringUUID,\n datapoint: Datapoint<D, T>,\n index: number,\n ): Promise<EvaluationDatapoint<D, T, O>> {\n return observe({ name: \"evaluation\", traceType: \"EVALUATION\" }, async () => {\n\n trace.getActiveSpan()!.setAttribute(SPAN_TYPE, \"EVALUATION\");\n const executorSpan = Laminar.startSpan({\n name: \"executor\",\n input: datapoint.data,\n });\n executorSpan.setAttribute(SPAN_TYPE, \"EXECUTOR\");\n const executorSpanId = otelSpanIdToUUID(executorSpan.spanContext().spanId);\n const datapointId = newUUID();\n const partialDatapoint = {\n id: datapointId,\n data: datapoint.data,\n target: datapoint.target,\n metadata: datapoint.metadata,\n traceId: otelTraceIdToUUID(trace.getActiveSpan()!.spanContext().traceId),\n executorSpanId,\n index,\n } as EvaluationDatapoint<D, T, O>;\n\n // first create the datapoint in the database and await\n await this.client.evals.saveDatapoints({\n evalId,\n datapoints: [partialDatapoint],\n groupName: this.groupName,\n });\n\n const output = await Laminar.withSpan(\n executorSpan,\n async () => await this.executor(datapoint.data),\n true,\n );\n const target = datapoint.target;\n\n let scores: Record<string, number | null> = {};\n for (const [evaluatorName, evaluator] of Object.entries(this.evaluators)) {\n const value = await observe(\n { name: evaluatorName },\n async (output: O, target?: T) => {\n if (evaluator instanceof HumanEvaluator) {\n trace.getActiveSpan()!.setAttribute(SPAN_TYPE, \"HUMAN_EVALUATOR\");\n return null;\n } else {\n trace.getActiveSpan()!.setAttribute(SPAN_TYPE, \"EVALUATOR\");\n return await evaluator(output, target);\n }\n },\n output,\n target,\n );\n\n if (evaluator instanceof HumanEvaluator) {\n scores[evaluatorName] = null;\n continue;\n }\n\n if (typeof value === 'number') {\n if (isNaN(value)) {\n throw new Error(`Evaluator ${evaluatorName} returned NaN`);\n }\n scores[evaluatorName] = value;\n } else if (value !== null) {\n scores = { ...scores, ...value };\n }\n }\n\n const resultDatapoint = {\n id: datapointId,\n executorOutput: output,\n data: datapoint.data,\n target,\n metadata: datapoint.metadata,\n scores,\n traceId: otelTraceIdToUUID(trace.getActiveSpan()!.spanContext().traceId),\n executorSpanId,\n index,\n } as EvaluationDatapoint<D, T, O>;\n\n const uploadPromise = this.client.evals.saveDatapoints({\n evalId,\n datapoints: [resultDatapoint],\n groupName: this.groupName,\n });\n this.uploadPromises.push(uploadPromise);\n\n return resultDatapoint;\n });\n }\n\n private async getLength(): Promise<number> {\n return this.data instanceof EvaluationDataset ? await this.data.size() : this.data.length;\n }\n}\n\n/**\n * If added to the file which is called through lmnr eval command, then simply\n * registers the evaluation. Otherwise, returns a promise which resolves when\n * the evaluation is finished. If the evaluation has no async logic, then it\n * will be executed synchronously.\n *\n * @param props.data List of data points to evaluate. `data` is the input to the\n * executor function, `target` is the input to the evaluator function.\n * @param props.executor The executor function. Takes the data point + any\n * additional arguments and returns the output to evaluate.\n * @param props.evaluators Map from evaluator name to evaluator function. Each\n * evaluator function takes the output of the executor and the target data, and\n * returns.\n * @param props.name Optional name of the evaluation. Used to easily identify\n * the evaluation in the group.\n * @param props.metadata Optional metadata to evaluation\n * @param props.config Optional override configurations for the evaluator.\n */\nexport async function evaluate<D, T, O>({\n data, executor, evaluators, groupName, name, metadata, config,\n}: EvaluationConstructorProps<D, T, O>): Promise<void> {\n const evaluation = new Evaluation<D, T, O>({\n data,\n executor,\n evaluators,\n name,\n groupName,\n metadata,\n config,\n });\n if (globalThis._set_global_evaluation) {\n // TODO: if we load files concurrently, we need to use a mutex to protect\n // concurrent writes to globalThis._evaluations\n globalThis._evaluations = [...(globalThis._evaluations ?? []), evaluation];\n } else {\n await evaluation.run();\n }\n}\n","import { Datapoint } from \"./evaluations\";\nimport { StringUUID } from \"./utils\";\n\nexport type ChatMessage = {\n role: 'user' | 'assistant' | 'system';\n content: string;\n};\n\nexport type NodeInput = ChatMessage[] | string | boolean | number;\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 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};\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 | 'PIPELINE'\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 */\nexport type LaminarSpanContext = {\n spanId: StringUUID;\n traceId: StringUUID;\n isRemote: boolean;\n};\n","export { LaminarClient } from './client';\nexport { EvaluationDataset as Dataset, LaminarDataset } from './datasets';\nexport { observe, withLabels, withTracingLevel } from './decorators';\nexport {\n Datapoint,\n evaluate,\n EvaluatorFunction,\n EvaluatorFunctionReturn,\n HumanEvaluator,\n} from './evaluations';\nexport { Laminar } from './laminar';\nexport { LaminarSpanProcessor } from './opentelemetry-lib/';\nexport { LaminarAttributes } from './opentelemetry-lib/tracing/attributes';\nexport { getTracer, getTracerProvider } from './opentelemetry-lib/tracing/index';\nexport { initializeLaminarInstrumentations } from './opentelemetry-lib/tracing/instrumentations';\nexport {\n ChatMessage,\n EvaluationDatapoint,\n Event,\n LaminarSpanContext,\n NodeInput,\n TracingLevel,\n} from './types';\nexport { Span } from '@opentelemetry/api';\n"],"mappings":"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","names":["value","logger","context","diag","context","trace","trace","path","trace","path","logger","trace","context","logger","key","baseType","logger","path","context","trace","diag","trace","InstrumentationBase","InstrumentationNodeModuleDefinition","InstrumentationBase","InstrumentationNodeModuleDefinition","diag","observe","trace","agent","diag","trace","InstrumentationBase","InstrumentationNodeModuleDefinition","existsSync","readFile","path","logger","RRWEB_SCRIPT_PATH","path","existsSync","InstrumentationBase","InstrumentationNodeModuleDefinition","diag","context","trace","readFile","context","context","logger","context","trace","diag","context","trace","logger","context","trace","context","trace","logger","key","trace","output","target","TracingLevel","Span"]}