langwatch 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/{add-5FRWEQ32.mjs → add-2UHFYNUA.mjs} +8 -8
  2. package/dist/add-2UHFYNUA.mjs.map +1 -0
  3. package/dist/{add-CXUS4ZSQ.js → add-LUETMKBD.js} +11 -11
  4. package/dist/add-LUETMKBD.js.map +1 -0
  5. package/dist/{chunk-CKIZDPIJ.js → chunk-5MQQRSVM.js} +1 -1
  6. package/dist/{chunk-CKIZDPIJ.js.map → chunk-5MQQRSVM.js.map} +1 -1
  7. package/dist/{chunk-NM5OKM7F.js → chunk-6SSCBYJM.js} +21 -20
  8. package/dist/chunk-6SSCBYJM.js.map +1 -0
  9. package/dist/{chunk-SNDTNU3T.js → chunk-ASTAIRXG.js} +2 -2
  10. package/dist/{chunk-SNDTNU3T.js.map → chunk-ASTAIRXG.js.map} +1 -1
  11. package/dist/{chunk-BTCJWUS5.js → chunk-BQRUUTN3.js} +17 -17
  12. package/dist/{chunk-BTCJWUS5.js.map → chunk-BQRUUTN3.js.map} +1 -1
  13. package/dist/{chunk-YWO3NE5A.js → chunk-C4XUWCQR.js} +2 -2
  14. package/dist/{chunk-YWO3NE5A.js.map → chunk-C4XUWCQR.js.map} +1 -1
  15. package/dist/{chunk-WHPBZSTS.mjs → chunk-IIUI2XYW.mjs} +2 -2
  16. package/dist/{chunk-A43BYF5Q.js → chunk-ONXIZKC6.js} +11 -11
  17. package/dist/{chunk-A43BYF5Q.js.map → chunk-ONXIZKC6.js.map} +1 -1
  18. package/dist/{chunk-I3X7VMSP.mjs → chunk-OTID7S7K.mjs} +8 -7
  19. package/dist/chunk-OTID7S7K.mjs.map +1 -0
  20. package/dist/{chunk-I2SOBPAF.mjs → chunk-RSIPLYVA.mjs} +1 -1
  21. package/dist/{chunk-I2SOBPAF.mjs.map → chunk-RSIPLYVA.mjs.map} +1 -1
  22. package/dist/{chunk-W6FD5ZO3.mjs → chunk-TB5KB737.mjs} +2 -2
  23. package/dist/{chunk-W6FD5ZO3.mjs.map → chunk-TB5KB737.mjs.map} +1 -1
  24. package/dist/{chunk-VGVWXKVM.mjs → chunk-WCNDT5SD.mjs} +3 -3
  25. package/dist/{chunk-FEL5FLHA.mjs → chunk-ZEPKV5YO.mjs} +2 -2
  26. package/dist/cli/index.js +6 -6
  27. package/dist/cli/index.mjs +6 -6
  28. package/dist/{implementation-CPxv2BdW.d.ts → implementation-Bnc8Aymq.d.ts} +1 -1
  29. package/dist/{implementation-CVrmD0bz.d.mts → implementation-Ck58nRkT.d.mts} +1 -1
  30. package/dist/index.d.mts +666 -3
  31. package/dist/index.d.ts +666 -3
  32. package/dist/index.js +1249 -17
  33. package/dist/index.js.map +1 -1
  34. package/dist/index.mjs +1241 -9
  35. package/dist/index.mjs.map +1 -1
  36. package/dist/{list-K6E3OGYH.js → list-7U3M64GY.js} +10 -10
  37. package/dist/{list-K6E3OGYH.js.map → list-7U3M64GY.js.map} +1 -1
  38. package/dist/{list-DQ6XLQCK.mjs → list-WV5LA6LD.mjs} +7 -7
  39. package/dist/{login-HX7WMLPL.js → login-B7DKMN7P.js} +4 -4
  40. package/dist/{login-HX7WMLPL.js.map → login-B7DKMN7P.js.map} +1 -1
  41. package/dist/{login-TJ2NCUAJ.mjs → login-QKRT6PXA.mjs} +3 -3
  42. package/dist/login-QKRT6PXA.mjs.map +1 -0
  43. package/dist/observability-sdk/index.d.mts +3 -3
  44. package/dist/observability-sdk/index.d.ts +3 -3
  45. package/dist/observability-sdk/index.js +6 -6
  46. package/dist/observability-sdk/index.js.map +1 -1
  47. package/dist/observability-sdk/index.mjs +10 -10
  48. package/dist/observability-sdk/instrumentation/langchain/index.d.mts +1 -1
  49. package/dist/observability-sdk/instrumentation/langchain/index.d.ts +1 -1
  50. package/dist/observability-sdk/instrumentation/langchain/index.js +16 -16
  51. package/dist/observability-sdk/instrumentation/langchain/index.mjs +2 -2
  52. package/dist/observability-sdk/setup/node/index.js +13 -13
  53. package/dist/observability-sdk/setup/node/index.mjs +3 -3
  54. package/dist/{remove-5ZOYQTF4.mjs → remove-2OGMXSTR.mjs} +7 -7
  55. package/dist/{remove-45A7WUCB.js → remove-A4DKCN7A.js} +9 -9
  56. package/dist/{remove-45A7WUCB.js.map → remove-A4DKCN7A.js.map} +1 -1
  57. package/dist/{sync-LL6TTFMS.mjs → sync-TNVCKWTC.mjs} +9 -9
  58. package/dist/sync-TNVCKWTC.mjs.map +1 -0
  59. package/dist/{sync-BE7XZC2A.js → sync-WRZXIBZS.js} +11 -11
  60. package/dist/sync-WRZXIBZS.js.map +1 -0
  61. package/dist/{types-Kts5RGLY.d.mts → types-5h2Im4pl.d.mts} +162 -0
  62. package/dist/{types-usU5mTCX.d.ts → types-fo-Ij9pl.d.ts} +162 -0
  63. package/package.json +125 -142
  64. package/dist/add-5FRWEQ32.mjs.map +0 -1
  65. package/dist/add-CXUS4ZSQ.js.map +0 -1
  66. package/dist/chunk-I3X7VMSP.mjs.map +0 -1
  67. package/dist/chunk-NM5OKM7F.js.map +0 -1
  68. package/dist/login-TJ2NCUAJ.mjs.map +0 -1
  69. package/dist/sync-BE7XZC2A.js.map +0 -1
  70. package/dist/sync-LL6TTFMS.mjs.map +0 -1
  71. /package/dist/{chunk-WHPBZSTS.mjs.map → chunk-IIUI2XYW.mjs.map} +0 -0
  72. /package/dist/{chunk-VGVWXKVM.mjs.map → chunk-WCNDT5SD.mjs.map} +0 -0
  73. /package/dist/{chunk-FEL5FLHA.mjs.map → chunk-ZEPKV5YO.mjs.map} +0 -0
  74. /package/dist/{list-DQ6XLQCK.mjs.map → list-WV5LA6LD.mjs.map} +0 -0
  75. /package/dist/{remove-5ZOYQTF4.mjs.map → remove-2OGMXSTR.mjs.map} +0 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/index.js","../src/client-sdk/services/traces/types.ts","../src/client-sdk/services/traces/tracing/tracer.ts","../src/client-sdk/services/traces/service.ts","../src/client-sdk/services/traces/facade.ts","../src/client-sdk/index.ts","../src/index.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACA;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACA;ACxBO,IAAM,YAAA,EAAN,MAAA,QAA0B,MAAM;AAAA,EACrC,WAAA,CACE,OAAA,EACgB,SAAA,EACA,aAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHG,IAAA,IAAA,CAAA,UAAA,EAAA,SAAA;AACA,IAAA,IAAA,CAAA,cAAA,EAAA,aAAA;AAGhB,IAAA,IAAA,CAAK,KAAA,EAAO,aAAA;AAAA,EACd;AACF,CAAA;ADwBA;AACA;AE7CO,IAAM,OAAA,EAAS,iDAAA,CAAmB,EAAA;AF+CR;AACA;AGpCN;AAGW,EAAA;AACpB,IAAA;AAKP,IAAA;AACL,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ0C,EAAA;AApC5C,IAAA;AAsCa,IAAA;AAGC,IAAA;AACmB,MAAA;AAC3B,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAY6B,EAAA;AACH,IAAA;AACd,MAAA;AACA,QAAA;AACA,UAAA;AACN,QAAA;AACF,MAAA;AACO,MAAA;AACR,IAAA;AAEU,IAAA;AACW,MAAA;AACtB,IAAA;AAEO,IAAA;AACT,EAAA;AACF;AHuBiC;AACA;AIlGjC;AAI0B;AAGY,EAAA;AAF3B,IAAA;AAGS,IAAA;AAClB,EAAA;AAE+E,EAAA;AACjE,IAAA;AACd,EAAA;AACF;AATW;AJyGsB;AACA;AK/GjC;AAiBuB;AAMkC,EAAA;AANlD,IAAA;AAjBP,IAAA;AAwBmB,IAAA;AACE,IAAA;AAEH,IAAA;AACZ,MAAA;AACA,MAAA;AACiB,MAAA;AACnB,IAAA;AAEmB,IAAA;AACM,MAAA;AACE,MAAA;AAE1B,IAAA;AACiB,IAAA;AACpB,EAAA;AAEoC,EAAA;AACf,IAAA;AACrB,EAAA;AAgBF;AA1CO;AA4BgB;AACnB,EAAA;AACA,EAAA;AACA,EAAA;AAKiB;AArDrB,EAAA;AAsDW,EAAA;AACG,IAAA;AACY,IAAA;AACtB,EAAA;AACF;ALwF+B;AACA;AMpIX;AACpB,EAAA;AACA,EAAA;AACF;ANsIiC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/index.js","sourcesContent":[null,"import type { paths } from \"@/internal/generated/openapi/api-client\";\n\nexport interface GetTraceParams {\n includeSpans?: boolean;\n}\n\nexport type GetTraceResponse = NonNullable<\n paths[\"/api/trace/{id}\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n>;\n\n/**\n * Custom error class for Traces API operations.\n * Provides context about the failed operation and the original error.\n */\nexport class TracesError extends Error {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: any,\n ) {\n super(message);\n this.name = \"TracesError\";\n }\n}\n","import { LANGWATCH_SDK_NAME_CLIENT, LANGWATCH_SDK_VERSION } from \"@/internal/constants\";\nimport { getLangWatchTracer } from \"@/observability-sdk/tracer\";\n\nexport const tracer = getLangWatchTracer(`${LANGWATCH_SDK_NAME_CLIENT}.traces`, LANGWATCH_SDK_VERSION);\n","import { createTracingProxy } from \"@/client-sdk/tracing/create-tracing-proxy\";\nimport { type InternalConfig } from \"@/client-sdk/types\";\nimport { type GetTraceParams, TracesError, type GetTraceResponse } from \"./types\";\nimport { tracer } from \"./tracing\";\n\n/**\n * Service for managing trace resources via the Langwatch API.\n * Constructor creates a proxy that wraps the service and traces all methods.\n *\n * Responsibilities:\n * - Retrieving trace data\n * - Error handling with contextual information\n *\n * All methods return trace response objects directly.\n */\nexport class TracesService {\n private config: InternalConfig;\n\n constructor(config: InternalConfig) {\n this.config = config;\n\n /**\n * Wraps the service in a tracing proxy via the decorator.\n */\n return createTracingProxy(\n this as TracesService,\n tracer,\n );\n }\n\n /**\n * Handles API errors by throwing a TracesError with operation context.\n * @param operation Description of the operation being performed.\n * @param error The error object returned from the API client.\n * @throws {TracesError}\n */\n private handleApiError(operation: string, error: any): never {\n const errorMessage =\n typeof error === \"string\"\n ? error\n : error?.error ?? error?.message ?? \"Unknown error occurred\";\n throw new TracesError(\n `Failed to ${operation}: ${errorMessage}`,\n operation,\n error,\n );\n }\n\n /**\n * Retrieves a trace by its ID.\n * @param traceId The trace's unique identifier.\n * @param params Optional parameters for the request.\n * @returns The trace response object.\n * @throws {TracesError} If the API call fails.\n */\n async get(\n traceId: string,\n params?: GetTraceParams,\n ): Promise<GetTraceResponse> {\n const { data, error } = await this.config.langwatchApiClient.GET(\"/api/trace/{id}\", {\n params: {\n path: {\n id: traceId,\n },\n },\n query: params,\n });\n\n if (error) {\n this.handleApiError(\"get trace\", error);\n }\n\n return data;\n }\n}\n","import { type InternalConfig } from \"../../types\";\nimport { TracesService } from \"./service\";\nimport { type GetTraceParams, type GetTraceResponse } from \"./types\";\n\nexport class TracesFacade {\n readonly #service: TracesService;\n\n constructor(config: InternalConfig) {\n this.#service = new TracesService(config);\n }\n\n async get(traceId: string, params?: GetTraceParams): Promise<GetTraceResponse> {\n return this.#service.get(traceId, params);\n }\n}\n","import { PromptsFacade, PromptsApiService } from \"./services/prompts\";\nexport { FetchPolicy, type GetPromptOptions } from \"./services/prompts\";\nimport { LocalPromptsService } from \"./services/prompts/local-prompts.service\";\nimport { type InternalConfig } from \"./types\";\nimport { createLangWatchApiClient, type LangwatchApiClient } from \"../internal/api/client\";\nimport { type Logger, NoOpLogger } from \"../logger\";\nimport { TracesFacade } from \"./services/traces/facade\";\nimport { DEFAULT_ENDPOINT } from \"@/internal/constants\";\n\nexport interface LangWatchConstructorOptions {\n apiKey?: string;\n endpoint?: string;\n options?: {\n logger?: Logger;\n };\n}\n\nexport class LangWatch {\n private readonly config: InternalConfig;\n\n readonly prompts: PromptsFacade;\n readonly traces: TracesFacade;\n\n constructor(options: LangWatchConstructorOptions = {}) {\n const apiKey = options.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n const endpoint = options.endpoint ?? process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT;\n\n this.config = this.#createInternalConfig({\n apiKey,\n endpoint,\n options: options.options,\n });\n\n this.prompts = new PromptsFacade({\n promptsApiService: new PromptsApiService(this.config),\n localPromptsService: new LocalPromptsService(),\n ...this.config,\n });\n this.traces = new TracesFacade(this.config);\n }\n\n get apiClient(): LangwatchApiClient {\n return this.config.langwatchApiClient;\n }\n\n #createInternalConfig({\n apiKey,\n endpoint,\n options,\n }: {\n apiKey: string;\n endpoint: string;\n options?: LangWatchConstructorOptions[\"options\"];\n }): InternalConfig {\n return {\n logger: options?.logger ?? new NoOpLogger(),\n langwatchApiClient: createLangWatchApiClient(apiKey, endpoint),\n };\n }\n}\n","import { ConsoleLogger, NoOpLogger } from \"./logger\";\n\nexport {\n getLangWatchTracer,\n getLangWatchLogger,\n attributes,\n} from \"./observability-sdk\";\n\nexport {\n FilterableBatchSpanProcessor,\n type SpanProcessingExcludeRule,\n} from \"./observability-sdk/processors\";\nexport { LangWatchExporter } from \"./observability-sdk/exporters\";\nexport { LangWatch, FetchPolicy, type GetPromptOptions } from \"./client-sdk\";\n\nexport const logger = {\n ConsoleLogger,\n NoOpLogger,\n};\n"]}
1
+ {"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/index.js","../src/client-sdk/services/datasets/errors.ts","../src/client-sdk/services/datasets/dataset.service.ts","../src/client-sdk/services/datasets/datasets.facade.ts","../src/client-sdk/services/evaluation/evaluation.ts","../src/client-sdk/services/evaluation/humanReadableId.ts","../src/client-sdk/services/evaluation/errors/evaluation.error.ts","../src/client-sdk/services/evaluation/platformErrors.ts","../src/client-sdk/services/evaluation/evaluation.facade.ts","../src/client-sdk/services/traces/types.ts","../src/client-sdk/services/traces/tracing/tracer.ts","../src/client-sdk/services/traces/service.ts","../src/client-sdk/services/traces/facade.ts","../src/client-sdk/index.ts","../src/index.ts"],"names":["_a"],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/index.js","sourcesContent":[null,"/**\n * Errors for the Dataset API\n */\n\nexport class DatasetError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"DatasetError\";\n }\n}\n\nexport class DatasetNotFoundError extends DatasetError {\n constructor(slugOrId: string) {\n super(`Dataset not found: ${slugOrId}`);\n this.name = \"DatasetNotFoundError\";\n }\n}\n\nexport class DatasetApiError extends DatasetError {\n readonly status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = \"DatasetApiError\";\n this.status = status;\n }\n}\n","import { type LangwatchApiClient } from \"@/internal/api/client\";\nimport { type Logger } from \"@/logger\";\nimport {\n type Dataset,\n type DatasetEntry,\n type GetDatasetApiResponse,\n type GetDatasetOptions,\n} from \"./types\";\nimport { DatasetApiError, DatasetNotFoundError } from \"./errors\";\n\ntype DatasetServiceConfig = {\n langwatchApiClient: LangwatchApiClient;\n logger: Logger;\n};\n\nexport class DatasetService {\n readonly #config: DatasetServiceConfig;\n\n constructor(config: DatasetServiceConfig) {\n this.#config = config;\n }\n\n /**\n * Fetches a dataset by its slug or ID\n *\n * @param slugOrId - The slug or ID of the dataset\n * @param options - Optional configuration\n * @returns The dataset with all entries\n */\n async getDataset<T extends Record<string, unknown> = Record<string, unknown>>(\n slugOrId: string,\n _options?: GetDatasetOptions\n ): Promise<Dataset<T>> {\n this.#config.logger.debug(`Fetching dataset: ${slugOrId}`);\n\n const response = await this.#config.langwatchApiClient.GET(\n \"/api/dataset/{slugOrId}\",\n {\n params: {\n path: {\n slugOrId,\n },\n },\n }\n );\n\n if (response.error) {\n const status = response.response.status;\n\n if (status === 404) {\n throw new DatasetNotFoundError(slugOrId);\n }\n\n const errorMessage =\n \"message\" in response.error\n ? response.error.message\n : \"error\" in response.error\n ? response.error.error\n : `Failed to fetch dataset: ${slugOrId}`;\n\n throw new DatasetApiError(errorMessage ?? `HTTP ${status}`, status);\n }\n\n const data = response.data as GetDatasetApiResponse;\n\n const entries: DatasetEntry<T>[] = data.data.map((item) => ({\n id: item.id,\n datasetId: item.datasetId,\n projectId: item.projectId,\n entry: item.entry as T,\n createdAt: item.createdAt,\n updatedAt: item.updatedAt,\n }));\n\n this.#config.logger.debug(\n `Fetched dataset ${slugOrId} with ${entries.length} entries`\n );\n\n return { entries };\n }\n}\n","import { type LangwatchApiClient } from \"@/internal/api/client\";\nimport { type Logger } from \"@/logger\";\nimport { DatasetService } from \"./dataset.service\";\nimport { type Dataset, type GetDatasetOptions } from \"./types\";\n\ntype DatasetsFacadeConfig = {\n langwatchApiClient: LangwatchApiClient;\n logger: Logger;\n};\n\n/**\n * Facade for dataset operations\n *\n * Provides a simple interface for fetching datasets from LangWatch.\n *\n * @example\n * ```typescript\n * const langwatch = new LangWatch({ apiKey: \"your-api-key\" });\n *\n * // Get a dataset by slug or ID\n * const dataset = await langwatch.datasets.get(\"my-dataset\");\n *\n * // Use with evaluation\n * const evaluation = langwatch.evaluation.init(\"my-experiment\");\n * await evaluation.run(dataset.entries.map(e => e.entry), async ({ item, index }) => {\n * const output = await myLLM(item.input);\n * await evaluation.evaluate(\"my-evaluator\", {\n * data: { input: item.input, output, expected_output: item.expected_output },\n * settings: {}\n * });\n * });\n * ```\n */\nexport class DatasetsFacade {\n readonly #datasetService: DatasetService;\n\n constructor(config: DatasetsFacadeConfig) {\n this.#datasetService = new DatasetService(config);\n }\n\n /**\n * Fetches a dataset by its slug or ID\n *\n * @param slugOrId - The slug or ID of the dataset to fetch\n * @param options - Optional configuration\n * @returns The dataset with all entries\n *\n * @example\n * ```typescript\n * // Get dataset by slug\n * const dataset = await langwatch.datasets.get(\"product-qa\");\n *\n * // Get dataset by ID\n * const dataset = await langwatch.datasets.get(\"ds_abc123\");\n *\n * // Typed dataset\n * type MyDatasetEntry = { input: string; expected_output: string; };\n * const dataset = await langwatch.datasets.get<MyDatasetEntry>(\"my-dataset\");\n *\n * // Iterate over entries\n * for (const entry of dataset.entries) {\n * console.log(entry.entry.input); // typed as string\n * }\n * ```\n */\n get = <T extends Record<string, unknown> = Record<string, unknown>>(\n slugOrId: string,\n options?: GetDatasetOptions\n ): Promise<Dataset<T>> => {\n return this.#datasetService.getDataset<T>(slugOrId, options);\n };\n}\n","/**\n * Evaluation - Main class for running batch evaluations\n *\n * Provides a clean API for running evaluations over datasets with:\n * - Automatic tracing per iteration\n * - Parallel execution with concurrency control\n * - Batched result sending\n * - Built-in evaluator support\n * - Multi-target comparison with withTarget() context isolation\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { trace, SpanStatusCode, ROOT_CONTEXT } from \"@opentelemetry/api\";\nimport { createLangWatchSpan } from \"@/observability-sdk/span/implementation\";\nimport type { LangWatchSpan } from \"@/observability-sdk/span/types\";\nimport type { LangwatchApiClient } from \"@/internal/api/client\";\nimport type { Logger } from \"@/logger\";\nimport { generateHumanReadableId } from \"./humanReadableId\";\nimport {\n EvaluationInitError,\n TargetMetadataConflictError,\n EvaluatorError,\n} from \"./errors\";\nimport type {\n Batch,\n BatchEntry,\n EvaluationResult,\n TargetInfo,\n TargetMetadata,\n EvaluationInitOptions,\n LogOptions,\n EvaluateOptions,\n RunOptions,\n RunCallback,\n RunContext,\n ExperimentInitResponse,\n LogResultsRequest,\n RunEvaluatorResponse,\n TargetCallback,\n TargetResult,\n TargetExecutionContext,\n TargetContext,\n} from \"./types\";\n\nconst DEFAULT_CONCURRENCY = 4;\nconst DEBOUNCE_INTERVAL_MS = 1000;\n\n/**\n * AsyncLocalStorage for iteration context isolation.\n * This stores the current item and index for each iteration,\n * preventing race conditions in concurrent execution.\n */\ntype IterationContext = {\n index: number;\n item: unknown;\n};\nconst iterationContextStorage = new AsyncLocalStorage<IterationContext>();\n\n/**\n * AsyncLocalStorage for target context isolation.\n * This allows log() calls inside withTarget() to automatically\n * infer the target without explicit specification.\n */\nconst targetContextStorage = new AsyncLocalStorage<TargetExecutionContext>();\n\n/**\n * Evaluation session for running batch evaluations\n */\nexport class Evaluation {\n readonly name: string;\n readonly runId: string;\n readonly experimentSlug: string;\n\n private readonly apiClient: LangwatchApiClient;\n private readonly endpoint: string;\n private readonly apiKey: string;\n private readonly logger: Logger;\n private readonly concurrency: number;\n\n private initialized = false;\n private createdAtMs: number;\n private total = 0;\n private progress = 0;\n\n // Batching state\n private batch: Batch = { dataset: [], evaluations: [], targets: [] };\n private lastSentMs = 0;\n private pendingFlush: Promise<void> | null = null;\n private flushTimeout: ReturnType<typeof setTimeout> | null = null;\n\n // Target registry\n private targets = new Map<string, TargetInfo>();\n\n // Current iteration context (for log/evaluate calls)\n private currentTraceId: string | null = null;\n private currentIndex: number | null = null;\n\n // Track whether withTarget() was used in the current iteration\n // If so, we don't create dataset entries in executeItem()\n // Note: This is now checked via iterationContextStorage to be thread-safe\n private iterationUsedWithTarget = new Map<number, boolean>();\n\n // Track whether withTarget() has EVER been used in this evaluation\n // Once set to true, we stop creating iteration-level traces\n private evaluationUsesTargets = false;\n\n private constructor(\n name: string,\n options: {\n apiClient: LangwatchApiClient;\n endpoint: string;\n apiKey: string;\n logger: Logger;\n runId?: string;\n concurrency?: number;\n }\n ) {\n this.name = name;\n this.experimentSlug = name;\n this.runId = options.runId ?? generateHumanReadableId();\n this.apiClient = options.apiClient;\n this.endpoint = options.endpoint;\n this.apiKey = options.apiKey;\n this.logger = options.logger;\n this.concurrency = options.concurrency ?? DEFAULT_CONCURRENCY;\n this.createdAtMs = Date.now();\n }\n\n /**\n * Initialize an evaluation session\n */\n static async init(\n name: string,\n options: {\n apiClient: LangwatchApiClient;\n endpoint: string;\n apiKey: string;\n logger: Logger;\n } & EvaluationInitOptions\n ): Promise<Evaluation> {\n const evaluation = new Evaluation(name, options);\n await evaluation.initialize();\n return evaluation;\n }\n\n /**\n * Initialize the evaluation by creating/getting the experiment\n */\n private async initialize(): Promise<void> {\n if (!this.apiKey) {\n throw new EvaluationInitError(\n \"API key is required. Set LANGWATCH_API_KEY or pass apiKey to LangWatch constructor.\"\n );\n }\n\n try {\n const response = await fetch(`${this.endpoint}/api/experiment/init`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Auth-Token\": this.apiKey,\n },\n body: JSON.stringify({\n experiment_name: this.name,\n experiment_slug: this.experimentSlug,\n experiment_type: \"BATCH_EVALUATION_V2\",\n }),\n });\n\n if (response.status === 401) {\n throw new EvaluationInitError(\"Invalid API key\");\n }\n\n if (!response.ok) {\n const text = await response.text();\n throw new EvaluationInitError(`Failed to initialize experiment: ${text}`);\n }\n\n const data = (await response.json()) as ExperimentInitResponse;\n (this as { experimentSlug: string }).experimentSlug = data.slug;\n\n const encodedRunId = encodeURIComponent(this.runId);\n console.log(`Follow results at: ${this.endpoint}${data.path}?runId=${encodedRunId}`);\n\n this.initialized = true;\n } catch (error) {\n if (error instanceof EvaluationInitError) {\n throw error;\n }\n throw new EvaluationInitError(\n `Failed to initialize evaluation: ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Run evaluation over a dataset with a callback\n *\n * @param dataset - Array of items to evaluate\n * @param callback - Function called for each item with { item, index, span }\n * @param options - Concurrency options\n *\n * @example\n * ```typescript\n * await evaluation.run(dataset, async ({ item, index, span }) => {\n * const response = await myAgent(item.question);\n * evaluation.log('accuracy', { index, score: 0.95 });\n * }, { concurrency: 4 });\n * ```\n */\n async run<T>(\n dataset: T[],\n callback: RunCallback<T>,\n options?: RunOptions\n ): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const concurrency = options?.concurrency ?? this.concurrency;\n this.total = dataset.length;\n this.progress = 0;\n\n const tracer = trace.getTracer(\"langwatch-evaluation\");\n\n // Process items with concurrency control\n const executing = new Set<Promise<void>>();\n\n for (let index = 0; index < dataset.length; index++) {\n const item = dataset[index] as T;\n\n const itemPromise = this.executeItem(tracer, item, index, callback);\n\n executing.add(itemPromise);\n void itemPromise.finally(() => executing.delete(itemPromise));\n\n // Wait if we've hit concurrency limit\n if (executing.size >= concurrency) {\n await Promise.race(executing);\n }\n }\n\n // Wait for all remaining items\n await Promise.all(executing);\n\n // Send final batch with finished timestamp\n await this.flush(true);\n }\n\n /**\n * Execute a single item in the dataset\n */\n private async executeItem<T>(\n tracer: ReturnType<typeof trace.getTracer>,\n item: T,\n index: number,\n callback: RunCallback<T>\n ): Promise<void> {\n const startTime = Date.now();\n let error: Error | undefined;\n let capturedTraceId: string | null = null;\n\n // Reset withTarget tracking for this iteration\n this.iterationUsedWithTarget.set(index, false);\n\n // Set up iteration context (thread-safe via AsyncLocalStorage)\n const iterationContext: IterationContext = { index, item };\n\n // If evaluation uses targets, skip creating iteration-level traces\n // Each withTarget() call will create its own independent trace\n if (this.evaluationUsesTargets) {\n await iterationContextStorage.run(iterationContext, async () => {\n this.currentIndex = index;\n\n try {\n // Create a minimal span context for the callback\n const span = {\n setStatus: () => { /* no-op */ },\n recordException: () => { /* no-op */ },\n end: () => { /* no-op */ },\n } as unknown as LangWatchSpan;\n\n const ctx: RunContext<T> = { item, index, span };\n const result = callback(ctx);\n\n if (result && typeof result.then === \"function\") {\n await result;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n this.logger.error(`Evaluation error at index ${index}:`, error);\n } finally {\n this.currentIndex = null;\n }\n });\n } else {\n await iterationContextStorage.run(iterationContext, async () => {\n await tracer.startActiveSpan(\n \"evaluation.iteration\",\n {\n attributes: {\n \"evaluation.run_id\": this.runId,\n \"evaluation.index\": index,\n },\n },\n async (otelSpan) => {\n const span = createLangWatchSpan(otelSpan);\n const spanContext = otelSpan.spanContext();\n const traceId = spanContext.traceId;\n\n // Set current context for log/evaluate calls\n this.currentTraceId = traceId;\n this.currentIndex = index;\n capturedTraceId = traceId;\n\n try {\n const ctx: RunContext<T> = { item, index, span };\n const result = callback(ctx);\n\n if (result && typeof result.then === \"function\") {\n await result;\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n this.logger.error(`Evaluation error at index ${index}:`, error);\n } finally {\n span.end();\n this.currentTraceId = null;\n this.currentIndex = null;\n }\n }\n );\n });\n }\n\n // Only add a dataset entry if withTarget() was NOT used\n // When withTarget() is used, it creates its own dataset entries per target\n if (!this.iterationUsedWithTarget.get(index)) {\n const duration = Date.now() - startTime;\n const entry: BatchEntry = {\n index,\n entry: this.serializeItem(item),\n duration,\n error: error?.message ?? null,\n trace_id: capturedTraceId ?? this.getTraceIdFromContext(),\n };\n\n this.batch.dataset.push(entry);\n }\n\n // Clean up\n this.iterationUsedWithTarget.delete(index);\n\n this.progress++;\n\n // Debounced send\n this.scheduleSend();\n }\n\n /**\n * Log a custom metric result\n *\n * @param metric - Name of the metric\n * @param options - Metric options including index, score, passed, etc.\n *\n * If called inside a withTarget() block, the target and index are automatically\n * inferred from the context and don't need to be specified.\n *\n * @example\n * ```typescript\n * // Explicit target (outside withTarget)\n * evaluation.log('accuracy', { index, score: 0.95, target: 'gpt-4' });\n *\n * // Implicit target (inside withTarget)\n * await evaluation.withTarget('gpt-4', { model: 'openai/gpt-4' }, async () => {\n * evaluation.log('accuracy', { score: 0.95 }); // target and index auto-inferred\n * });\n * ```\n */\n log(metric: string, options: LogOptions): void {\n // Get context from AsyncLocalStorage (if inside withTarget)\n const targetContext = targetContextStorage.getStore();\n\n const {\n data = {},\n score,\n passed,\n label,\n details,\n status = options.error ? \"error\" : \"processed\",\n duration,\n cost,\n error,\n // Use context values as defaults, allow explicit override\n target = targetContext?.targetId,\n metadata,\n index = targetContext?.index ?? options.index,\n } = options;\n\n // Register target if provided (explicit or from context)\n let targetId: string | undefined;\n if (target) {\n targetId = this.registerTarget(target, metadata);\n }\n\n // Use trace ID from context, then current iteration, then OTEL context\n const traceId =\n targetContext?.traceId ?? this.currentTraceId ?? this.getTraceIdFromContext();\n\n const result: EvaluationResult = {\n name: metric,\n evaluator: metric,\n trace_id: traceId,\n status,\n data,\n score: score ?? null,\n passed: passed ?? null,\n details: details ?? (error ? error.message : null),\n index,\n label: label ?? null,\n cost: cost ?? null,\n duration: duration ?? null,\n error_type: error ? error.name : null,\n traceback: error ? [error.stack ?? error.message] : null,\n target_id: targetId ?? null,\n };\n\n this.batch.evaluations.push(result);\n this.scheduleSend();\n }\n\n /**\n * Run a built-in evaluator\n *\n * @param evaluatorSlug - The evaluator identifier (e.g., 'ragas/faithfulness')\n * @param options - Evaluator options including data and settings\n *\n * If called inside a withTarget() block, the target and index are automatically\n * inferred from the context and don't need to be specified.\n *\n * @example\n * ```typescript\n * // Inside withTarget() - target and index auto-inferred\n * await evaluation.withTarget('gpt-4', { model: 'openai/gpt-4' }, async () => {\n * await evaluation.evaluate('ragas/faithfulness', {\n * data: { input, output, contexts },\n * });\n * });\n *\n * // Or explicit index/target\n * await evaluation.evaluate('ragas/faithfulness', {\n * index,\n * data: { input, output, contexts },\n * target: 'gpt-4',\n * });\n * ```\n */\n async evaluate(evaluatorSlug: string, options: EvaluateOptions): Promise<void> {\n // Get context from AsyncLocalStorage (if inside withTarget)\n const targetContext = targetContextStorage.getStore();\n\n const {\n data,\n settings,\n name,\n asGuardrail = false,\n // Use context values as defaults, allow explicit override\n target = targetContext?.targetId,\n metadata,\n index = targetContext?.index ?? options.index,\n } = options;\n\n const startTime = Date.now();\n // Use trace ID from context, then current iteration, then OTEL context\n const traceId =\n targetContext?.traceId ?? this.currentTraceId ?? this.getTraceIdFromContext();\n const spanId = targetContext?.spanId ?? this.getSpanIdFromContext();\n\n try {\n const response = await fetch(\n `${this.endpoint}/api/evaluations/${evaluatorSlug}/evaluate`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Auth-Token\": this.apiKey,\n },\n body: JSON.stringify({\n trace_id: traceId ?? null,\n span_id: spanId ?? null,\n name: name ?? evaluatorSlug,\n data,\n settings,\n as_guardrail: asGuardrail,\n }),\n }\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new EvaluatorError(evaluatorSlug, text);\n }\n\n const result = (await response.json()) as RunEvaluatorResponse;\n const duration = Date.now() - startTime;\n\n // Log the result\n this.log(name ?? evaluatorSlug, {\n index,\n data,\n status: result.status,\n score: result.score ?? undefined,\n passed: result.passed ?? undefined,\n details: result.details ?? undefined,\n label: result.label ?? undefined,\n duration,\n cost: result.cost?.amount,\n target,\n metadata,\n });\n } catch (error) {\n const duration = Date.now() - startTime;\n\n if (error instanceof EvaluatorError) {\n this.log(name ?? evaluatorSlug, {\n index,\n data,\n status: \"error\",\n duration,\n error: error,\n target,\n metadata,\n });\n throw error;\n }\n\n const wrappedError = new EvaluatorError(\n evaluatorSlug,\n error instanceof Error ? error.message : String(error),\n error instanceof Error ? error : undefined\n );\n\n this.log(name ?? evaluatorSlug, {\n index,\n data,\n status: \"error\",\n duration,\n error: wrappedError,\n target,\n metadata,\n });\n\n throw wrappedError;\n }\n }\n\n /**\n * Execute code within a target context with automatic tracing\n *\n * Creates a new span for this target execution and sets up context\n * so that log() calls inside the callback automatically use this target.\n * Duration and output are captured automatically.\n *\n * This creates a dataset entry per target (like Evaluations V3), enabling\n * proper per-target latency and cost tracking.\n *\n * @param targetName - Unique identifier for the target\n * @param metadata - Optional metadata for comparison (e.g., { model: 'gpt-4' })\n * @param callback - Function to execute within the target context\n * @returns The callback result along with captured metrics\n *\n * @example\n * ```typescript\n * await evaluation.run(dataset, async ({ item, index }) => {\n * // Compare GPT-4 and Claude on the same input\n * const [gpt4Result, claudeResult] = await Promise.all([\n * evaluation.withTarget('gpt-4', { model: 'openai/gpt-4' }, async () => {\n * const response = await openai.chat(item.question);\n * evaluation.log('quality', { score: 0.95 }); // target auto-inferred\n * return response;\n * }),\n * evaluation.withTarget('claude-3', { model: 'anthropic/claude-3' }, async () => {\n * const response = await anthropic.messages(item.question);\n * evaluation.log('quality', { score: 0.85 }); // target auto-inferred\n * return response;\n * }),\n * ]);\n * });\n * ```\n */\n async withTarget<R>(\n targetName: string,\n metadata: TargetMetadata | null,\n callback: TargetCallback<R>\n ): Promise<TargetResult<R>>;\n async withTarget<R>(\n targetName: string,\n callback: TargetCallback<R>\n ): Promise<TargetResult<R>>;\n async withTarget<R>(\n targetName: string,\n metadataOrCallback: TargetMetadata | null | TargetCallback<R>,\n maybeCallback?: TargetCallback<R>\n ): Promise<TargetResult<R>> {\n // Handle overloads\n const metadata =\n typeof metadataOrCallback === \"function\" ? null : metadataOrCallback;\n const callback =\n typeof metadataOrCallback === \"function\" ? metadataOrCallback : maybeCallback!;\n\n // On FIRST withTarget() call ever in this evaluation:\n // - Set flag to skip creating iteration-level traces going forward\n if (!this.evaluationUsesTargets) {\n this.evaluationUsesTargets = true;\n }\n\n // Get iteration context (thread-safe via AsyncLocalStorage)\n const iterationContext = iterationContextStorage.getStore();\n const index = iterationContext?.index ?? this.currentIndex ?? 0;\n const currentItem = iterationContext?.item;\n\n // Mark that withTarget() was used - prevents executeItem from creating a dataset entry\n this.iterationUsedWithTarget.set(index, true);\n\n // Register target\n this.registerTarget(targetName, metadata ?? undefined);\n\n const tracer = trace.getTracer(\"langwatch-evaluation\");\n const startTime = Date.now();\n let result: R | undefined;\n let traceId = \"\";\n let spanId = \"\";\n let callbackError: Error | undefined;\n\n // Create an INDEPENDENT root span using ROOT_CONTEXT\n // This ensures each target gets a unique trace_id, not shared with iteration\n await tracer.startActiveSpan(\n `evaluation.target.${targetName}`,\n {\n attributes: {\n \"evaluation.run_id\": this.runId,\n \"evaluation.target\": targetName,\n \"evaluation.index\": index,\n },\n },\n ROOT_CONTEXT,\n async (otelSpan) => {\n const span = createLangWatchSpan(otelSpan);\n const spanContext = otelSpan.spanContext();\n const rawTraceId = spanContext.traceId;\n spanId = spanContext.spanId;\n\n // Check if this is a no-op trace (all zeros = no tracer configured)\n const isNoOpTrace = rawTraceId === \"00000000000000000000000000000000\";\n traceId = isNoOpTrace ? \"\" : rawTraceId;\n\n // Set up the target execution context\n const executionContext: TargetExecutionContext = {\n targetId: targetName,\n traceId,\n spanId,\n index,\n };\n\n try {\n // Run callback within AsyncLocalStorage context\n result = await targetContextStorage.run(executionContext, async () => {\n const ctx: TargetContext = { span, traceId, spanId };\n const callbackResult = callback(ctx);\n\n if (callbackResult && typeof (callbackResult as Promise<R>).then === \"function\") {\n return await callbackResult;\n }\n return callbackResult as R;\n });\n\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (err) {\n callbackError = err instanceof Error ? err : new Error(String(err));\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: callbackError.message,\n });\n span.recordException(callbackError);\n throw err;\n } finally {\n span.end();\n }\n }\n );\n\n const duration = Date.now() - startTime;\n\n // Serialize the result as \"predicted\" output (similar to Evaluations V3)\n let predicted: Record<string, unknown> | null = null;\n if (result !== undefined && result !== null) {\n predicted = typeof result === \"object\"\n ? (result as Record<string, unknown>)\n : { output: result };\n }\n\n // Create a dataset entry for this target execution (like Evaluations V3)\n // This captures per-target duration/latency properly\n // Use currentItem from iteration context (thread-safe), NOT shared instance variable\n const entry: BatchEntry = {\n index,\n entry: this.serializeItem(currentItem),\n duration,\n error: callbackError?.message ?? null,\n trace_id: traceId || null, // null if no tracer configured (no-op)\n target_id: targetName,\n predicted,\n };\n\n this.batch.dataset.push(entry);\n this.scheduleSend();\n\n return {\n result: result!,\n duration,\n traceId,\n spanId,\n };\n }\n\n /**\n * Register a target for multi-target comparison\n */\n private registerTarget(name: string, metadata?: TargetMetadata): string {\n const existing = this.targets.get(name);\n\n if (existing) {\n // Check for metadata conflict\n if (metadata) {\n const existingMeta = existing.metadata ?? {};\n if (JSON.stringify(existingMeta) !== JSON.stringify(metadata)) {\n throw new TargetMetadataConflictError(name, existingMeta, metadata);\n }\n }\n return name;\n }\n\n // Register new target\n const targetInfo: TargetInfo = {\n id: name,\n name,\n type: \"custom\",\n metadata: metadata ?? null,\n };\n\n this.targets.set(name, targetInfo);\n this.batch.targets.push(targetInfo);\n\n return name;\n }\n\n /**\n * Schedule a debounced send\n */\n private scheduleSend(): void {\n const now = Date.now();\n\n if (now - this.lastSentMs >= DEBOUNCE_INTERVAL_MS) {\n this.sendBatch();\n } else {\n this.flushTimeout ??= setTimeout(() => {\n this.flushTimeout = null;\n this.sendBatch();\n }, DEBOUNCE_INTERVAL_MS - (now - this.lastSentMs));\n }\n }\n\n /**\n * Send current batch to the API\n */\n private sendBatch(finished = false): void {\n if (\n this.batch.dataset.length === 0 &&\n this.batch.evaluations.length === 0 &&\n this.batch.targets.length === 0 &&\n !finished\n ) {\n return;\n }\n\n const body: LogResultsRequest = {\n experiment_slug: this.experimentSlug,\n name: this.name,\n run_id: this.runId,\n dataset: this.batch.dataset.map((entry) => ({\n index: entry.index,\n entry: entry.entry,\n duration: entry.duration,\n error: entry.error,\n trace_id: entry.trace_id,\n target_id: entry.target_id ?? null,\n cost: entry.cost ?? null,\n predicted: entry.predicted ?? null,\n })),\n evaluations: this.batch.evaluations.map((e) => ({\n name: e.name,\n evaluator: e.evaluator,\n trace_id: e.trace_id,\n status: e.status,\n inputs: e.data,\n score: e.score,\n passed: e.passed,\n details: e.details,\n index: e.index,\n label: e.label,\n cost: e.cost,\n duration: e.duration,\n target_id: e.target_id,\n })),\n targets: this.batch.targets,\n progress: this.progress,\n total: this.total,\n timestamps: {\n created_at: this.createdAtMs,\n finished_at: finished ? Date.now() : null,\n },\n };\n\n // Fire and forget (with error logging)\n this.pendingFlush = fetch(`${this.endpoint}/api/evaluations/batch/log_results`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n })\n .then((response) => {\n if (!response.ok) {\n this.logger.error(`Failed to send batch: ${response.status}`);\n }\n })\n .catch((error) => {\n this.logger.error(\"Failed to send batch:\", error);\n });\n\n // Clear batch\n this.batch = { dataset: [], evaluations: [], targets: [] };\n this.lastSentMs = Date.now();\n }\n\n /**\n * Flush all pending data\n */\n private async flush(finished = false): Promise<void> {\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n\n this.sendBatch(finished);\n\n if (this.pendingFlush) {\n await this.pendingFlush;\n }\n }\n\n /**\n * Serialize a dataset item for the API\n */\n private serializeItem(item: unknown): unknown {\n if (item === null || item === undefined) {\n return item;\n }\n\n if (typeof item === \"object\") {\n // Handle objects with toJSON method\n if (\"toJSON\" in item && typeof (item as { toJSON: unknown }).toJSON === \"function\") {\n return (item as { toJSON: () => unknown }).toJSON();\n }\n // Return as-is, JSON.stringify will handle it\n return item;\n }\n\n return item;\n }\n\n /**\n * Get trace ID from current OpenTelemetry context\n */\n private getTraceIdFromContext(): string {\n const span = trace.getActiveSpan();\n if (span) {\n return span.spanContext().traceId;\n }\n return \"\";\n }\n\n /**\n * Get span ID from current OpenTelemetry context\n */\n private getSpanIdFromContext(): string | null {\n const span = trace.getActiveSpan();\n if (span) {\n return span.spanContext().spanId;\n }\n return null;\n }\n}\n","/**\n * Human-readable ID generator\n *\n * Generates memorable, human-readable identifiers using adjective-adjective-noun combinations.\n * Similar to Docker container names, Heroku app names, etc.\n */\n\nconst ADJECTIVES = [\n \"swift\", \"bright\", \"calm\", \"eager\", \"bold\", \"keen\", \"warm\", \"cool\", \"wise\", \"fair\",\n \"glad\", \"kind\", \"neat\", \"pure\", \"safe\", \"true\", \"vast\", \"wild\", \"zesty\", \"agile\",\n \"brave\", \"crisp\", \"dense\", \"epic\", \"fresh\", \"grand\", \"happy\", \"ideal\", \"jolly\", \"lively\",\n \"merry\", \"noble\", \"proud\", \"quick\", \"rapid\", \"sharp\", \"smart\", \"solid\", \"sunny\", \"vivid\",\n \"gentle\", \"silent\", \"cosmic\", \"golden\", \"silver\", \"ancient\", \"modern\", \"mighty\", \"humble\",\n];\n\nconst NOUNS = [\n \"fox\", \"owl\", \"bee\", \"elk\", \"hawk\", \"lynx\", \"wolf\", \"bear\", \"deer\", \"dove\",\n \"eagle\", \"finch\", \"heron\", \"koala\", \"lemur\", \"moose\", \"otter\", \"panda\", \"raven\", \"robin\",\n \"seal\", \"swan\", \"tiger\", \"whale\", \"zebra\", \"atlas\", \"bloom\", \"cloud\", \"delta\", \"ember\",\n \"flame\", \"grove\", \"haven\", \"iris\", \"jade\", \"leaf\", \"moon\", \"nova\", \"ocean\", \"peak\",\n \"river\", \"spark\", \"storm\", \"tide\", \"wave\", \"comet\", \"prism\", \"coral\",\n];\n\n/**\n * Generate a human-readable ID with 3 words like \"swift-bright-fox\"\n * Uses adjective-adjective-noun pattern for ~125,000 combinations.\n */\nexport const generateHumanReadableId = (separator = \"-\"): string => {\n // Pick two different adjectives\n const adj1Index = Math.floor(Math.random() * ADJECTIVES.length);\n let adj2Index = Math.floor(Math.random() * ADJECTIVES.length);\n if (adj2Index === adj1Index) {\n adj2Index = (adj2Index + 1) % ADJECTIVES.length;\n }\n\n const adjective1 = ADJECTIVES[adj1Index]!;\n const adjective2 = ADJECTIVES[adj2Index]!;\n const noun = NOUNS[Math.floor(Math.random() * NOUNS.length)]!;\n\n return `${adjective1}${separator}${adjective2}${separator}${noun}`;\n};\n","/**\n * Errors for the Evaluation API\n */\n\n/**\n * Base error for evaluation-related issues\n */\nexport class EvaluationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"EvaluationError\";\n }\n}\n\n/**\n * Thrown when initialization fails\n */\nexport class EvaluationInitError extends EvaluationError {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"EvaluationInitError\";\n }\n}\n\n/**\n * Thrown when API calls fail\n */\nexport class EvaluationApiError extends EvaluationError {\n constructor(\n message: string,\n public readonly statusCode?: number,\n public readonly cause?: Error\n ) {\n super(message);\n this.name = \"EvaluationApiError\";\n }\n}\n\n/**\n * Thrown when target metadata conflicts\n */\nexport class TargetMetadataConflictError extends EvaluationError {\n constructor(\n public readonly targetName: string,\n public readonly existingMetadata: Record<string, unknown>,\n public readonly newMetadata: Record<string, unknown>\n ) {\n super(\n `Target '${targetName}' was previously registered with different metadata.\\n` +\n `Original: ${JSON.stringify(existingMetadata)}\\n` +\n `New: ${JSON.stringify(newMetadata)}\\n` +\n `If you want to use different metadata, please use a different target name.`\n );\n this.name = \"TargetMetadataConflictError\";\n }\n}\n\n/**\n * Thrown when an evaluator call fails\n */\nexport class EvaluatorError extends EvaluationError {\n constructor(\n public readonly evaluatorSlug: string,\n message: string,\n public readonly cause?: Error\n ) {\n super(`Evaluator '${evaluatorSlug}' failed: ${message}`);\n this.name = \"EvaluatorError\";\n }\n}\n","/**\n * Error classes for platform evaluations API (Evaluations V3)\n */\n\n/**\n * Base error for evaluation operations\n */\nexport class EvaluationsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"EvaluationsError\";\n }\n}\n\n/**\n * Error when evaluation is not found\n */\nexport class EvaluationNotFoundError extends EvaluationsError {\n constructor(slug: string) {\n super(`Evaluation not found: ${slug}`);\n this.name = \"EvaluationNotFoundError\";\n }\n}\n\n/**\n * Error when evaluation run times out\n */\nexport class EvaluationTimeoutError extends EvaluationsError {\n readonly runId: string;\n readonly progress: number;\n readonly total: number;\n\n constructor(runId: string, progress: number, total: number) {\n super(`Evaluation run timed out: ${runId} (${progress}/${total} completed)`);\n this.name = \"EvaluationTimeoutError\";\n this.runId = runId;\n this.progress = progress;\n this.total = total;\n }\n}\n\n/**\n * Error when evaluation run fails\n */\nexport class EvaluationRunFailedError extends EvaluationsError {\n readonly runId: string;\n readonly errorMessage: string;\n\n constructor(runId: string, errorMessage: string) {\n super(`Evaluation run failed: ${errorMessage}`);\n this.name = \"EvaluationRunFailedError\";\n this.runId = runId;\n this.errorMessage = errorMessage;\n }\n}\n\n/**\n * Error from the evaluations API\n */\nexport class EvaluationsApiError extends EvaluationsError {\n readonly statusCode: number;\n\n constructor(message: string, statusCode: number) {\n super(message);\n this.name = \"EvaluationsApiError\";\n this.statusCode = statusCode;\n }\n}\n","/**\n * EvaluationFacade - Entry point for the evaluation API\n *\n * Provides:\n * - `init()` method to create evaluation sessions (SDK-defined evaluations)\n * - `run()` method to execute platform-configured evaluations (Evaluations V3)\n */\n\nimport type { LangwatchApiClient } from \"@/internal/api/client\";\nimport type { Logger } from \"@/logger\";\nimport { Evaluation } from \"./evaluation\";\nimport type { EvaluationInitOptions } from \"./types\";\nimport type {\n EvaluationRunResult,\n RunEvaluationOptions,\n EvaluationRunSummary,\n} from \"./platformTypes\";\nimport {\n EvaluationsApiError,\n EvaluationNotFoundError,\n EvaluationTimeoutError,\n EvaluationRunFailedError,\n} from \"./platformErrors\";\n\nconst DEFAULT_POLL_INTERVAL = 2000;\nconst DEFAULT_TIMEOUT = 600000; // 10 minutes\n\ntype EvaluationFacadeConfig = {\n langwatchApiClient: LangwatchApiClient;\n endpoint: string;\n apiKey: string;\n logger: Logger;\n};\n\n/**\n * Facade for creating evaluation sessions and running platform-configured evaluations\n */\nexport class EvaluationFacade {\n private readonly config: EvaluationFacadeConfig;\n\n constructor(config: EvaluationFacadeConfig) {\n this.config = config;\n }\n\n /**\n * Initialize a new evaluation session (SDK-defined)\n *\n * @param name - Name of the experiment (used as slug)\n * @param options - Optional configuration\n * @returns An initialized Evaluation instance\n *\n * @example\n * ```typescript\n * const evaluation = await langwatch.evaluation.init('my-experiment');\n *\n * await evaluation.run(dataset, async ({ item, index }) => {\n * const response = await myAgent(item.question);\n * evaluation.log('accuracy', { index, score: 0.95 });\n * });\n * ```\n */\n async init(name: string, options?: EvaluationInitOptions): Promise<Evaluation> {\n return Evaluation.init(name, {\n apiClient: this.config.langwatchApiClient,\n endpoint: this.config.endpoint,\n apiKey: this.config.apiKey,\n logger: this.config.logger,\n ...options,\n });\n }\n\n /**\n * Run a platform-configured evaluation (Evaluations V3)\n *\n * This runs an evaluation that was configured in the LangWatch platform.\n * The method automatically prints a summary and exits with code 1 on failure\n * (unless `exitOnFailure: false` is passed).\n *\n * @param slug - The slug of the evaluation (found in the evaluation URL)\n * @param options - Optional configuration\n * @returns The evaluation results including pass rate and summary\n *\n * @example\n * ```typescript\n * import { LangWatch } from \"langwatch\";\n *\n * const langwatch = new LangWatch();\n *\n * const result = await langwatch.evaluation.run(\"my-evaluation-slug\");\n * result.printSummary();\n * ```\n */\n async run(slug: string, options?: RunEvaluationOptions): Promise<EvaluationRunResult> {\n this.config.logger.info(`Running platform evaluation: ${slug}`);\n const result = await this.runWithPolling(slug, options);\n return result;\n }\n\n /**\n * Run an evaluation and wait for completion using polling\n */\n private async runWithPolling(\n slug: string,\n options: RunEvaluationOptions = {}\n ): Promise<EvaluationRunResult> {\n const pollInterval = options.pollInterval ?? DEFAULT_POLL_INTERVAL;\n const timeout = options.timeout ?? DEFAULT_TIMEOUT;\n\n // Start the run\n const startResponse = await this.startRun(slug);\n const { runId } = startResponse;\n\n // Use the run URL from API but replace domain with configured endpoint\n const apiRunUrl = startResponse.runUrl ?? \"\";\n const runUrl = apiRunUrl ? this.replaceUrlDomain(apiRunUrl, this.config.endpoint) : \"\";\n\n console.log(`Started evaluation run: ${runId}`);\n if (runUrl) {\n console.log(`Follow live: ${runUrl}`);\n }\n\n const total = startResponse.total;\n let lastProgress = 0;\n\n // Print initial progress\n if (total > 0) {\n process.stdout.write(`Progress: 0/${total} (0%)`);\n }\n options.onProgress?.(0, total);\n\n const startTime = Date.now();\n\n // Poll until complete\n while (true) {\n if (Date.now() - startTime > timeout) {\n console.log(); // Newline after progress\n const finalStatus = await this.getRunStatus(runId);\n throw new EvaluationTimeoutError(runId, finalStatus.progress, finalStatus.total);\n }\n\n await this.sleep(pollInterval);\n\n const status = await this.getRunStatus(runId);\n const progress = status.progress;\n\n // Update progress display if changed\n if (progress !== lastProgress && status.total > 0) {\n const percentage = Math.round((progress / status.total) * 100);\n process.stdout.write(`\\rProgress: ${progress}/${status.total} (${percentage}%)`);\n lastProgress = progress;\n }\n\n options.onProgress?.(status.progress, status.total);\n\n if (status.status === \"completed\") {\n console.log(); // Newline after progress\n const summary = status.summary!;\n return this.buildResult(runId, \"completed\", summary, runUrl ?? \"\");\n }\n\n if (status.status === \"failed\") {\n console.log(); // Newline after progress\n throw new EvaluationRunFailedError(runId, status.error ?? \"Unknown error\");\n }\n\n if (status.status === \"stopped\") {\n console.log(); // Newline after progress\n return this.buildResult(runId, \"stopped\", status.summary ?? {\n runId,\n totalCells: status.total,\n completedCells: status.progress,\n failedCells: 0,\n duration: Date.now() - startTime,\n }, runUrl ?? \"\");\n }\n }\n }\n\n /**\n * Start an evaluation run\n */\n private async startRun(slug: string): Promise<{ runId: string; total: number; runUrl?: string }> {\n const response = await this.config.langwatchApiClient.POST(\n \"/api/evaluations/v3/{slug}/run\",\n {\n params: {\n path: { slug },\n },\n }\n );\n\n if (response.error) {\n const status = response.response.status;\n\n if (status === 404) {\n throw new EvaluationNotFoundError(slug);\n }\n\n if (status === 401) {\n throw new EvaluationsApiError(\"Unauthorized - check your API key\", 401);\n }\n\n const errorMessage =\n \"error\" in response.error ? response.error.error : `Failed to start evaluation: ${slug}`;\n throw new EvaluationsApiError(errorMessage ?? `HTTP ${status}`, status);\n }\n\n return response.data as { runId: string; total: number; runUrl?: string };\n }\n\n /**\n * Get the status of a run\n */\n private async getRunStatus(runId: string): Promise<{\n status: string;\n progress: number;\n total: number;\n summary?: EvaluationRunSummary;\n error?: string;\n }> {\n const response = await this.config.langwatchApiClient.GET(\n \"/api/evaluations/v3/runs/{runId}\",\n {\n params: {\n path: { runId },\n },\n }\n );\n\n if (response.error) {\n const status = response.response.status;\n\n if (status === 404) {\n throw new EvaluationsApiError(`Run not found: ${runId}`, 404);\n }\n\n if (status === 401) {\n throw new EvaluationsApiError(\"Unauthorized - check your API key\", 401);\n }\n\n const errorMessage =\n \"error\" in response.error ? response.error.error : `Failed to get run status: ${runId}`;\n throw new EvaluationsApiError(errorMessage ?? `HTTP ${status}`, status);\n }\n\n return response.data as {\n status: string;\n progress: number;\n total: number;\n summary?: EvaluationRunSummary;\n error?: string;\n };\n }\n\n /**\n * Build the result object from API response\n */\n private buildResult(\n runId: string,\n status: \"completed\" | \"failed\" | \"stopped\",\n summary: EvaluationRunSummary,\n runUrl: string\n ): EvaluationRunResult {\n const totalCells = summary.totalCells ?? 0;\n const completedCells = summary.completedCells ?? 0;\n const failedCells = summary.failedCells ?? 0;\n const duration = summary.duration ?? 0;\n\n const totalPassed = summary.totalPassed ?? completedCells - failedCells;\n const totalFailed = summary.totalFailed ?? failedCells;\n const passRate = summary.passRate ??\n (completedCells > 0 ? (totalPassed / completedCells) * 100 : 0);\n\n return {\n runId,\n status,\n passed: totalPassed,\n failed: totalFailed,\n passRate,\n duration,\n runUrl, // Always use the endpoint-based URL we constructed\n summary,\n printSummary: (exitOnFailure = true) => {\n this.printSummary({\n runId,\n status,\n passed: totalPassed,\n failed: totalFailed,\n passRate,\n duration,\n runUrl: summary.runUrl ?? runUrl,\n summary,\n });\n\n if (exitOnFailure && totalFailed > 0) {\n process.exit(1);\n }\n },\n };\n }\n\n /**\n * Print a CI-friendly summary of the evaluation results\n */\n private printSummary(result: Omit<EvaluationRunResult, \"printSummary\">): void {\n const { runId, status, passed, failed, passRate, duration, runUrl, summary } = result;\n\n console.log(\"\\n\" + \"═\".repeat(60));\n console.log(\" EVALUATION RESULTS\");\n console.log(\"═\".repeat(60));\n console.log(` Run ID: ${runId}`);\n console.log(` Status: ${status.toUpperCase()}`);\n console.log(` Duration: ${(duration / 1000).toFixed(1)}s`);\n console.log(\"─\".repeat(60));\n console.log(` Passed: ${passed}`);\n console.log(` Failed: ${failed}`);\n console.log(` Pass Rate: ${passRate.toFixed(1)}%`);\n\n if (summary.targets && summary.targets.length > 0) {\n console.log(\"─\".repeat(60));\n console.log(\" TARGETS:\");\n for (const target of summary.targets) {\n console.log(` ${target.name}: ${target.passed} passed, ${target.failed} failed`);\n if (target.avgLatency) {\n console.log(` Avg latency: ${target.avgLatency.toFixed(0)}ms`);\n }\n if (target.totalCost) {\n console.log(` Total cost: $${target.totalCost.toFixed(4)}`);\n }\n }\n }\n\n if (summary.evaluators && summary.evaluators.length > 0) {\n console.log(\"─\".repeat(60));\n console.log(\" EVALUATORS:\");\n for (const evaluator of summary.evaluators) {\n console.log(\n ` ${evaluator.name}: ${evaluator.passRate.toFixed(1)}% pass rate`\n );\n if (evaluator.avgScore !== undefined) {\n console.log(` Avg score: ${evaluator.avgScore.toFixed(2)}`);\n }\n }\n }\n\n console.log(\"─\".repeat(60));\n console.log(` View details: ${runUrl}`);\n console.log(\"═\".repeat(60) + \"\\n\");\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Replace the domain of a URL with a new base URL, preserving the path\n */\n private replaceUrlDomain(url: string, newBase: string): string {\n if (!url) return url;\n\n try {\n const parsedUrl = new URL(url);\n const parsedNewBase = new URL(newBase);\n\n // Replace origin with new base, keep path/query/fragment\n return `${parsedNewBase.origin}${parsedUrl.pathname}${parsedUrl.search}${parsedUrl.hash}`;\n } catch {\n // If URL parsing fails, return original\n return url;\n }\n }\n}\n","import type { paths } from \"@/internal/generated/openapi/api-client\";\n\nexport interface GetTraceParams {\n includeSpans?: boolean;\n}\n\nexport type GetTraceResponse = NonNullable<\n paths[\"/api/trace/{id}\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n>;\n\n/**\n * Custom error class for Traces API operations.\n * Provides context about the failed operation and the original error.\n */\nexport class TracesError extends Error {\n constructor(\n message: string,\n public readonly operation: string,\n public readonly originalError?: any,\n ) {\n super(message);\n this.name = \"TracesError\";\n }\n}\n","import { LANGWATCH_SDK_NAME_CLIENT, LANGWATCH_SDK_VERSION } from \"@/internal/constants\";\nimport { getLangWatchTracer } from \"@/observability-sdk/tracer\";\n\nexport const tracer = getLangWatchTracer(`${LANGWATCH_SDK_NAME_CLIENT}.traces`, LANGWATCH_SDK_VERSION);\n","import { createTracingProxy } from \"@/client-sdk/tracing/create-tracing-proxy\";\nimport { type InternalConfig } from \"@/client-sdk/types\";\nimport { type GetTraceParams, TracesError, type GetTraceResponse } from \"./types\";\nimport { tracer } from \"./tracing\";\n\n/**\n * Service for managing trace resources via the Langwatch API.\n * Constructor creates a proxy that wraps the service and traces all methods.\n *\n * Responsibilities:\n * - Retrieving trace data\n * - Error handling with contextual information\n *\n * All methods return trace response objects directly.\n */\nexport class TracesService {\n private config: InternalConfig;\n\n constructor(config: InternalConfig) {\n this.config = config;\n\n /**\n * Wraps the service in a tracing proxy via the decorator.\n */\n return createTracingProxy(\n this as TracesService,\n tracer,\n );\n }\n\n /**\n * Handles API errors by throwing a TracesError with operation context.\n * @param operation Description of the operation being performed.\n * @param error The error object returned from the API client.\n * @throws {TracesError}\n */\n private handleApiError(operation: string, error: any): never {\n const errorMessage =\n typeof error === \"string\"\n ? error\n : error?.error ?? error?.message ?? \"Unknown error occurred\";\n throw new TracesError(\n `Failed to ${operation}: ${errorMessage}`,\n operation,\n error,\n );\n }\n\n /**\n * Retrieves a trace by its ID.\n * @param traceId The trace's unique identifier.\n * @param params Optional parameters for the request.\n * @returns The trace response object.\n * @throws {TracesError} If the API call fails.\n */\n async get(\n traceId: string,\n params?: GetTraceParams,\n ): Promise<GetTraceResponse> {\n const { data, error } = await this.config.langwatchApiClient.GET(\"/api/trace/{id}\", {\n params: {\n path: {\n id: traceId,\n },\n },\n query: params,\n });\n\n if (error) {\n this.handleApiError(\"get trace\", error);\n }\n\n return data;\n }\n}\n","import { type InternalConfig } from \"../../types\";\nimport { TracesService } from \"./service\";\nimport { type GetTraceParams, type GetTraceResponse } from \"./types\";\n\nexport class TracesFacade {\n readonly #service: TracesService;\n\n constructor(config: InternalConfig) {\n this.#service = new TracesService(config);\n }\n\n async get(traceId: string, params?: GetTraceParams): Promise<GetTraceResponse> {\n return this.#service.get(traceId, params);\n }\n}\n","import { PromptsFacade, PromptsApiService } from \"./services/prompts\";\nexport { FetchPolicy, type GetPromptOptions } from \"./services/prompts\";\nexport type { Dataset, DatasetEntry, GetDatasetOptions } from \"./services/datasets\";\nexport { DatasetError, DatasetNotFoundError, DatasetApiError } from \"./services/datasets\";\nexport type { EvaluationRunResult, RunEvaluationOptions } from \"./services/evaluation\";\nexport {\n EvaluationsError,\n EvaluationNotFoundError,\n EvaluationTimeoutError,\n EvaluationRunFailedError,\n EvaluationsApiError,\n} from \"./services/evaluation\";\nimport { LocalPromptsService } from \"./services/prompts/local-prompts.service\";\nimport { EvaluationFacade } from \"./services/evaluation\";\nimport { DatasetsFacade } from \"./services/datasets\";\nimport { type InternalConfig } from \"./types\";\nimport { createLangWatchApiClient, type LangwatchApiClient } from \"../internal/api/client\";\nimport { type Logger, NoOpLogger } from \"../logger\";\nimport { TracesFacade } from \"./services/traces/facade\";\nimport { DEFAULT_ENDPOINT } from \"@/internal/constants\";\n\nexport interface LangWatchConstructorOptions {\n apiKey?: string;\n endpoint?: string;\n options?: {\n logger?: Logger;\n };\n}\n\nexport class LangWatch {\n private readonly config: InternalConfig & { endpoint: string; apiKey: string };\n\n readonly prompts: PromptsFacade;\n readonly traces: TracesFacade;\n readonly evaluation: EvaluationFacade;\n readonly datasets: DatasetsFacade;\n\n constructor(options: LangWatchConstructorOptions = {}) {\n const apiKey = options.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n const endpoint = options.endpoint ?? process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT;\n\n this.config = this.#createInternalConfig({\n apiKey,\n endpoint,\n options: options.options,\n });\n\n this.prompts = new PromptsFacade({\n promptsApiService: new PromptsApiService(this.config),\n localPromptsService: new LocalPromptsService(),\n ...this.config,\n });\n this.traces = new TracesFacade(this.config);\n this.evaluation = new EvaluationFacade({\n langwatchApiClient: this.config.langwatchApiClient,\n endpoint: this.config.endpoint,\n apiKey: this.config.apiKey,\n logger: this.config.logger,\n });\n this.datasets = new DatasetsFacade({\n langwatchApiClient: this.config.langwatchApiClient,\n logger: this.config.logger,\n });\n }\n\n get apiClient(): LangwatchApiClient {\n return this.config.langwatchApiClient;\n }\n\n #createInternalConfig({\n apiKey,\n endpoint,\n options,\n }: {\n apiKey: string;\n endpoint: string;\n options?: LangWatchConstructorOptions[\"options\"];\n }): InternalConfig & { endpoint: string; apiKey: string } {\n return {\n logger: options?.logger ?? new NoOpLogger(),\n langwatchApiClient: createLangWatchApiClient(apiKey, endpoint),\n endpoint,\n apiKey,\n };\n }\n}\n","import { ConsoleLogger, NoOpLogger } from \"./logger\";\n\nexport {\n getLangWatchTracer,\n getLangWatchLogger,\n attributes,\n} from \"./observability-sdk\";\n\nexport {\n FilterableBatchSpanProcessor,\n type SpanProcessingExcludeRule,\n} from \"./observability-sdk/processors\";\nexport { LangWatchExporter } from \"./observability-sdk/exporters\";\nexport { LangWatch, FetchPolicy, type GetPromptOptions } from \"./client-sdk\";\n\n// Evaluation API exports\nexport {\n Evaluation,\n EvaluationFacade,\n type EvaluationStatus,\n type TargetType,\n type TargetMetadata,\n type TargetInfo,\n type EvaluationResult,\n type EvaluationInitOptions,\n type LogOptions,\n type EvaluateOptions,\n type RunOptions,\n type RunCallback,\n type RunContext,\n EvaluationError,\n EvaluationInitError,\n EvaluationApiError,\n TargetMetadataConflictError,\n EvaluatorError,\n} from \"./client-sdk/services/evaluation\";\n\nexport const logger = {\n ConsoleLogger,\n NoOpLogger,\n};\n"]}