judgeval 1.0.1 → 1.2.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 (120) hide show
  1. package/dist/Judgeval.d.ts +3 -0
  2. package/dist/Judgeval.d.ts.map +1 -1
  3. package/dist/data/Example.d.ts.map +1 -1
  4. package/dist/datasets/DatasetFactory.d.ts +4 -2
  5. package/dist/datasets/DatasetFactory.d.ts.map +1 -1
  6. package/dist/datasets/schema.d.ts +39 -0
  7. package/dist/datasets/schema.d.ts.map +1 -0
  8. package/dist/evaluation/EvaluatorRunner.d.ts.map +1 -1
  9. package/dist/index.d.ts +2 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/internal/api/client.d.ts +25 -9
  12. package/dist/internal/api/client.d.ts.map +1 -1
  13. package/dist/internal/api/models/AddDatasetItemsResponse.d.ts +5 -0
  14. package/dist/internal/api/models/AddDatasetItemsResponse.d.ts.map +1 -0
  15. package/dist/internal/api/models/ApplyTestRunSuccessRequest.d.ts +7 -0
  16. package/dist/internal/api/models/ApplyTestRunSuccessRequest.d.ts.map +1 -0
  17. package/dist/internal/api/models/ApplyTestRunSuccessResponse.d.ts +4 -0
  18. package/dist/internal/api/models/ApplyTestRunSuccessResponse.d.ts.map +1 -0
  19. package/dist/internal/api/models/CreateOfflineDatasetRequest.d.ts +9 -0
  20. package/dist/internal/api/models/CreateOfflineDatasetRequest.d.ts.map +1 -0
  21. package/dist/internal/api/models/CreateOfflineDatasetResponse.d.ts +18 -0
  22. package/dist/internal/api/models/CreateOfflineDatasetResponse.d.ts.map +1 -0
  23. package/dist/internal/api/models/CreateTestConfigRequest.d.ts +12 -0
  24. package/dist/internal/api/models/CreateTestConfigRequest.d.ts.map +1 -0
  25. package/dist/internal/api/models/CreateTestRunRequest.d.ts +20 -0
  26. package/dist/internal/api/models/CreateTestRunRequest.d.ts.map +1 -0
  27. package/dist/internal/api/models/DeleteOfflineDatasetResponse.d.ts +5 -0
  28. package/dist/internal/api/models/DeleteOfflineDatasetResponse.d.ts.map +1 -0
  29. package/dist/internal/api/models/DeleteTestConfigResponse.d.ts +5 -0
  30. package/dist/internal/api/models/DeleteTestConfigResponse.d.ts.map +1 -0
  31. package/dist/internal/api/models/Example.d.ts +1 -0
  32. package/dist/internal/api/models/Example.d.ts.map +1 -1
  33. package/dist/internal/api/models/FetchTestRunViaExperimentAliasResponse.d.ts +42 -0
  34. package/dist/internal/api/models/FetchTestRunViaExperimentAliasResponse.d.ts.map +1 -0
  35. package/dist/internal/api/models/InsertOfflineDatasetExamplesRequest.d.ts +4 -0
  36. package/dist/internal/api/models/InsertOfflineDatasetExamplesRequest.d.ts.map +1 -0
  37. package/dist/internal/api/models/OfflineDatasetPageResponse.d.ts +44 -0
  38. package/dist/internal/api/models/OfflineDatasetPageResponse.d.ts.map +1 -0
  39. package/dist/internal/api/models/OfflineDatasetVersionsResponse.d.ts +13 -0
  40. package/dist/internal/api/models/OfflineDatasetVersionsResponse.d.ts.map +1 -0
  41. package/dist/internal/api/models/OfflineTestsLocalScorerResult.d.ts +15 -0
  42. package/dist/internal/api/models/OfflineTestsLocalScorerResult.d.ts.map +1 -0
  43. package/dist/internal/api/models/OfflineTestsLogEvalResultsExamplesRequest.d.ts +7 -0
  44. package/dist/internal/api/models/OfflineTestsLogEvalResultsExamplesRequest.d.ts.map +1 -0
  45. package/dist/internal/api/models/OfflineTestsLogEvalResultsExamplesResponse.d.ts +4 -0
  46. package/dist/internal/api/models/OfflineTestsLogEvalResultsExamplesResponse.d.ts.map +1 -0
  47. package/dist/internal/api/models/OfflineTestsLogEvalResultsRequest.d.ts +7 -0
  48. package/dist/internal/api/models/OfflineTestsLogEvalResultsRequest.d.ts.map +1 -0
  49. package/dist/internal/api/models/OfflineTestsLogEvalResultsResponse.d.ts +4 -0
  50. package/dist/internal/api/models/OfflineTestsLogEvalResultsResponse.d.ts.map +1 -0
  51. package/dist/internal/api/models/PreparedTestRunResponse.d.ts +70 -0
  52. package/dist/internal/api/models/PreparedTestRunResponse.d.ts.map +1 -0
  53. package/dist/internal/api/models/PullAllOfflineDatasetsResponse.d.ts +14 -0
  54. package/dist/internal/api/models/PullAllOfflineDatasetsResponse.d.ts.map +1 -0
  55. package/dist/internal/api/models/PullOfflineDatasetResponse.d.ts +24 -0
  56. package/dist/internal/api/models/PullOfflineDatasetResponse.d.ts.map +1 -0
  57. package/dist/internal/api/models/SDKUpdateAgentJudgeRequest.d.ts +1 -1
  58. package/dist/internal/api/models/SDKUpdateAgentJudgeRequest.d.ts.map +1 -1
  59. package/dist/internal/api/models/SDKUpdateAgentJudgeResponse.d.ts +1 -0
  60. package/dist/internal/api/models/SDKUpdateAgentJudgeResponse.d.ts.map +1 -1
  61. package/dist/internal/api/models/TestConfigResponse.d.ts +29 -0
  62. package/dist/internal/api/models/TestConfigResponse.d.ts.map +1 -0
  63. package/dist/internal/api/models/TestConfigsResponse.d.ts +29 -0
  64. package/dist/internal/api/models/TestConfigsResponse.d.ts.map +1 -0
  65. package/dist/internal/api/models/TestRunGraphResponse.d.ts +4 -0
  66. package/dist/internal/api/models/TestRunGraphResponse.d.ts.map +1 -0
  67. package/dist/internal/api/models/TestRunItemsResponse.d.ts +41 -0
  68. package/dist/internal/api/models/TestRunItemsResponse.d.ts.map +1 -0
  69. package/dist/internal/api/models/TestRunResponse.d.ts +21 -0
  70. package/dist/internal/api/models/TestRunResponse.d.ts.map +1 -0
  71. package/dist/internal/api/models/TestRunsResponse.d.ts +20 -0
  72. package/dist/internal/api/models/TestRunsResponse.d.ts.map +1 -0
  73. package/dist/internal/api/models/UpdateTestConfigRequest.d.ts +5 -0
  74. package/dist/internal/api/models/UpdateTestConfigRequest.d.ts.map +1 -0
  75. package/dist/internal/api/models/UpdateTestRunStatusRequest.d.ts +5 -0
  76. package/dist/internal/api/models/UpdateTestRunStatusRequest.d.ts.map +1 -0
  77. package/dist/internal/api/models/index.d.ts +29 -15
  78. package/dist/internal/api/models/index.d.ts.map +1 -1
  79. package/dist/node/index.cjs +7 -0
  80. package/dist/node/index.cjs.map +70 -0
  81. package/dist/node/index.d.ts +1 -0
  82. package/dist/node/index.mjs +7 -0
  83. package/dist/node/index.mjs.map +70 -0
  84. package/dist/offline-tests/OfflineTestRunner.d.ts +58 -0
  85. package/dist/offline-tests/OfflineTestRunner.d.ts.map +1 -0
  86. package/dist/offline-tests/OfflineTestsFactory.d.ts +59 -0
  87. package/dist/offline-tests/OfflineTestsFactory.d.ts.map +1 -0
  88. package/dist/offline-tests/index.d.ts +4 -0
  89. package/dist/offline-tests/index.d.ts.map +1 -0
  90. package/dist/offline-tests/types.d.ts +90 -0
  91. package/dist/offline-tests/types.d.ts.map +1 -0
  92. package/dist/offline-tests/utils.d.ts +19 -0
  93. package/dist/offline-tests/utils.d.ts.map +1 -0
  94. package/dist/trace/BaseTracer.d.ts +5 -0
  95. package/dist/trace/BaseTracer.d.ts.map +1 -1
  96. package/dist/trace/JudgmentTracerProvider.d.ts +0 -1
  97. package/dist/trace/JudgmentTracerProvider.d.ts.map +1 -1
  98. package/dist/trace/NoOpTracer.d.ts +14 -0
  99. package/dist/trace/NoOpTracer.d.ts.map +1 -0
  100. package/dist/trace/processors/JudgmentSpanProcessor.d.ts.map +1 -1
  101. package/dist/trace/runtime.d.ts +57 -0
  102. package/dist/trace/runtime.d.ts.map +1 -0
  103. package/dist/utils/retry.d.ts.map +1 -1
  104. package/dist/utils/sleep.d.ts +3 -0
  105. package/dist/utils/sleep.d.ts.map +1 -0
  106. package/dist/workers/Tracer.d.ts +26 -0
  107. package/dist/workers/Tracer.d.ts.map +1 -0
  108. package/dist/workers/WorkerSpanExporter.d.ts +19 -0
  109. package/dist/workers/WorkerSpanExporter.d.ts.map +1 -0
  110. package/dist/workers/WorkerTracerProvider.d.ts +30 -0
  111. package/dist/workers/WorkerTracerProvider.d.ts.map +1 -0
  112. package/dist/workers/index.d.ts +10 -0
  113. package/dist/workers/index.d.ts.map +1 -0
  114. package/dist/workers/index.mjs +6 -0
  115. package/dist/workers/index.mjs.map +42 -0
  116. package/package.json +20 -7
  117. package/dist/index.cjs +0 -7
  118. package/dist/index.cjs.map +0 -62
  119. package/dist/index.mjs +0 -7
  120. package/dist/index.mjs.map +0 -62
@@ -0,0 +1,70 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/env.ts", "../src/internal/api/client.ts", "../src/utils/logger.ts", "../src/utils/sleep.ts", "../src/utils/retry.ts", "../src/utils/resolve-project-id.ts", "../node_modules/picocolors/picocolors.js", "../src/data/Example.ts", "../src/utils/serializer.ts", "../src/version.ts", "../src/utils/dont-throw.ts", "../src/utils/wrappers/immutable-wrap-sync.ts", "../src/utils/wrappers/immutable-wrap-async.ts", "../src/utils/wrappers/immutable-wrap-sync-iterator.ts", "../src/utils/wrappers/immutable-wrap-async-iterator.ts", "../src/utils/wrappers/proxy-async-iterable.ts", "../src/utils/wrappers/index.ts", "../src/instrumentation/llm/openai/utils.ts", "../src/instrumentation/llm/openai/beta-chat-completions.ts", "../src/instrumentation/llm/openai/chat-completions.ts", "../src/instrumentation/llm/openai/images.ts", "../src/instrumentation/llm/openai/responses.ts", "../src/instrumentation/llm/openai/index.ts", "../src/instrumentation/index.ts", "../src/utils/annotate.ts", "../src/trace/NoOpTracer.ts", "../src/trace/runtime.ts", "../src/trace/baggage/constants.ts", "../src/trace/baggage/utils.ts", "../src/trace/baggage/JudgmentBaggagePropagator.ts", "../src/trace/baggage/index.ts", "../src/trace/propagation/index.ts", "../src/trace/BaseTracer.ts", "../src/trace/instrumentation/OtelContextBridge.ts", "../src/trace/JudgmentTracerProvider.ts", "../src/trace/exporters/JudgmentSpanExporter.ts", "../src/trace/exporters/NoOpSpanExporter.ts", "../src/trace/processors/JudgmentBaggageSpanProcessor.ts", "../src/trace/processors/JudgmentSpanProcessor.ts", "../src/trace/processors/NoOpSpanProcessor.ts", "../src/trace/Tracer.ts", "../src/trace/processors/OfflineJudgmentSpanProcessor.ts", "../src/trace/OfflineTracer.ts", "../src/Judgeval.ts", "../src/judges/Judge.ts", "../src/evaluation/Evaluation.ts", "../src/evaluation/LocalEvaluatorRunner.ts", "../src/evaluation/EvaluatorRunner.ts", "../src/evaluation/HostedEvaluatorRunner.ts", "../src/evaluation/EvaluationFactory.ts", "../src/datasets/DatasetFactory.ts", "../src/datasets/Dataset.ts", "../src/datasets/schema.ts", "../src/agent-judges/AgentJudgeFactory.ts", "../src/offline-tests/OfflineTestsFactory.ts", "../src/offline-tests/OfflineTestRunner.ts", "../src/offline-tests/types.ts", "../src/offline-tests/utils.ts", "../src/trace/index.ts", "../src/index.ts", "../src/data/index.ts"],
4
+ "sourcesContent": [
5
+ "function getEnvVar(varName: string): string | null;\nfunction getEnvVar(varName: string, defaultValue: string): string;\nfunction getEnvVar(varName: string, defaultValue?: string): string | null {\n const value = process.env[varName];\n if (!value) {\n return defaultValue ?? null;\n }\n return value;\n}\n\nexport const JUDGMENT_API_KEY = getEnvVar(\"JUDGMENT_API_KEY\");\nexport const JUDGMENT_ORG_ID = getEnvVar(\"JUDGMENT_ORG_ID\");\nexport const JUDGMENT_API_URL = getEnvVar(\n \"JUDGMENT_API_URL\",\n \"https://api.judgmentlabs.ai\",\n);\nexport const JUDGMENT_LOG_LEVEL = getEnvVar(\"JUDGMENT_LOG_LEVEL\", \"warn\");\n",
6
+ "// Auto-generated by scripts/generate-client.ts\n// DO NOT EDIT MANUALLY\n\nimport type {\n AddDatasetItemsResponse,\n AddProjectRequest,\n AddProjectResponse,\n AddToRunEvalQueueExamplesResponse,\n AddToRunEvalQueueTracesResponse,\n AddTraceTagsRequest,\n AddTraceTagsResponse,\n ApplyTestRunSuccessRequest,\n ApplyTestRunSuccessResponse,\n CreateOfflineDatasetRequest,\n CreateOfflineDatasetResponse,\n CreateTestConfigRequest,\n CreateTestRunRequest,\n CustomScorerExistsResponse,\n DeleteOfflineDatasetResponse,\n DeleteProjectResponse,\n DeleteTestConfigResponse,\n E2EFetchSpanScoreRequest,\n E2EFetchSpanScoreResponse,\n E2EFetchTraceResponse,\n ExampleEvaluationRun,\n FetchPromptResponse,\n FetchPromptScorersResponse,\n FetchTestRunViaExperimentAliasResponse,\n GetPromptVersionsResponse,\n InsertOfflineDatasetExamplesRequest,\n InsertPromptRequest,\n InsertPromptResponse,\n OfflineDatasetPageResponse,\n OfflineDatasetVersionsResponse,\n OfflineTestsLogEvalResultsExamplesRequest,\n OfflineTestsLogEvalResultsExamplesResponse,\n OfflineTestsLogEvalResultsRequest,\n OfflineTestsLogEvalResultsResponse,\n PreparedTestRunResponse,\n PullAllOfflineDatasetsResponse,\n PullOfflineDatasetResponse,\n ResolveProjectRequest,\n ResolveProjectResponse,\n SDKCreateAgentJudgeRequest,\n SDKCreateAgentJudgeResponse,\n SDKUpdateAgentJudgeRequest,\n SDKUpdateAgentJudgeResponse,\n ScorerExistsResponse,\n TagPromptRequest,\n TagPromptResponse,\n TestConfigResponse,\n TestConfigsResponse,\n TestRunGraphResponse,\n TestRunItemsResponse,\n TestRunResponse,\n TestRunsResponse,\n TraceEvaluationRun,\n UntagPromptRequest,\n UntagPromptResponse,\n UpdateTestConfigRequest,\n UpdateTestRunStatusRequest,\n UploadCustomScorerResponse,\n} from \"./models\";\n\nexport class JudgmentApiClient {\n private baseUrl: string;\n private apiKey: string;\n private organizationId: string;\n\n constructor(baseUrl: string, apiKey: string, organizationId: string) {\n this.baseUrl = baseUrl;\n this.apiKey = apiKey;\n this.organizationId = organizationId;\n }\n\n getBaseUrl(): string {\n return this.baseUrl;\n }\n getApiKey(): string {\n return this.apiKey;\n }\n getOrganizationId(): string {\n return this.organizationId;\n }\n\n private async request<T>(\n method: string,\n url: string,\n body?: unknown,\n ): Promise<T> {\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n \"X-Organization-Id\": this.organizationId,\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`HTTP ${response.status}: ${text}`);\n }\n return response.json() as T;\n }\n\n async postOtelV1traces(): Promise<unknown> {\n const url = this.baseUrl + \"/otel/v1/traces\";\n return this.request(\"POST\", url, {});\n }\n\n async postOtelV1offlineTraces(): Promise<unknown> {\n const url = this.baseUrl + \"/otel/v1/offline-traces\";\n return this.request(\"POST\", url, {});\n }\n\n async postV1projectsResolve(\n payload: ResolveProjectRequest,\n ): Promise<ResolveProjectResponse> {\n const url = this.baseUrl + \"/v1/projects/resolve/\";\n return this.request(\"POST\", url, payload);\n }\n\n async postV1projects(\n payload: AddProjectRequest,\n ): Promise<AddProjectResponse> {\n const url = this.baseUrl + \"/v1/projects\";\n return this.request(\"POST\", url, payload);\n }\n\n async deleteV1projects(projectId: string): Promise<DeleteProjectResponse> {\n const url = this.baseUrl + `/v1/projects/${projectId}`;\n return this.request(\"DELETE\", url, {});\n }\n\n async postV1projectsDatasets(\n projectId: string,\n payload: CreateOfflineDatasetRequest,\n ): Promise<CreateOfflineDatasetResponse> {\n const url = this.baseUrl + `/v1/projects/${projectId}/datasets`;\n return this.request(\"POST\", url, payload);\n }\n\n async getV1projectsDatasets(\n projectId: string,\n ): Promise<PullAllOfflineDatasetsResponse> {\n const url = this.baseUrl + `/v1/projects/${projectId}/datasets`;\n return this.request(\"GET\", url, undefined);\n }\n\n async getV1projectsDatasetsByDatasetIdentifierVersions(\n projectId: string,\n datasetIdentifier: string,\n ): Promise<OfflineDatasetVersionsResponse> {\n const url =\n this.baseUrl +\n `/v1/projects/${projectId}/datasets/${datasetIdentifier}/versions`;\n return this.request(\"GET\", url, undefined);\n }\n\n async getV1projectsDatasetsByDatasetIdentifierPage(\n projectId: string,\n datasetIdentifier: string,\n version?: string,\n limit?: string,\n cursor_created_at?: string,\n cursor_example_id?: string,\n ): Promise<OfflineDatasetPageResponse> {\n const params = new URLSearchParams();\n if (version !== undefined) params.set(\"version\", version);\n if (limit !== undefined) params.set(\"limit\", limit);\n if (cursor_created_at !== undefined)\n params.set(\"cursor_created_at\", cursor_created_at);\n if (cursor_example_id !== undefined)\n params.set(\"cursor_example_id\", cursor_example_id);\n const url =\n this.baseUrl +\n `/v1/projects/${projectId}/datasets/${datasetIdentifier}/page` +\n (params.toString() ? \"?\" + params.toString() : \"\");\n return this.request(\"GET\", url, undefined);\n }\n\n async postV1projectsDatasetsByDatasetIdentifierExamples(\n projectId: string,\n datasetIdentifier: string,\n payload: InsertOfflineDatasetExamplesRequest,\n ): Promise<AddDatasetItemsResponse> {\n const url =\n this.baseUrl +\n `/v1/projects/${projectId}/datasets/${datasetIdentifier}/examples`;\n return this.request(\"POST\", url, payload);\n }\n\n async deleteV1projectsDatasetsByDatasetIdentifier(\n projectId: string,\n datasetIdentifier: string,\n ): Promise<DeleteOfflineDatasetResponse> {\n const url =\n this.baseUrl + `/v1/projects/${projectId}/datasets/${datasetIdentifier}`;\n return this.request(\"DELETE\", url, {});\n }\n\n async getV1projectsDatasetsByDatasetIdentifier(\n projectId: string,\n datasetIdentifier: string,\n ): Promise<PullOfflineDatasetResponse> {\n const url =\n this.baseUrl + `/v1/projects/${projectId}/datasets/${datasetIdentifier}`;\n return this.request(\"GET\", url, undefined);\n }\n\n async getV1projectsTestConfigs(\n projectId: string,\n dataset_id?: string,\n ): Promise<TestConfigsResponse> {\n const params = new URLSearchParams();\n if (dataset_id !== undefined) params.set(\"dataset_id\", dataset_id);\n const url =\n this.baseUrl +\n `/v1/projects/${projectId}/test-configs` +\n (params.toString() ? \"?\" + params.toString() : \"\");\n return this.request(\"GET\", url, undefined);\n }\n\n async postV1projectsTestConfigs(\n projectId: string,\n payload: CreateTestConfigRequest,\n ): Promise<TestConfigResponse> {\n const url = this.baseUrl + `/v1/projects/${projectId}/test-configs`;\n return this.request(\"POST\", url, payload);\n }\n\n async getV1projectsTestConfigsByTestConfigId(\n projectId: string,\n testConfigId: string,\n ): Promise<TestConfigResponse> {\n const url =\n this.baseUrl + `/v1/projects/${projectId}/test-configs/${testConfigId}`;\n return this.request(\"GET\", url, undefined);\n }\n\n async patchV1projectsTestConfigsByTestConfigId(\n projectId: string,\n testConfigId: string,\n payload: UpdateTestConfigRequest,\n ): Promise<TestConfigResponse> {\n const url =\n this.baseUrl + `/v1/projects/${projectId}/test-configs/${testConfigId}`;\n return this.request(\"PATCH\", url, payload);\n }\n\n async deleteV1projectsTestConfigsByTestConfigId(\n projectId: string,\n testConfigId: string,\n ): Promise<DeleteTestConfigResponse> {\n const url =\n this.baseUrl + `/v1/projects/${projectId}/test-configs/${testConfigId}`;\n return this.request(\"DELETE\", url, {});\n }\n\n async getV1projectsTestRuns(\n projectId: string,\n test_config_id?: string,\n dataset_id?: string,\n status?: string,\n limit?: string,\n ): Promise<TestRunsResponse> {\n const params = new URLSearchParams();\n if (test_config_id !== undefined)\n params.set(\"test_config_id\", test_config_id);\n if (dataset_id !== undefined) params.set(\"dataset_id\", dataset_id);\n if (status !== undefined) params.set(\"status\", status);\n if (limit !== undefined) params.set(\"limit\", limit);\n const url =\n this.baseUrl +\n `/v1/projects/${projectId}/test-runs` +\n (params.toString() ? \"?\" + params.toString() : \"\");\n return this.request(\"GET\", url, undefined);\n }\n\n async postV1projectsTestRuns(\n projectId: string,\n payload: CreateTestRunRequest,\n ): Promise<PreparedTestRunResponse> {\n const url = this.baseUrl + `/v1/projects/${projectId}/test-runs`;\n return this.request(\"POST\", url, payload);\n }\n\n async getV1projectsTestRunsByTestRunId(\n projectId: string,\n testRunId: string,\n ): Promise<TestRunResponse> {\n const url =\n this.baseUrl + `/v1/projects/${projectId}/test-runs/${testRunId}`;\n return this.request(\"GET\", url, undefined);\n }\n\n async patchV1projectsTestRunsByTestRunIdStatus(\n projectId: string,\n testRunId: string,\n payload: UpdateTestRunStatusRequest,\n ): Promise<TestRunResponse> {\n const url =\n this.baseUrl + `/v1/projects/${projectId}/test-runs/${testRunId}/status`;\n return this.request(\"PATCH\", url, payload);\n }\n\n async patchV1projectsTestRunsByTestRunIdSuccess(\n projectId: string,\n testRunId: string,\n payload: ApplyTestRunSuccessRequest,\n ): Promise<ApplyTestRunSuccessResponse> {\n const url =\n this.baseUrl + `/v1/projects/${projectId}/test-runs/${testRunId}/success`;\n return this.request(\"PATCH\", url, payload);\n }\n\n async getV1projectsTestRunsByTestRunIdItems(\n projectId: string,\n testRunId: string,\n limit?: string,\n cursor?: string,\n ): Promise<TestRunItemsResponse> {\n const params = new URLSearchParams();\n if (limit !== undefined) params.set(\"limit\", limit);\n if (cursor !== undefined) params.set(\"cursor\", cursor);\n const url =\n this.baseUrl +\n `/v1/projects/${projectId}/test-runs/${testRunId}/items` +\n (params.toString() ? \"?\" + params.toString() : \"\");\n return this.request(\"GET\", url, undefined);\n }\n\n async getV1projectsTestRunsByTestRunIdResults(\n projectId: string,\n testRunId: string,\n limit?: string,\n cursor?: string,\n ): Promise<TestRunItemsResponse> {\n const params = new URLSearchParams();\n if (limit !== undefined) params.set(\"limit\", limit);\n if (cursor !== undefined) params.set(\"cursor\", cursor);\n const url =\n this.baseUrl +\n `/v1/projects/${projectId}/test-runs/${testRunId}/results` +\n (params.toString() ? \"?\" + params.toString() : \"\");\n return this.request(\"GET\", url, undefined);\n }\n\n async getV1projectsTestRunsByTestRunIdGraph(\n projectId: string,\n testRunId: string,\n ): Promise<TestRunGraphResponse> {\n const url =\n this.baseUrl + `/v1/projects/${projectId}/test-runs/${testRunId}/graph`;\n return this.request(\"GET\", url, undefined);\n }\n\n async getV1projectsExperimentsByRunId(\n projectId: string,\n runId: string,\n limit?: string,\n cursor?: string,\n ): Promise<FetchTestRunViaExperimentAliasResponse> {\n const params = new URLSearchParams();\n if (limit !== undefined) params.set(\"limit\", limit);\n if (cursor !== undefined) params.set(\"cursor\", cursor);\n const url =\n this.baseUrl +\n `/v1/projects/${projectId}/experiments/${runId}` +\n (params.toString() ? \"?\" + params.toString() : \"\");\n return this.request(\"GET\", url, undefined);\n }\n\n async postV1projectsEvalResults(\n projectId: string,\n payload: OfflineTestsLogEvalResultsRequest,\n ): Promise<OfflineTestsLogEvalResultsResponse> {\n const url = this.baseUrl + `/v1/projects/${projectId}/eval-results`;\n return this.request(\"POST\", url, payload);\n }\n\n async postV1projectsEvalResultsExamples(\n projectId: string,\n payload: OfflineTestsLogEvalResultsExamplesRequest,\n ): Promise<OfflineTestsLogEvalResultsExamplesResponse> {\n const url =\n this.baseUrl + `/v1/projects/${projectId}/eval-results/examples`;\n return this.request(\"POST\", url, payload);\n }\n\n async postV1projectsEvaluateExamples(\n projectId: string,\n payload: ExampleEvaluationRun,\n ): Promise<unknown> {\n const url = this.baseUrl + `/v1/projects/${projectId}/evaluate/examples`;\n return this.request(\"POST\", url, payload);\n }\n\n async postV1projectsEvaluateTraces(\n projectId: string,\n payload: TraceEvaluationRun,\n ): Promise<unknown> {\n const url = this.baseUrl + `/v1/projects/${projectId}/evaluate/traces`;\n return this.request(\"POST\", url, payload);\n }\n\n async postV1projectsEvalQueueExamples(\n projectId: string,\n payload: ExampleEvaluationRun,\n ): Promise<AddToRunEvalQueueExamplesResponse> {\n const url = this.baseUrl + `/v1/projects/${projectId}/eval-queue/examples`;\n return this.request(\"POST\", url, payload);\n }\n\n async postV1projectsEvalQueueTraces(\n projectId: string,\n payload: TraceEvaluationRun,\n ): Promise<AddToRunEvalQueueTracesResponse> {\n const url = this.baseUrl + `/v1/projects/${projectId}/eval-queue/traces`;\n return this.request(\"POST\", url, payload);\n }\n\n async getV1projectsPromptsByName(\n projectId: string,\n name: string,\n commit_id?: string,\n tag?: string,\n ): Promise<FetchPromptResponse> {\n const params = new URLSearchParams();\n if (commit_id !== undefined) params.set(\"commit_id\", commit_id);\n if (tag !== undefined) params.set(\"tag\", tag);\n const url =\n this.baseUrl +\n `/v1/projects/${projectId}/prompts/${name}` +\n (params.toString() ? \"?\" + params.toString() : \"\");\n return this.request(\"GET\", url, undefined);\n }\n\n async postV1projectsPrompts(\n projectId: string,\n payload: InsertPromptRequest,\n ): Promise<InsertPromptResponse> {\n const url = this.baseUrl + `/v1/projects/${projectId}/prompts`;\n return this.request(\"POST\", url, payload);\n }\n\n async postV1projectsPromptsByNameTags(\n projectId: string,\n name: string,\n payload: TagPromptRequest,\n ): Promise<TagPromptResponse> {\n const url = this.baseUrl + `/v1/projects/${projectId}/prompts/${name}/tags`;\n return this.request(\"POST\", url, payload);\n }\n\n async deleteV1projectsPromptsByNameTags(\n projectId: string,\n name: string,\n payload: UntagPromptRequest,\n ): Promise<UntagPromptResponse> {\n const url = this.baseUrl + `/v1/projects/${projectId}/prompts/${name}/tags`;\n return this.request(\"DELETE\", url, payload);\n }\n\n async getV1projectsPromptsByNameVersions(\n projectId: string,\n name: string,\n ): Promise<GetPromptVersionsResponse> {\n const url =\n this.baseUrl + `/v1/projects/${projectId}/prompts/${name}/versions`;\n return this.request(\"GET\", url, undefined);\n }\n\n async getV1projectsScorers(\n projectId: string,\n names?: string,\n is_trace?: string,\n ): Promise<FetchPromptScorersResponse> {\n const params = new URLSearchParams();\n if (names !== undefined) params.set(\"names\", names);\n if (is_trace !== undefined) params.set(\"is_trace\", is_trace);\n const url =\n this.baseUrl +\n `/v1/projects/${projectId}/scorers` +\n (params.toString() ? \"?\" + params.toString() : \"\");\n return this.request(\"GET\", url, undefined);\n }\n\n async getV1projectsScorersByNameExists(\n projectId: string,\n name: string,\n ): Promise<ScorerExistsResponse> {\n const url =\n this.baseUrl + `/v1/projects/${projectId}/scorers/${name}/exists`;\n return this.request(\"GET\", url, undefined);\n }\n\n async postV1projectsScorersCustom(projectId: string): Promise<unknown> {\n const url = this.baseUrl + `/v1/projects/${projectId}/scorers/custom`;\n return this.request(\"POST\", url, {});\n }\n\n async postV1projectsScorersCustomBundle(\n projectId: string,\n ): Promise<UploadCustomScorerResponse> {\n const url =\n this.baseUrl + `/v1/projects/${projectId}/scorers/custom/bundle`;\n return this.request(\"POST\", url, {});\n }\n\n async getV1projectsScorersCustomByNameExists(\n projectId: string,\n name: string,\n ): Promise<CustomScorerExistsResponse> {\n const url =\n this.baseUrl + `/v1/projects/${projectId}/scorers/custom/${name}/exists`;\n return this.request(\"GET\", url, undefined);\n }\n\n async postV1projectsTracesByTraceIdTags(\n projectId: string,\n traceId: string,\n payload: AddTraceTagsRequest,\n ): Promise<AddTraceTagsResponse> {\n const url =\n this.baseUrl + `/v1/projects/${projectId}/traces/${traceId}/tags`;\n return this.request(\"POST\", url, payload);\n }\n\n async getV1e2eFetchTraceByProjectNameByTraceId(\n projectName: string,\n traceId: string,\n ): Promise<E2EFetchTraceResponse> {\n const url = this.baseUrl + `/v1/e2e_fetch_trace/${projectName}/${traceId}`;\n return this.request(\"GET\", url, undefined);\n }\n\n async getV1e2eTracesPerProject(projectId: string): Promise<unknown> {\n const url = this.baseUrl + `/v1/e2e_traces_per_project/${projectId}`;\n return this.request(\"GET\", url, undefined);\n }\n\n async postV1e2eFetchSpanScore(\n payload: E2EFetchSpanScoreRequest,\n ): Promise<E2EFetchSpanScoreResponse> {\n const url = this.baseUrl + \"/v1/e2e_fetch_span_score/\";\n return this.request(\"POST\", url, payload);\n }\n\n async postV1projectsJudges(\n projectId: string,\n payload: SDKCreateAgentJudgeRequest,\n ): Promise<SDKCreateAgentJudgeResponse> {\n const url = this.baseUrl + `/v1/projects/${projectId}/judges`;\n return this.request(\"POST\", url, payload);\n }\n\n async patchV1projectsJudgesByJudgeId(\n projectId: string,\n judgeId: string,\n payload: SDKUpdateAgentJudgeRequest,\n ): Promise<SDKUpdateAgentJudgeResponse> {\n const url = this.baseUrl + `/v1/projects/${projectId}/judges/${judgeId}`;\n return this.request(\"PATCH\", url, payload);\n }\n}\n",
7
+ "import { JUDGMENT_LOG_LEVEL } from \"../env\";\n\n/**\n * SDK logger with configurable levels and color output.\n *\n * Log level is controlled by the `JUDGMENT_LOG_LEVEL` environment variable.\n * Defaults to \"warn\". Supported levels: \"debug\", \"info\", \"warning\", \"error\", \"critical\".\n *\n * @example\n * ```typescript\n * import { Logger } from \"judgeval\";\n *\n * Logger.setLevel(\"debug\");\n * Logger.info(\"Tracer initialized\");\n * ```\n */\nexport class Logger {\n private static readonly RESET = \"\\x1b[0m\";\n private static readonly RED = \"\\x1b[31m\";\n private static readonly YELLOW = \"\\x1b[33m\";\n private static readonly GRAY = \"\\x1b[90m\";\n\n public static Level = {\n DEBUG: 0,\n INFO: 1,\n WARNING: 2,\n ERROR: 3,\n CRITICAL: 4,\n } as const;\n\n private static initialized = false;\n private static levelSetManually = false;\n private static currentLevel: number = Logger.Level.WARNING;\n private static useColor = true;\n\n private static initialize(): void {\n if (!Logger.initialized) {\n const noColor = process.env.JUDGMENT_NO_COLOR;\n Logger.useColor = !noColor && process.stdout.isTTY;\n\n if (!Logger.levelSetManually) {\n const logLevel = JUDGMENT_LOG_LEVEL.toLowerCase();\n if (logLevel) {\n const levelMap: Record<string, number> = {\n debug: Logger.Level.DEBUG,\n info: Logger.Level.INFO,\n warning: Logger.Level.WARNING,\n warn: Logger.Level.WARNING,\n error: Logger.Level.ERROR,\n critical: Logger.Level.CRITICAL,\n };\n Logger.currentLevel = levelMap[logLevel] ?? Logger.Level.WARNING;\n }\n }\n\n Logger.initialized = true;\n }\n }\n\n /** Set the minimum log level. */\n public static setLevel(level: number): void {\n Logger.currentLevel = level;\n Logger.levelSetManually = true;\n }\n\n /** Enable or disable colored output. */\n public static setUseColor(useColor: boolean): void {\n Logger.useColor = useColor;\n }\n\n private static log(level: number, message: string): void {\n Logger.initialize();\n\n if (level < Logger.currentLevel) {\n return;\n }\n\n const timestamp = new Date()\n .toISOString()\n .replace(\"T\", \" \")\n .substring(0, 19);\n const levelName =\n Object.keys(Logger.Level).find(\n (key) => Logger.Level[key as keyof typeof Logger.Level] === level,\n ) ?? \"UNKNOWN\";\n let formattedMessage = `${timestamp} - judgeval - ${levelName} - ${message}`;\n\n if (Logger.useColor) {\n const color =\n level === Logger.Level.DEBUG || level === Logger.Level.INFO\n ? Logger.GRAY\n : level === Logger.Level.WARNING\n ? Logger.YELLOW\n : Logger.RED;\n formattedMessage = `${color}${formattedMessage}${Logger.RESET}`;\n }\n\n const output =\n level >= Logger.Level.ERROR ? process.stderr : process.stdout;\n output.write(formattedMessage + \"\\n\");\n }\n\n /** Log a debug message. */\n public static debug(message: string): void {\n Logger.log(Logger.Level.DEBUG, message);\n }\n\n /** Log an informational message. */\n public static info(message: string): void {\n Logger.log(Logger.Level.INFO, message);\n }\n\n /** Log a warning message. */\n public static warning(message: string): void {\n Logger.log(Logger.Level.WARNING, message);\n }\n\n public static warn(message: string): void {\n Logger.log(Logger.Level.WARNING, message);\n }\n\n /** Log an error message. */\n public static error(message: string): void {\n Logger.log(Logger.Level.ERROR, message);\n }\n\n /** Log a critical error message. */\n public static critical(message: string): void {\n Logger.log(Logger.Level.CRITICAL, message);\n }\n}\n",
8
+ "/** Resolve after `ms` milliseconds. */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n",
9
+ "import { sleep } from \"./sleep\";\n\nexport interface RetryConfig {\n /** Maximum number of attempts. Defaults to `3`. */\n maxRetries?: number;\n /**\n * Function that returns the backoff delay in milliseconds for the\n * given attempt. The first call receives `iteration = 1`.\n * Defaults to a flat 1000 ms.\n */\n backoff?: (iteration: number) => number;\n /** Called after each failed attempt, before sleeping for the backoff. */\n onRetry?: (attempt: number, error: unknown) => void;\n}\n\n/**\n * Retry a function up to a maximum number of times with configurable\n * backoff.\n *\n * @param fn - The function to retry.\n * @param config - Retry configuration.\n * - `maxRetries` — maximum number of attempts (default: 3).\n * - `backoff` — delay in ms between attempts (default: flat 1000 ms).\n * - `onRetry` — invoked with `(attempt, error)` after each failed\n * attempt (default: no-op).\n * @returns The resolved value of `fn`.\n * @throws The last error raised by `fn` if it fails on every attempt.\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n config: RetryConfig = {},\n): Promise<T> {\n const { maxRetries = 3, backoff = () => 1000, onRetry } = config;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n if (attempt === maxRetries) {\n throw error;\n }\n\n onRetry?.(attempt, error);\n await sleep(backoff(attempt));\n }\n }\n\n // Unreachable: the loop always either returns or throws.\n throw new Error(\"retry: exhausted all attempts\");\n}\n",
10
+ "import type { JudgmentApiClient } from \"../internal/api\";\nimport { Logger } from \"./logger\";\nimport { retry } from \"./retry\";\n\nconst cache = new Map<string, string>();\nconst inflight = new Map<string, Promise<string>>();\n\nexport async function resolveProjectId(\n client: JudgmentApiClient,\n projectName: string,\n): Promise<string> {\n const cacheKey = `org:${client.getOrganizationId()}:project:${projectName}`;\n const cached = cache.get(cacheKey);\n if (cached) {\n return cached;\n }\n const pending = inflight.get(cacheKey);\n if (pending) {\n return pending;\n }\n const request = (async (): Promise<string> => {\n Logger.info(`Resolving project ID for project: ${projectName}`);\n const projectId = await retry(\n async () => {\n const response = await client.postV1projectsResolve({\n project_name: projectName,\n });\n const id = response.project_id;\n if (!id) {\n throw new Error(`Project ID not found for project: ${projectName}`);\n }\n return id;\n },\n {\n maxRetries: 3,\n backoff: (iteration) => iteration * 1000,\n onRetry: (attempt, error) => {\n Logger.warning(\n `Failed to resolve project ID for '${projectName}' (attempt ${attempt}): ${String(error)}`,\n );\n },\n },\n );\n Logger.info(`Resolved project ID: ${projectId}`);\n cache.set(cacheKey, projectId);\n return projectId;\n })();\n inflight.set(cacheKey, request);\n try {\n return await request;\n } finally {\n inflight.delete(cacheKey);\n }\n}\n",
11
+ "let p = process || {}, argv = p.argv || [], env = p.env || {}\nlet isColorSupported =\n\t!(!!env.NO_COLOR || argv.includes(\"--no-color\")) &&\n\t(!!env.FORCE_COLOR || argv.includes(\"--color\") || p.platform === \"win32\" || ((p.stdout || {}).isTTY && env.TERM !== \"dumb\") || !!env.CI)\n\nlet formatter = (open, close, replace = open) =>\n\tinput => {\n\t\tlet string = \"\" + input, index = string.indexOf(close, open.length)\n\t\treturn ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close\n\t}\n\nlet replaceClose = (string, close, replace, index) => {\n\tlet result = \"\", cursor = 0\n\tdo {\n\t\tresult += string.substring(cursor, index) + replace\n\t\tcursor = index + close.length\n\t\tindex = string.indexOf(close, cursor)\n\t} while (~index)\n\treturn result + string.substring(cursor)\n}\n\nlet createColors = (enabled = isColorSupported) => {\n\tlet f = enabled ? formatter : () => String\n\treturn {\n\t\tisColorSupported: enabled,\n\t\treset: f(\"\\x1b[0m\", \"\\x1b[0m\"),\n\t\tbold: f(\"\\x1b[1m\", \"\\x1b[22m\", \"\\x1b[22m\\x1b[1m\"),\n\t\tdim: f(\"\\x1b[2m\", \"\\x1b[22m\", \"\\x1b[22m\\x1b[2m\"),\n\t\titalic: f(\"\\x1b[3m\", \"\\x1b[23m\"),\n\t\tunderline: f(\"\\x1b[4m\", \"\\x1b[24m\"),\n\t\tinverse: f(\"\\x1b[7m\", \"\\x1b[27m\"),\n\t\thidden: f(\"\\x1b[8m\", \"\\x1b[28m\"),\n\t\tstrikethrough: f(\"\\x1b[9m\", \"\\x1b[29m\"),\n\n\t\tblack: f(\"\\x1b[30m\", \"\\x1b[39m\"),\n\t\tred: f(\"\\x1b[31m\", \"\\x1b[39m\"),\n\t\tgreen: f(\"\\x1b[32m\", \"\\x1b[39m\"),\n\t\tyellow: f(\"\\x1b[33m\", \"\\x1b[39m\"),\n\t\tblue: f(\"\\x1b[34m\", \"\\x1b[39m\"),\n\t\tmagenta: f(\"\\x1b[35m\", \"\\x1b[39m\"),\n\t\tcyan: f(\"\\x1b[36m\", \"\\x1b[39m\"),\n\t\twhite: f(\"\\x1b[37m\", \"\\x1b[39m\"),\n\t\tgray: f(\"\\x1b[90m\", \"\\x1b[39m\"),\n\n\t\tbgBlack: f(\"\\x1b[40m\", \"\\x1b[49m\"),\n\t\tbgRed: f(\"\\x1b[41m\", \"\\x1b[49m\"),\n\t\tbgGreen: f(\"\\x1b[42m\", \"\\x1b[49m\"),\n\t\tbgYellow: f(\"\\x1b[43m\", \"\\x1b[49m\"),\n\t\tbgBlue: f(\"\\x1b[44m\", \"\\x1b[49m\"),\n\t\tbgMagenta: f(\"\\x1b[45m\", \"\\x1b[49m\"),\n\t\tbgCyan: f(\"\\x1b[46m\", \"\\x1b[49m\"),\n\t\tbgWhite: f(\"\\x1b[47m\", \"\\x1b[49m\"),\n\n\t\tblackBright: f(\"\\x1b[90m\", \"\\x1b[39m\"),\n\t\tredBright: f(\"\\x1b[91m\", \"\\x1b[39m\"),\n\t\tgreenBright: f(\"\\x1b[92m\", \"\\x1b[39m\"),\n\t\tyellowBright: f(\"\\x1b[93m\", \"\\x1b[39m\"),\n\t\tblueBright: f(\"\\x1b[94m\", \"\\x1b[39m\"),\n\t\tmagentaBright: f(\"\\x1b[95m\", \"\\x1b[39m\"),\n\t\tcyanBright: f(\"\\x1b[96m\", \"\\x1b[39m\"),\n\t\twhiteBright: f(\"\\x1b[97m\", \"\\x1b[39m\"),\n\n\t\tbgBlackBright: f(\"\\x1b[100m\", \"\\x1b[49m\"),\n\t\tbgRedBright: f(\"\\x1b[101m\", \"\\x1b[49m\"),\n\t\tbgGreenBright: f(\"\\x1b[102m\", \"\\x1b[49m\"),\n\t\tbgYellowBright: f(\"\\x1b[103m\", \"\\x1b[49m\"),\n\t\tbgBlueBright: f(\"\\x1b[104m\", \"\\x1b[49m\"),\n\t\tbgMagentaBright: f(\"\\x1b[105m\", \"\\x1b[49m\"),\n\t\tbgCyanBright: f(\"\\x1b[106m\", \"\\x1b[49m\"),\n\t\tbgWhiteBright: f(\"\\x1b[107m\", \"\\x1b[49m\"),\n\t}\n}\n\nmodule.exports = createColors()\nmodule.exports.createColors = createColors\n",
12
+ "import type { Example as APIExample } from \"../internal/api/models/Example\";\n\n/**\n * The wire format for examples: the fixed API fields plus arbitrary\n * user-defined properties (input, actual_output, etc.).\n */\nexport type ExampleDict = APIExample & Record<string, unknown>;\n\n/**\n * A single evaluation example with flexible key-value properties.\n *\n * Use `Example.create()` to construct an example with arbitrary fields\n * such as `input`, `actualOutput`, `expectedOutput`, etc.\n *\n * @example\n * ```typescript\n * const example = Example.create({\n * input: \"What is the capital of France?\",\n * actual_output: \"Paris is the capital of France.\",\n * expected_output: \"Paris\",\n * });\n *\n * example.get(\"input\"); // \"What is the capital of France?\"\n * ```\n */\nexport class Example {\n readonly exampleId: string;\n readonly createdAt: string;\n readonly name: string | null;\n private readonly _properties: Record<string, unknown>;\n\n private constructor(\n exampleId: string,\n createdAt: string,\n name: string | null,\n properties: Record<string, unknown>,\n ) {\n this.exampleId = exampleId;\n this.createdAt = createdAt;\n this.name = name;\n this._properties = properties;\n }\n\n /**\n * Create an example with the given properties.\n *\n * Any key-value pairs passed in `props` become accessible via `.get()`.\n * Common keys: `input`, `actual_output`, `expected_output`, `retrieval_context`.\n */\n static create(props: Record<string, unknown> = {}): Example {\n return new Example(crypto.randomUUID(), new Date().toISOString(), null, {\n ...props,\n });\n }\n\n /** Known keys on the API Example interface that are not user properties. */\n private static readonly META_KEYS = new Set([\n \"example_id\",\n \"created_at\",\n \"name\",\n \"trace_id\",\n \"span_id\",\n \"offline_trace_id\",\n \"agent_offline_trace_id\",\n ]);\n\n /**\n * Reconstruct an Example from an API response dict.\n *\n * Separates the fixed metadata fields (`example_id`, `created_at`, `name`)\n * from user-defined properties.\n */\n static from(data: ExampleDict): Example {\n const properties: Record<string, unknown> = {};\n for (const key of Object.keys(data)) {\n if (!Example.META_KEYS.has(key)) {\n properties[key] = (data as Record<string, unknown>)[key];\n }\n }\n return new Example(\n data.example_id ?? \"\",\n data.created_at ?? \"\",\n data.name ?? null,\n properties,\n );\n }\n\n /** Get a property by key. */\n get(key: string): unknown {\n return this._properties[key];\n }\n\n /** Check if a property key exists. */\n has(key: string): boolean {\n return key in this._properties;\n }\n\n /** Return a shallow copy of all custom properties. */\n get properties(): Record<string, unknown> {\n return { ...this._properties };\n }\n\n /** Serialize to the API wire format. */\n toJSON(): ExampleDict {\n const result: Record<string, unknown> = {\n example_id: this.exampleId,\n created_at: this.createdAt,\n name: this.name,\n };\n for (const [key, value] of Object.entries(this._properties)) {\n result[key] = value;\n }\n // result satisfies ExampleDict structurally — example_id and created_at\n // are always present strings, plus arbitrary extra keys.\n return result as ExampleDict;\n }\n}\n",
13
+ "import { Logger } from \"./logger\";\n\nexport type Serializer = (obj: unknown) => string;\n\nfunction createCircularReplacer(): (\n this: unknown,\n key: string,\n value: unknown,\n) => unknown {\n const seen = new WeakSet<object>();\n return function (_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") return value.toString();\n if (typeof value === \"object\" && value !== null) {\n if (seen.has(value)) return \"[Circular]\";\n seen.add(value);\n }\n return value;\n };\n}\n\nexport function safeStringify(obj: unknown): string {\n try {\n const result = JSON.stringify(obj);\n if (typeof result === \"string\") return result;\n return String(result);\n } catch {\n try {\n const result = JSON.stringify(obj, createCircularReplacer());\n return typeof result === \"string\" ? result : String(obj);\n } catch (e) {\n Logger.error(`safeStringify failed: ${e}`);\n return String(obj);\n }\n }\n}\n\n/**\n * Serializes an attribute to an \"Attribute\" compatible value. Primitives are returned as is, objects are serialized using the provided serializer.\n *\n * @param value - The value to serialize.\n * @param serializer - The serializer to use.\n * @returns A string, number, or boolean value.\n */\nexport function serializeAttribute(\n value: unknown,\n serializer: Serializer,\n): string | number | boolean {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n )\n return value;\n return serializer(value);\n}\n",
14
+ "import { version } from \"../package.json\" with { type: \"json\" };\n\nexport const VERSION = version;\n",
15
+ "import { Logger } from \"./logger\";\n\n/**\n * Run `fn` and swallow any thrown error, logging it instead.\n *\n * @param name - Name used in the error log (typically `\"ClassName.method\"`).\n * @param fn - Function to invoke.\n * @param fallback - Optional value returned when `fn` throws.\n * @returns The return value of `fn`, or `fallback` (or `undefined`) on error.\n */\nexport function dontThrow<T>(name: string, fn: () => T): T | undefined;\nexport function dontThrow<T>(name: string, fn: () => T, fallback: T): T;\nexport function dontThrow<T>(\n name: string,\n fn: () => T,\n fallback?: T,\n): T | undefined {\n try {\n return fn();\n } catch (err) {\n const stack = err instanceof Error && err.stack ? `\\n${err.stack}` : \"\";\n Logger.error(\n `[Caught] An exception was raised in ${name}: ${String(err)}${stack}`,\n );\n return fallback;\n }\n}\n",
16
+ "import { dontThrow } from \"../dont-throw\";\nimport type { ImmutableHooks } from \"./types\";\n\nexport function immutableWrapSync<\n A extends unknown[],\n R,\n C1 = undefined,\n C2 = undefined,\n C3 = undefined,\n>(\n fn: (...args: A) => R,\n hooks: ImmutableHooks<A, R, C1, C2, C3> = {},\n): (...args: A) => R {\n const {\n pre: preFn,\n post: postFn,\n error: errorFn,\n finally: finallyFn,\n } = hooks;\n\n return function wrapped(...args: A): R {\n const ctx1 = preFn\n ? dontThrow(\"immutableWrapSync.pre\", () => preFn(...args))\n : undefined;\n\n let finalCtx: C2 | C3 | undefined;\n try {\n const result = fn(...args);\n if (postFn) {\n finalCtx = dontThrow(\"immutableWrapSync.post\", () =>\n postFn(ctx1, result, args),\n );\n }\n return result;\n } catch (err) {\n if (errorFn) {\n finalCtx = dontThrow(\"immutableWrapSync.error\", () =>\n errorFn(ctx1, err, args),\n );\n }\n throw err;\n } finally {\n if (finallyFn) {\n dontThrow(\"immutableWrapSync.finally\", () => {\n finallyFn(finalCtx);\n });\n }\n }\n };\n}\n",
17
+ "import { dontThrow } from \"../dont-throw\";\nimport type { AsyncFn, ImmutableHooks } from \"./types\";\n\nexport function immutableWrapAsync<\n F extends AsyncFn,\n C1 = undefined,\n C2 = undefined,\n C3 = undefined,\n>(\n fn: F,\n hooks: ImmutableHooks<Parameters<F>, Awaited<ReturnType<F>>, C1, C2, C3> = {},\n): F {\n const {\n pre: preFn,\n post: postFn,\n error: errorFn,\n finally: finallyFn,\n } = hooks;\n\n return async function wrapped(\n this: unknown,\n ...args: Parameters<F>\n ): Promise<Awaited<ReturnType<F>>> {\n const ctx1 = preFn\n ? dontThrow(\"immutableWrapAsync.pre\", () => preFn(...args))\n : undefined;\n\n let finalCtx: C2 | C3 | undefined;\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const result: Awaited<ReturnType<F>> = await fn.apply(this, args);\n if (postFn) {\n finalCtx = dontThrow(\"immutableWrapAsync.post\", () =>\n postFn(ctx1, result, args),\n );\n }\n return result;\n } catch (err) {\n if (errorFn) {\n finalCtx = dontThrow(\"immutableWrapAsync.error\", () =>\n errorFn(ctx1, err, args),\n );\n }\n throw err;\n } finally {\n if (finallyFn) {\n dontThrow(\"immutableWrapAsync.finally\", () => {\n finallyFn(finalCtx);\n });\n }\n }\n } as F;\n}\n",
18
+ "import { dontThrow } from \"../dont-throw\";\nimport type { ImmutableIteratorHooks } from \"./types\";\n\nexport function immutableWrapSyncIterator<\n A extends unknown[],\n Y,\n C1 = undefined,\n C2 = undefined,\n C3 = undefined,\n>(\n fn: (...args: A) => Iterable<Y>,\n hooks: ImmutableIteratorHooks<A, Y, C1, C2, C3> = {},\n): (...args: A) => Generator<Y> {\n const {\n pre: preFn,\n yield: yieldFn,\n post: postFn,\n error: errorFn,\n finally: finallyFn,\n } = hooks;\n\n return function* wrapped(...args: A): Generator<Y> {\n const ctx1 = preFn\n ? dontThrow(\"immutableWrapSyncIterator.pre\", () => preFn(...args))\n : undefined;\n\n let finalCtx: C2 | C3 | undefined;\n try {\n for (const value of fn(...args)) {\n if (yieldFn) {\n dontThrow(\"immutableWrapSyncIterator.yield\", () => {\n yieldFn(ctx1, value);\n });\n }\n yield value;\n }\n if (postFn) {\n finalCtx = dontThrow(\"immutableWrapSyncIterator.post\", () =>\n postFn(ctx1),\n );\n }\n } catch (err) {\n if (errorFn) {\n finalCtx = dontThrow(\"immutableWrapSyncIterator.error\", () =>\n errorFn(ctx1, err),\n );\n }\n throw err;\n } finally {\n if (finallyFn) {\n dontThrow(\"immutableWrapSyncIterator.finally\", () => {\n finallyFn(finalCtx);\n });\n }\n }\n };\n}\n",
19
+ "import { dontThrow } from \"../dont-throw\";\nimport type { ImmutableIteratorHooks } from \"./types\";\n\nexport function immutableWrapAsyncIterator<\n A extends unknown[],\n Y,\n C1 = undefined,\n C2 = undefined,\n C3 = undefined,\n>(\n fn: (...args: A) => AsyncIterable<Y>,\n hooks: ImmutableIteratorHooks<A, Y, C1, C2, C3> = {},\n): (...args: A) => AsyncGenerator<Y> {\n const {\n pre: preFn,\n yield: yieldFn,\n post: postFn,\n error: errorFn,\n finally: finallyFn,\n } = hooks;\n\n return async function* wrapped(...args: A): AsyncGenerator<Y> {\n const ctx1 = preFn\n ? dontThrow(\"immutableWrapAsyncIterator.pre\", () => preFn(...args))\n : undefined;\n\n let finalCtx: C2 | C3 | undefined;\n try {\n for await (const value of fn(...args)) {\n if (yieldFn) {\n dontThrow(\"immutableWrapAsyncIterator.yield\", () => {\n yieldFn(ctx1, value);\n });\n }\n yield value;\n }\n if (postFn) {\n finalCtx = dontThrow(\"immutableWrapAsyncIterator.post\", () =>\n postFn(ctx1),\n );\n }\n } catch (err) {\n if (errorFn) {\n finalCtx = dontThrow(\"immutableWrapAsyncIterator.error\", () =>\n errorFn(ctx1, err),\n );\n }\n throw err;\n } finally {\n if (finallyFn) {\n dontThrow(\"immutableWrapAsyncIterator.finally\", () => {\n finallyFn(finalCtx);\n });\n }\n }\n };\n}\n",
20
+ "import { immutableWrapAsyncIterator } from \"./immutable-wrap-async-iterator\";\n\n/**\n * Replace `[Symbol.asyncIterator]` on `target` in place, intercepting\n * yielded values and lifecycle events through hooks. The target object\n * is mutated so that other properties (e.g. `.controller`, `.tee()`)\n * remain intact.\n */\nexport function proxyAsyncIterable<T>(\n target: AsyncIterable<T>,\n hooks: {\n onYield: (value: T) => void;\n onDone: () => void;\n onError: (err: unknown) => void;\n onFinally: () => void;\n },\n): void {\n const original = target[Symbol.asyncIterator].bind(target);\n\n const wrapped = immutableWrapAsyncIterator(\n () => ({ [Symbol.asyncIterator]: original }) as AsyncIterable<T>,\n {\n yield: (_ctx, value) => {\n hooks.onYield(value);\n },\n post: () => {\n hooks.onDone();\n },\n error: (_ctx, err) => {\n hooks.onError(err);\n },\n finally: () => {\n hooks.onFinally();\n },\n },\n );\n\n (target as unknown as { [Symbol.asyncIterator]: () => AsyncIterator<T> })[\n Symbol.asyncIterator\n ] = () => wrapped();\n}\n",
21
+ "export { immutableWrapSync } from \"./immutable-wrap-sync\";\nexport { immutableWrapAsync } from \"./immutable-wrap-async\";\nexport { immutableWrapSyncIterator } from \"./immutable-wrap-sync-iterator\";\nexport { immutableWrapAsyncIterator } from \"./immutable-wrap-async-iterator\";\nexport { proxyAsyncIterable } from \"./proxy-async-iterable\";\nexport type { AsyncFn, ImmutableHooks, ImmutableIteratorHooks } from \"./types\";\n",
22
+ "import type { Span } from \"@opentelemetry/api\";\nimport type { CompletionUsage } from \"openai/resources/completions\";\nimport { AttributeKeys } from \"../../../JudgmentAttributeKeys\";\nimport { BaseTracer } from \"../../../trace/BaseTracer\";\nimport { dontThrow } from \"../../../utils/dont-throw\";\nimport { safeStringify } from \"../../../utils/serializer\";\n\nexport function recordChatUsage(span: Span, usage: CompletionUsage): void {\n dontThrow(\"recordChatUsage\", () => {\n const cacheRead = usage.prompt_tokens_details?.cached_tokens ?? 0;\n const sum = usage.prompt_tokens + usage.completion_tokens + cacheRead;\n BaseTracer.recordLLMMetadata(\n {\n non_cached_input_tokens:\n sum > usage.total_tokens\n ? usage.prompt_tokens - cacheRead\n : usage.prompt_tokens,\n output_tokens: usage.completion_tokens || undefined,\n cache_read_input_tokens: cacheRead || undefined,\n },\n span,\n );\n BaseTracer.setAttribute(\n AttributeKeys.JUDGMENT_USAGE_METADATA,\n safeStringify(usage),\n span,\n );\n });\n}\n",
23
+ "import type { OpenAI } from \"openai\";\nimport { BaseTracer } from \"../../../trace/BaseTracer\";\nimport { safeStringify } from \"../../../utils/serializer\";\nimport { immutableWrapAsync } from \"../../../utils/wrappers\";\nimport { recordChatUsage } from \"./utils\";\n\n/**\n * Wrap `client.chat.completions.parse` to produce Judgment spans.\n * Non-streaming only — parse does not support streaming.\n */\nexport function wrapChatCompletionsParse(client: OpenAI): void {\n client.chat.completions.parse = immutableWrapAsync(\n client.chat.completions.parse.bind(client.chat.completions),\n {\n pre: (body) => {\n const span = BaseTracer.startSpan(\"OPENAI_API_CALL\");\n BaseTracer.setSpanKind(\"llm\", span);\n BaseTracer.recordLLMMetadata({ model: body.model }, span);\n BaseTracer.setInput(body, span);\n return span;\n },\n\n post: (span, result) => {\n if (!span) return;\n BaseTracer.setOutput(safeStringify(result), span);\n if (result.usage) recordChatUsage(span, result.usage);\n BaseTracer.recordLLMMetadata({ model: result.model }, span);\n return span;\n },\n\n error: (span, err) => {\n if (span) BaseTracer.setError(err, span);\n return span;\n },\n\n finally: (span) => {\n span?.end();\n },\n },\n );\n}\n",
24
+ "import type { OpenAI } from \"openai\";\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n} from \"openai/resources/chat/completions/completions\";\nimport type { Stream } from \"openai/streaming\";\nimport { BaseTracer } from \"../../../trace/BaseTracer\";\nimport { safeStringify } from \"../../../utils/serializer\";\nimport {\n immutableWrapAsync,\n proxyAsyncIterable,\n} from \"../../../utils/wrappers\";\nimport { recordChatUsage } from \"./utils\";\n\n/**\n * Wrap `client.chat.completions.create` to produce Judgment spans.\n * Handles both streaming and non-streaming calls.\n */\nexport function wrapChatCompletionsCreate(client: OpenAI): void {\n client.chat.completions.create = immutableWrapAsync(\n client.chat.completions.create.bind(client.chat.completions),\n {\n pre: (body) => {\n if (body.stream) body.stream_options ??= { include_usage: true };\n const span = BaseTracer.startSpan(\"OPENAI_API_CALL\");\n BaseTracer.setSpanKind(\"llm\", span);\n BaseTracer.recordLLMMetadata({ model: body.model }, span);\n BaseTracer.setInput(body, span);\n return { span, proxied: false };\n },\n\n post: (ctx, result, args) => {\n if (!ctx) return;\n const { span } = ctx;\n\n if (args[0].stream) {\n const stream = result as Stream<ChatCompletionChunk>;\n let accumulatedContent = \"\";\n\n proxyAsyncIterable(stream, {\n onYield(chunk) {\n if (typeof chunk.choices[0]?.delta.content === \"string\") {\n accumulatedContent += chunk.choices[0].delta.content;\n }\n if (chunk.usage) recordChatUsage(span, chunk.usage);\n },\n onDone() {\n BaseTracer.setOutput(accumulatedContent, span);\n },\n onError(err) {\n BaseTracer.setError(err, span);\n },\n onFinally() {\n span.end();\n },\n });\n\n return { span, proxied: true };\n }\n\n // Non-streaming\n const completion = result as ChatCompletion;\n BaseTracer.setOutput(safeStringify(completion), span);\n if (completion.usage) recordChatUsage(span, completion.usage);\n BaseTracer.recordLLMMetadata({ model: completion.model }, span);\n return ctx;\n },\n\n error: (ctx, err) => {\n if (ctx) BaseTracer.setError(err, ctx.span);\n return ctx;\n },\n\n finally: (ctx) => {\n if (ctx && !ctx.proxied) ctx.span.end();\n },\n },\n );\n}\n",
25
+ "import type { Span } from \"@opentelemetry/api\";\nimport type { OpenAI } from \"openai\";\nimport type {\n ImageGenCompletedEvent,\n ImageGenStreamEvent,\n ImagesResponse,\n} from \"openai/resources/images\";\nimport type { Stream } from \"openai/streaming\";\nimport { AttributeKeys } from \"../../../JudgmentAttributeKeys\";\nimport { BaseTracer } from \"../../../trace/BaseTracer\";\nimport { dontThrow } from \"../../../utils/dont-throw\";\nimport { safeStringify } from \"../../../utils/serializer\";\nimport {\n immutableWrapAsync,\n proxyAsyncIterable,\n} from \"../../../utils/wrappers\";\n\nconst IMAGE_COMPLETED_TYPES = new Set([\n \"image_generation.completed\",\n \"image_edit.completed\",\n]);\n\ntype ImageUsage = ImageGenCompletedEvent.Usage | ImagesResponse.Usage;\n\nfunction recordUsage(span: Span, usage: ImageUsage): void {\n dontThrow(\"images.recordUsage\", () => {\n const inputDetails =\n \"input_tokens_details\" in usage ? usage.input_tokens_details : undefined;\n const imageInputTokens = inputDetails?.image_tokens ?? 0;\n\n BaseTracer.recordLLMMetadata(\n {\n non_cached_input_tokens: inputDetails?.text_tokens ?? 0,\n output_tokens: usage.output_tokens || undefined,\n },\n span,\n );\n\n if (imageInputTokens) {\n BaseTracer.setAttribute(\n AttributeKeys.JUDGMENT_USAGE_NON_CACHED_INPUT_IMAGE_TOKENS,\n imageInputTokens,\n span,\n );\n }\n if (usage.output_tokens) {\n BaseTracer.setAttribute(\n AttributeKeys.JUDGMENT_USAGE_OUTPUT_IMAGE_TOKENS,\n usage.output_tokens,\n span,\n );\n }\n BaseTracer.setAttribute(\n AttributeKeys.JUDGMENT_USAGE_METADATA,\n safeStringify(usage),\n span,\n );\n });\n}\n\n/**\n * Wrap `client.images.generate` to produce Judgment spans.\n * Handles both streaming and non-streaming calls.\n */\nexport function wrapImagesGenerate(client: OpenAI): void {\n client.images.generate = immutableWrapAsync(\n client.images.generate.bind(client.images),\n {\n pre: (body) => {\n const span = BaseTracer.startSpan(\"OPENAI_API_CALL\");\n BaseTracer.setSpanKind(\"llm\", span);\n BaseTracer.recordLLMMetadata({ model: body.model }, span);\n BaseTracer.setInput(body, span);\n return { span, proxied: false };\n },\n\n post: (ctx, result, args) => {\n if (!ctx) return;\n const { span } = ctx;\n\n if (args[0].stream) {\n const stream = result as Stream<ImageGenStreamEvent>;\n let completionData: ImageGenCompletedEvent | undefined;\n\n proxyAsyncIterable(stream, {\n onYield(chunk) {\n if (IMAGE_COMPLETED_TYPES.has(chunk.type)) {\n completionData = chunk as ImageGenCompletedEvent;\n recordUsage(span, completionData.usage);\n }\n },\n onDone() {\n BaseTracer.setOutput(safeStringify(completionData ?? {}), span);\n },\n onError(err) {\n BaseTracer.setError(err, span);\n },\n onFinally() {\n span.end();\n },\n });\n\n return { span, proxied: true };\n }\n\n // Non-streaming\n const imgResult = result as ImagesResponse;\n BaseTracer.setOutput(safeStringify(imgResult), span);\n if (imgResult.usage) recordUsage(span, imgResult.usage);\n return ctx;\n },\n\n error: (ctx, err) => {\n if (ctx) BaseTracer.setError(err, ctx.span);\n return ctx;\n },\n\n finally: (ctx) => {\n if (ctx && !ctx.proxied) ctx.span.end();\n },\n },\n );\n}\n",
26
+ "import type { Span } from \"@opentelemetry/api\";\nimport type { OpenAI } from \"openai\";\nimport type {\n Response,\n ResponseStreamEvent,\n ResponseUsage,\n} from \"openai/resources/responses/responses\";\nimport type { Stream } from \"openai/streaming\";\nimport { AttributeKeys } from \"../../../JudgmentAttributeKeys\";\nimport { BaseTracer } from \"../../../trace/BaseTracer\";\nimport { dontThrow } from \"../../../utils/dont-throw\";\nimport { safeStringify } from \"../../../utils/serializer\";\nimport {\n immutableWrapAsync,\n proxyAsyncIterable,\n} from \"../../../utils/wrappers\";\n\nfunction recordUsage(span: Span, usage: ResponseUsage): void {\n dontThrow(\"responses.recordUsage\", () => {\n const cacheRead = usage.input_tokens_details.cached_tokens;\n const sum = usage.input_tokens + usage.output_tokens + cacheRead;\n BaseTracer.recordLLMMetadata(\n {\n non_cached_input_tokens:\n sum > usage.total_tokens\n ? usage.input_tokens - cacheRead\n : usage.input_tokens,\n output_tokens: usage.output_tokens || undefined,\n cache_read_input_tokens: cacheRead || undefined,\n },\n span,\n );\n BaseTracer.setAttribute(\n AttributeKeys.JUDGMENT_USAGE_METADATA,\n safeStringify(usage),\n span,\n );\n });\n}\n\n/**\n * Wrap `client.responses.create` to produce Judgment spans.\n * Handles both streaming and non-streaming calls.\n */\nexport function wrapResponsesCreate(client: OpenAI): void {\n client.responses.create = immutableWrapAsync(\n client.responses.create.bind(client.responses),\n {\n pre: (body) => {\n const span = BaseTracer.startSpan(\"OPENAI_API_CALL\");\n BaseTracer.setSpanKind(\"llm\", span);\n BaseTracer.recordLLMMetadata({ model: body.model }, span);\n BaseTracer.setInput(body, span);\n return { span, proxied: false };\n },\n\n post: (ctx, result, args) => {\n if (!ctx) return;\n const { span } = ctx;\n\n if (args[0].stream) {\n const stream = result as Stream<ResponseStreamEvent>;\n let accumulatedContent = \"\";\n\n proxyAsyncIterable(stream, {\n onYield(chunk) {\n if (chunk.type === \"response.output_text.delta\") {\n accumulatedContent += chunk.delta;\n }\n if (chunk.type === \"response.completed\") {\n const resp = chunk.response;\n if (resp.usage) recordUsage(span, resp.usage);\n BaseTracer.recordLLMMetadata({ model: resp.model }, span);\n }\n },\n onDone() {\n BaseTracer.setOutput(accumulatedContent, span);\n },\n onError(err) {\n BaseTracer.setError(err, span);\n },\n onFinally() {\n span.end();\n },\n });\n\n return { span, proxied: true };\n }\n\n // Non-streaming\n const resp = result as Response;\n BaseTracer.setOutput(safeStringify(resp), span);\n if (resp.usage) recordUsage(span, resp.usage);\n if (typeof resp.model === \"string\") {\n BaseTracer.recordLLMMetadata({ model: resp.model }, span);\n }\n return ctx;\n },\n\n error: (ctx, err) => {\n if (ctx) BaseTracer.setError(err, ctx.span);\n return ctx;\n },\n\n finally: (ctx) => {\n if (ctx && !ctx.proxied) ctx.span.end();\n },\n },\n );\n}\n",
27
+ "import type { OpenAI } from \"openai\";\nimport { dontThrow } from \"../../../utils/dont-throw\";\nimport { wrapChatCompletionsParse } from \"./beta-chat-completions\";\nimport { wrapChatCompletionsCreate } from \"./chat-completions\";\nimport { wrapImagesGenerate } from \"./images\";\nimport { wrapResponsesCreate } from \"./responses\";\n\n/**\n * Instrument an OpenAI client instance to emit Judgment spans.\n *\n * Patches the following methods in-place:\n * - `client.chat.completions.create` (streaming + non-streaming)\n * - `client.chat.completions.parse` (non-streaming)\n * - `client.responses.create` (streaming + non-streaming)\n * - `client.images.generate` (streaming + non-streaming)\n *\n * @returns The same client instance (mutated).\n */\nexport function wrapOpenAI<T extends OpenAI>(client: T): T {\n dontThrow(\"wrapOpenAI\", () => {\n wrapChatCompletionsCreate(client);\n wrapChatCompletionsParse(client);\n wrapResponsesCreate(client);\n wrapImagesGenerate(client);\n });\n return client;\n}\n",
28
+ "import type { OpenAI } from \"openai\";\nimport { wrapOpenAI } from \"./llm/openai\";\n\nexport { wrapOpenAI };\n\n/**\n * Wrap a supported LLM client to add automatic tracing.\n *\n * Currently supports OpenAI clients. Detects the client type\n * automatically and applies the appropriate instrumentation.\n *\n * @param client - An OpenAI client instance.\n * @returns The same client instance, instrumented in-place.\n *\n * @example\n * ```typescript\n * import OpenAI from \"openai\";\n * import { wrap } from \"judgeval\";\n *\n * const client = wrap(new OpenAI());\n * ```\n */\nexport function wrap<T extends OpenAI>(client: T): T {\n return wrapOpenAI(client);\n}\n",
29
+ "/* eslint-disable */\n/// Adopted from https://github.com/angular/angular.js/blob/master/src/auto/injector.js\n\nconst ARROW_ARG = /^([^(]+?)=>/;\nconst FN_ARGS = /^[^(]*\\(\\s*([^)]*)\\)/m;\nconst FN_ARG_SPLIT = /,/;\nconst FN_ARG = /^\\s*(_?)(\\S+?)\\1\\s*$/;\nconst STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\n\nfunction stringifyFn(fn: Function): string {\n return Function.prototype.toString.call(fn);\n}\n\nfunction extractArgs(fn: Function): RegExpMatchArray | null {\n const fnText = stringifyFn(fn).replace(STRIP_COMMENTS, \"\");\n return fnText.match(ARROW_ARG) || fnText.match(FN_ARGS);\n}\n\nexport function parseFunctionArgs(fn: Function): string[] {\n const args = extractArgs(fn);\n if (!args || !args[1]) {\n return [];\n }\n\n return args[1]\n .split(FN_ARG_SPLIT)\n .map((arg) => {\n const match = arg.replace(FN_ARG, (all, underscore, name) => name);\n return match.trim();\n })\n .filter((name) => name.length > 0);\n}\n",
30
+ "import {\n INVALID_SPAN_CONTEXT,\n trace,\n type Context,\n type Span,\n type SpanOptions,\n type Tracer,\n} from \"@opentelemetry/api\";\n\nexport class NoOpTracer implements Tracer {\n startSpan(): Span {\n return trace.wrapSpanContext(INVALID_SPAN_CONTEXT);\n }\n\n startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n options: SpanOptions,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n options: SpanOptions,\n context: Context,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => unknown>(\n _name: string,\n ...args: [F] | [SpanOptions, F] | [SpanOptions, Context, F]\n ): ReturnType<F> {\n const fn =\n args.length === 1 ? args[0] : args.length === 2 ? args[1] : args[2];\n return fn(this.startSpan()) as ReturnType<F>;\n }\n}\n\n/**\n * Shared, stateless no-op tracer. Reused by the runtime fallback and by each\n * provider's \"no active tracer\" path, so there is a single instance rather\n * than one per provider.\n */\nexport const noOpTracer = new NoOpTracer();\n",
31
+ "import {\n ROOT_CONTEXT,\n trace,\n type Context,\n type Span,\n type SpanContext,\n type Tracer,\n} from \"@opentelemetry/api\";\nimport type { Instrumentation } from \"@opentelemetry/instrumentation\";\nimport type { BasicTracerProvider } from \"@opentelemetry/sdk-trace-base\";\nimport type { JudgmentApiClient } from \"../internal/api\";\nimport { Logger } from \"../utils/logger\";\nimport type { Serializer } from \"../utils/serializer\";\nimport type { JudgmentSpanExporter } from \"./exporters/JudgmentSpanExporter\";\nimport { noOpTracer } from \"./NoOpTracer\";\nimport type { JudgmentSpanProcessor } from \"./processors/JudgmentSpanProcessor\";\n\nexport interface TraceRuntimeTracer {\n projectName: string | null;\n projectId: string | null;\n apiKey: string | null;\n organizationId: string | null;\n apiUrl: string | null;\n environment: string | null;\n serializer: Serializer;\n _tracerProvider: BasicTracerProvider;\n _client: JudgmentApiClient | null;\n _enableMonitoring: boolean;\n supportsLiveInstrumentation: boolean;\n getSpanExporter(): JudgmentSpanExporter;\n getSpanProcessor(): JudgmentSpanProcessor;\n}\n\n/**\n * Runtime indirection that decouples {@link BaseTracer} from the concrete\n * tracer provider.\n *\n * `BaseTracer` is shared by both the Node and Workers entrypoints, so it must\n * not import a specific provider: `JudgmentTracerProvider` pulls in Node-only\n * `async_hooks`, which would break the Workers bundle. Instead `BaseTracer`\n * talks to this `TraceRuntime` interface. Each provider installs itself via\n * {@link setTraceRuntime} from its constructor (`JudgmentTracerProvider` on\n * Node, `WorkerTracerProvider` on Workers). Until one does, {@link getTraceRuntime}\n * returns {@link noOpRuntime} — a fallback that still runs user code but does\n * not record, register instrumentation, or export spans.\n */\nexport interface TraceRuntime {\n register(tracer: TraceRuntimeTracer): void;\n deregister(tracer: TraceRuntimeTracer): void;\n setActive(tracer: TraceRuntimeTracer): boolean;\n getActiveTracer(): TraceRuntimeTracer | null;\n getCurrentContext(): Context;\n setSpan(ctx: Context, span: Span): Context;\n wrapSpanContext(spanContext: SpanContext): Span;\n getCurrentSpan(): Span | undefined;\n getTracer(\n instrumentingModuleName: string,\n instrumentingLibraryVersion?: string,\n options?: { schemaUrl?: string },\n ): Tracer;\n addInstrumentation(instrumentor: Instrumentation): void;\n useSpan<T>(\n span: Span,\n endOnExit: boolean,\n recordException: boolean,\n setStatusOnException: boolean,\n fn: () => T,\n ): T;\n attachContext(ctx: Context): void;\n withContext<T>(ctx: Context, fn: () => T): T;\n forceFlush(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\n// Fallback runtime used before init; it preserves helper semantics without\n// recording, registering instrumentation, or exporting spans.\nconst noOpRuntime: TraceRuntime = {\n register() {\n /* empty */\n },\n deregister() {\n /* empty */\n },\n setActive() {\n return false;\n },\n getActiveTracer() {\n return null;\n },\n getCurrentContext() {\n return ROOT_CONTEXT;\n },\n // setSpan/wrapSpanContext delegate to the stateless @opentelemetry/api\n // helpers, which need no provider or ambient state. This lets the fallback\n // still produce valid contexts and (non-recording) spans before init().\n setSpan(ctx, span) {\n return trace.setSpan(ctx, span);\n },\n wrapSpanContext(spanContext) {\n return trace.wrapSpanContext(spanContext);\n },\n getCurrentSpan() {\n return undefined;\n },\n getTracer() {\n Logger.debug(\"No active tracer provider, returning NoOpTracer\");\n return noOpTracer;\n },\n addInstrumentation() {\n Logger.warning(\n \"No active tracer provider. Instrumentation was not registered.\",\n );\n },\n // No active provider yet: there is no recording span and no context to\n // isolate, so the endOnExit/record/setStatus flags are no-ops here. Just run\n // the callback — real span lifecycle handling lives in the concrete providers.\n useSpan(_span, _endOnExit, _recordException, _setStatusOnException, fn) {\n return fn();\n },\n attachContext() {\n /* empty */\n },\n withContext(_ctx, fn) {\n return fn();\n },\n forceFlush() {\n return Promise.resolve();\n },\n shutdown() {\n return Promise.resolve();\n },\n};\n\nlet runtime: TraceRuntime | null = null;\n\nexport function setTraceRuntime(nextRuntime: TraceRuntime): void {\n runtime = nextRuntime;\n}\n\nexport function getTraceRuntime(): TraceRuntime {\n return runtime ?? noOpRuntime;\n}\n",
32
+ "export const BAGGAGE_KEY_PAIR_SEPARATOR = \"=\";\nexport const BAGGAGE_PROPERTIES_SEPARATOR = \";\";\nexport const BAGGAGE_ITEMS_SEPARATOR = \",\";\n\n/** Name of the HTTP header used to propagate baggage. */\nexport const BAGGAGE_HEADER = \"baggage\";\n\n/** Maximum number of name-value pairs allowed by the W3C Baggage spec. */\nexport const BAGGAGE_MAX_NAME_VALUE_PAIRS = 180;\n\n/** Maximum number of bytes per a single name-value pair allowed by the W3C Baggage spec. */\nexport const BAGGAGE_MAX_PER_NAME_VALUE_PAIRS = 4096;\n\n/** Maximum total length of all name-value pairs allowed by the W3C Baggage spec. */\nexport const BAGGAGE_MAX_TOTAL_LENGTH = 8192;\n",
33
+ "import {\n type Baggage,\n type BaggageEntryMetadata,\n baggageEntryMetadataFromString,\n} from \"@opentelemetry/api\";\nimport {\n BAGGAGE_ITEMS_SEPARATOR,\n BAGGAGE_KEY_PAIR_SEPARATOR,\n BAGGAGE_MAX_TOTAL_LENGTH,\n BAGGAGE_PROPERTIES_SEPARATOR,\n} from \"./constants\";\n\n/**\n * Serialize an array of key=value pairs into a baggage header string,\n * capping the result at {@link BAGGAGE_MAX_TOTAL_LENGTH}.\n */\nexport function serializeKeyPairs(keyPairs: string[]): string {\n return keyPairs.reduce((hValue, current) => {\n const value = `${hValue}${hValue !== \"\" ? BAGGAGE_ITEMS_SEPARATOR : \"\"}${current}`;\n return value.length > BAGGAGE_MAX_TOTAL_LENGTH ? hValue : value;\n }, \"\");\n}\n\n/**\n * Convert a {@link Baggage} into an array of `key=value;metadata` strings,\n * URI-encoding each key and value.\n */\nexport function getKeyPairs(baggage: Baggage): string[] {\n return baggage.getAllEntries().map(([key, value]) => {\n let entry = `${encodeURIComponent(key)}=${encodeURIComponent(value.value)}`;\n if (value.metadata !== undefined) {\n entry += BAGGAGE_PROPERTIES_SEPARATOR + value.metadata.toString();\n }\n return entry;\n });\n}\n\n/** Parse a single `key=value;metadata` baggage list-member. */\nexport function parsePairKeyValue(\n entry: string,\n): { key: string; value: string; metadata?: BaggageEntryMetadata } | undefined {\n const valueProps = entry.split(BAGGAGE_PROPERTIES_SEPARATOR);\n if (valueProps.length <= 0) return;\n const keyPairPart = valueProps.shift();\n if (!keyPairPart) return;\n const separatorIndex = keyPairPart.indexOf(BAGGAGE_KEY_PAIR_SEPARATOR);\n if (separatorIndex <= 0) return;\n const key = decodeURIComponent(\n keyPairPart.substring(0, separatorIndex).trim(),\n );\n const value = decodeURIComponent(\n keyPairPart.substring(separatorIndex + 1).trim(),\n );\n let metadata: BaggageEntryMetadata | undefined;\n if (valueProps.length > 0) {\n metadata = baggageEntryMetadataFromString(\n valueProps.join(BAGGAGE_PROPERTIES_SEPARATOR),\n );\n }\n return { key, value, metadata };\n}\n",
34
+ "import {\n type BaggageEntry,\n type Context,\n type TextMapGetter,\n type TextMapPropagator,\n type TextMapSetter,\n} from \"@opentelemetry/api\";\nimport { isTracingSuppressed } from \"@opentelemetry/core\";\nimport {\n BAGGAGE_HEADER,\n BAGGAGE_ITEMS_SEPARATOR,\n BAGGAGE_MAX_NAME_VALUE_PAIRS,\n BAGGAGE_MAX_PER_NAME_VALUE_PAIRS,\n} from \"./constants\";\nimport { createBaggage, getBaggage, setBaggage } from \"./index\";\nimport { getKeyPairs, parsePairKeyValue, serializeKeyPairs } from \"./utils\";\n\n/**\n * Propagates {@link Baggage} through the W3C `baggage` header.\n *\n * Implements the W3C Baggage specification: https://w3c.github.io/baggage/\n */\nexport class JudgmentBaggagePropagator implements TextMapPropagator {\n inject(context: Context, carrier: unknown, setter: TextMapSetter): void {\n const baggage = getBaggage(context);\n if (!baggage || isTracingSuppressed(context)) return;\n const keyPairs = getKeyPairs(baggage)\n .filter((pair) => pair.length <= BAGGAGE_MAX_PER_NAME_VALUE_PAIRS)\n .slice(0, BAGGAGE_MAX_NAME_VALUE_PAIRS);\n const headerValue = serializeKeyPairs(keyPairs);\n if (headerValue.length > 0) {\n setter.set(carrier, BAGGAGE_HEADER, headerValue);\n }\n }\n\n extract(context: Context, carrier: unknown, getter: TextMapGetter): Context {\n const headerValue = getter.get(carrier, BAGGAGE_HEADER);\n const baggageString = Array.isArray(headerValue)\n ? headerValue.join(BAGGAGE_ITEMS_SEPARATOR)\n : headerValue;\n if (!baggageString) return context;\n const baggage: Record<string, BaggageEntry> = {};\n if (baggageString.length === 0) return context;\n const pairs = baggageString.split(BAGGAGE_ITEMS_SEPARATOR);\n pairs.forEach((entry) => {\n const keyPair = parsePairKeyValue(entry);\n if (keyPair) {\n const baggageEntry: BaggageEntry = { value: keyPair.value };\n if (keyPair.metadata) {\n baggageEntry.metadata = keyPair.metadata;\n }\n baggage[keyPair.key] = baggageEntry;\n }\n });\n if (Object.entries(baggage).length === 0) {\n return context;\n }\n return setBaggage(context, createBaggage(baggage));\n }\n\n fields(): string[] {\n return [BAGGAGE_HEADER];\n }\n}\n",
35
+ "import {\n type Baggage,\n type Context,\n createContextKey,\n propagation,\n} from \"@opentelemetry/api\";\nimport { getTraceRuntime } from \"../runtime\";\n\n/**\n * Judgment baggage store. Baggage is a set of key-value pairs attached\n * to a {@link Context} and automatically propagated to child spans and\n * to downstream services through the `baggage` HTTP header.\n */\n\n/** Create a new {@link Baggage}, optionally pre-populated with entries. */\nexport const createBaggage = propagation.createBaggage.bind(propagation);\n\nconst BAGGAGE_KEY = createContextKey(\"baggage\");\n\n/** Retrieve the baggage attached to the given context. */\nexport function getBaggage(context: Context): Baggage | undefined {\n return context.getValue(BAGGAGE_KEY) as Baggage | undefined;\n}\n\n/** Retrieve the baggage attached to the active context. */\nexport function getActiveBaggage(): Baggage | undefined {\n return getBaggage(getTraceRuntime().getCurrentContext());\n}\n\n/** Attach a baggage to the given context, returning a new context. */\nexport function setBaggage(context: Context, baggage: Baggage): Context {\n return context.setValue(BAGGAGE_KEY, baggage);\n}\n\n/** Remove the baggage attached to the given context, returning a new context. */\nexport function deleteBaggage(context: Context): Context {\n return context.deleteValue(BAGGAGE_KEY);\n}\n\nexport { baggageEntryMetadataFromString } from \"@opentelemetry/api\";\nexport type {\n Baggage,\n BaggageEntry,\n BaggageEntryMetadata,\n} from \"@opentelemetry/api\";\n\nexport { JudgmentBaggagePropagator } from \"./JudgmentBaggagePropagator\";\n",
36
+ "import {\n type Context,\n defaultTextMapGetter,\n defaultTextMapSetter,\n type TextMapGetter,\n type TextMapPropagator,\n type TextMapSetter,\n} from \"@opentelemetry/api\";\nimport {\n CompositePropagator,\n W3CTraceContextPropagator,\n} from \"@opentelemetry/core\";\nimport { dontThrow } from \"../../utils/dont-throw\";\nimport { JudgmentBaggagePropagator } from \"../baggage/JudgmentBaggagePropagator\";\nimport { getTraceRuntime } from \"../runtime\";\n\n/**\n * Inject and extract trace context and baggage across service\n * boundaries through a composite W3C TraceContext + Baggage propagator.\n */\n\nlet _globalTextmap: TextMapPropagator = new CompositePropagator({\n propagators: [\n new W3CTraceContextPropagator(),\n new JudgmentBaggagePropagator(),\n ],\n});\n\n/** Return the active composite propagator (W3C TraceContext + Judgment Baggage). */\nexport function getGlobalTextmap(): TextMapPropagator {\n return _globalTextmap;\n}\n\n/** Replace the global text-map propagator. */\nexport function setGlobalTextmap(propagator: TextMapPropagator): void {\n _globalTextmap = propagator;\n}\n\nfunction _resolveContext(context?: Context): Context {\n if (context !== undefined) return context;\n return getTraceRuntime().getCurrentContext();\n}\n\n/**\n * Inject trace context and baggage into an outgoing carrier (e.g. HTTP\n * headers).\n *\n * Call this before making an outbound HTTP request to propagate the\n * current trace across service boundaries.\n *\n * @param carrier - A mutable object to write propagation headers into.\n * @param context - The context to inject. Defaults to the current\n * Judgment context.\n * @param setter - Strategy for writing values into the carrier.\n *\n * @example\n * ```typescript\n * const headers: Record<string, string> = {};\n * propagation.inject(headers);\n * await fetch(\"https://api.example.com\", { headers });\n * ```\n */\nexport function inject<Carrier>(\n carrier: Carrier,\n context?: Context,\n setter: TextMapSetter<Carrier> = defaultTextMapSetter as TextMapSetter<Carrier>,\n): void {\n dontThrow(\"propagation.inject\", () => {\n getGlobalTextmap().inject(_resolveContext(context), carrier, setter);\n });\n}\n\n/**\n * Extract trace context and baggage from an incoming carrier.\n *\n * Low-level primitive — most callers should use\n * {@link Tracer.continueTrace} instead, which extracts and installs the\n * context in one step.\n *\n * @param carrier - A mapping containing propagation headers (e.g.\n * `request.headers`).\n * @param context - Base context to merge into. Defaults to the current\n * active context.\n * @param getter - Strategy for reading values from the carrier.\n * @returns A new {@link Context} with the extracted trace and baggage\n * data.\n */\nexport function extract<Carrier>(\n carrier: Carrier,\n context?: Context,\n getter: TextMapGetter<Carrier> = defaultTextMapGetter as TextMapGetter<Carrier>,\n): Context {\n const base = _resolveContext(context);\n return dontThrow<Context>(\n \"propagation.extract\",\n () => getGlobalTextmap().extract(base, carrier, getter),\n base,\n );\n}\n",
37
+ "import {\n type Attributes,\n type Context,\n INVALID_SPAN_CONTEXT,\n type Span,\n SpanStatusCode,\n type Tracer,\n} from \"@opentelemetry/api\";\nimport type { Instrumentation } from \"@opentelemetry/instrumentation\";\nimport type {\n BasicTracerProvider,\n Sampler,\n SpanLimits,\n SpanProcessor,\n} from \"@opentelemetry/sdk-trace-base\";\nimport type { OpenAI } from \"openai\";\nimport { AttributeKeys, InternalAttributeKeys } from \"../JudgmentAttributeKeys\";\nimport { wrap } from \"../instrumentation\";\nimport { JudgmentApiClient } from \"../internal/api\";\nimport type { PendingEvalPayload } from \"../internal/api/models/PendingEvalPayload\";\nimport { parseFunctionArgs } from \"../utils/annotate\";\nimport { dontThrow } from \"../utils/dont-throw\";\nimport { Logger } from \"../utils/logger\";\nimport {\n safeStringify,\n serializeAttribute,\n Serializer,\n} from \"../utils/serializer\";\nimport { Maybe } from \"../utils/type-helpers\";\nimport { createBaggage, getBaggage, setBaggage } from \"./baggage\";\nimport { extract } from \"./propagation\";\nimport type { JudgmentSpanExporter } from \"./exporters/JudgmentSpanExporter\";\nimport type { JudgmentSpanProcessor } from \"./processors/JudgmentSpanProcessor\";\nimport { getTraceRuntime, type TraceRuntime } from \"./runtime\";\n\nconst TRACER_NAME = \"judgeval\";\n\n/**\n * Metadata about an LLM call to record on a span.\n */\nexport interface LLMMetadata {\n /** Model name (e.g. \"gpt-4o\"). */\n model?: Maybe<string>;\n /** Provider name (e.g. \"openai\"). */\n provider?: Maybe<string>;\n /** Number of non-cached input tokens. */\n non_cached_input_tokens?: Maybe<number>;\n /** Number of output tokens. */\n output_tokens?: Maybe<number>;\n /** Number of cache-read input tokens. */\n cache_read_input_tokens?: Maybe<number>;\n /** Number of cache-creation input tokens. */\n cache_creation_input_tokens?: Maybe<number>;\n /** Total cost in USD. */\n total_cost_usd?: Maybe<number>;\n}\n\n/**\n * Options for {@link BaseTracer.observe}.\n */\nexport interface ObserveOptions {\n /** The span kind (e.g. `\"llm\"`, `\"tool\"`, `\"span\"`). Defaults to `\"span\"`. */\n spanType?: string;\n /** Custom span name. Defaults to the wrapped function's name. */\n spanName?: string;\n /** Whether to record function inputs as a span attribute. Defaults to `true`. */\n recordInput?: boolean;\n /** Whether to record function outputs as a span attribute. Defaults to `true`. */\n recordOutput?: boolean;\n /**\n * If `true`, run the function in a fresh linked trace instead of as a\n * child of the current trace, when an active parent span exists.\n * Defaults to `false`.\n */\n fork?: boolean;\n}\n\n/**\n * Options for {@link BaseTracer.asyncEvaluate}.\n */\nexport interface AsyncEvaluateOptions {\n /**\n * Name of the hosted judge/scorer (e.g. `\"faithfulness\"`,\n * `\"answer_relevancy\"`).\n */\n judge: string;\n /**\n * Optional dict with evaluation data. Keys like `input`, `actual_output`,\n * `expected_output`, and `retrieval_context` are commonly used.\n */\n example?: Record<string, unknown>;\n}\n\n/**\n * Configuration options for initializing a Tracer.\n *\n * Credentials are resolved in order: explicit arguments first, then\n * environment variables.\n */\nexport interface TracerConfig {\n /** Your Judgment project name. Required for span export. */\n projectName?: string;\n /** Judgment API key. Defaults to `JUDGMENT_API_KEY` env var. */\n apiKey?: string;\n /** Judgment organization ID. Defaults to `JUDGMENT_ORG_ID` env var. */\n organizationId?: string;\n /** Judgment API URL. Defaults to `JUDGMENT_API_URL` env var. */\n apiUrl?: string;\n /** Deployment environment name (e.g. \"production\"). */\n environment?: string;\n /** Whether to automatically set this tracer as active. Defaults to `true`. */\n setActive?: boolean;\n /** Custom serialization function for span attribute values. */\n serializer?: (value: unknown) => string;\n /** Additional OpenTelemetry resource attributes. */\n resourceAttributes?: Record<string, string>;\n /** Custom OpenTelemetry sampler. Defaults to the SDK's default. */\n sampler?: Sampler;\n /** Custom OpenTelemetry span limits (attribute/event/link caps). */\n spanLimits?: SpanLimits;\n /** Additional span processors to register alongside Judgment's own processor. */\n spanProcessors?: SpanProcessor[];\n}\n\n/**\n * Abstract base for all Judgment tracers.\n *\n * Provides the core tracing surface: span creation, attribute recording,\n * the `observe` decorator, context propagation for customer/session IDs,\n * tagging, and async evaluation dispatch.\n * Concrete subclasses supply the OTel TracerProvider, exporter, and\n * processor wiring.\n */\nexport abstract class BaseTracer {\n projectName: string | null;\n projectId: string | null;\n apiKey: string | null;\n organizationId: string | null;\n apiUrl: string | null;\n environment: string | null;\n serializer: Serializer;\n _tracerProvider: BasicTracerProvider;\n _client: JudgmentApiClient | null;\n _enableMonitoring: boolean;\n\n readonly supportsLiveInstrumentation: boolean = true;\n\n // ------------------------------------------------------------------ //\n // Initialization //\n // ------------------------------------------------------------------ //\n\n protected constructor(\n projectName: string | null,\n projectId: string | null,\n apiKey: string | null,\n organizationId: string | null,\n apiUrl: string | null,\n environment: string | null,\n serializer: Serializer,\n tracerProvider: BasicTracerProvider,\n client: JudgmentApiClient | null,\n enableMonitoring: boolean,\n ) {\n this.projectName = projectName;\n this.projectId = projectId;\n this.apiKey = apiKey;\n this.organizationId = organizationId;\n this.apiUrl = apiUrl;\n this.environment = environment;\n this.serializer = serializer;\n this._tracerProvider = tracerProvider;\n this._client = client;\n this._enableMonitoring = enableMonitoring;\n }\n\n /**\n * Set this tracer as the active tracer in the global provider.\n *\n * @returns `true` if activation succeeded, `false` if a root span is active.\n */\n setActive(): boolean {\n return getTraceRuntime().setActive(this);\n }\n\n // ------------------------------------------------------------------ //\n // Abstract Lifecycle //\n // ------------------------------------------------------------------ //\n\n abstract getSpanProcessor(): JudgmentSpanProcessor;\n abstract getSpanExporter(): JudgmentSpanExporter;\n\n // ------------------------------------------------------------------ //\n // Internal Helpers //\n // ------------------------------------------------------------------ //\n\n private static _getProxyProvider(): TraceRuntime {\n return getTraceRuntime();\n }\n\n private static _getSerializer(): Serializer {\n const tracer = BaseTracer._getProxyProvider().getActiveTracer();\n return tracer?.serializer ?? safeStringify;\n }\n\n private static _getCurrentTraceAndSpanId(): [string, string] | null {\n const proxy = BaseTracer._getProxyProvider();\n const currentSpan = proxy.getCurrentSpan();\n if (!currentSpan?.isRecording()) return null;\n const ctx = currentSpan.spanContext();\n if (!ctx.traceId || !(ctx.traceFlags & 0x01)) return null;\n return [ctx.traceId, ctx.spanId];\n }\n\n private static _emitPartial(): void {\n dontThrow(\"BaseTracer._emitPartial\", () => {\n const tracer = BaseTracer._getProxyProvider().getActiveTracer();\n if (!tracer || !tracer.supportsLiveInstrumentation) return;\n tracer.getSpanProcessor().emitPartial();\n });\n }\n\n // ------------------------------------------------------------------ //\n // Static API: Span Access & Lifecycle //\n // ------------------------------------------------------------------ //\n\n /**\n * Get the currently active span.\n *\n * @returns The active span, or `undefined` if none.\n */\n static getCurrentSpan(): Span | undefined {\n const proxy = BaseTracer._getProxyProvider();\n return proxy.getCurrentSpan();\n }\n\n /**\n * Flush all pending spans to the export endpoint.\n *\n * Call this before your process exits to ensure all spans are sent.\n *\n * @example\n * ```typescript\n * await Tracer.forceFlush();\n * ```\n */\n static async forceFlush(): Promise<void> {\n const proxy = BaseTracer._getProxyProvider();\n await proxy.forceFlush();\n }\n\n /**\n * Shut down the tracer and flush any pending data.\n *\n * @example\n * ```typescript\n * await Tracer.shutdown();\n * ```\n */\n static async shutdown(): Promise<void> {\n const proxy = BaseTracer._getProxyProvider();\n await proxy.shutdown();\n }\n\n /**\n * Register an OpenTelemetry instrumentation to capture spans automatically.\n *\n * @param instrumentor - The OpenTelemetry instrumentation to register.\n *\n * @example\n * ```typescript\n * import { OpenAIInstrumentation } from \"@opentelemetry/instrumentation-openai\";\n * Tracer.registerOTELInstrumentation(new OpenAIInstrumentation());\n * ```\n */\n static registerOTELInstrumentation(instrumentor: Instrumentation): void {\n dontThrow(\"BaseTracer.registerOTELInstrumentation\", () => {\n const proxy = BaseTracer._getProxyProvider();\n proxy.addInstrumentation(instrumentor);\n });\n }\n\n /**\n * Wrap a supported LLM client to add automatic tracing.\n *\n * Currently supports OpenAI clients. The client is instrumented\n * in-place and returned.\n *\n * Lives on `BaseTracer` (rather than a runtime-specific subclass) because\n * the OpenAI wrapper relies only on fetch-based method interception — the\n * `openai` import is types-only and it uses no Node built-ins — so it is\n * safe in both the Node and Workers runtimes.\n *\n * @param client - An LLM client instance (e.g. `new OpenAI()`).\n * @returns The same client instance, instrumented.\n *\n * @example\n * ```typescript\n * import OpenAI from \"openai\";\n *\n * const client = Tracer.wrap(new OpenAI());\n * ```\n */\n static wrap<T extends OpenAI>(client: T): T {\n return wrap(client);\n }\n\n // ------------------------------------------------------------------ //\n // Static: Span Creation (OTEL-like signatures) //\n // ------------------------------------------------------------------ //\n\n /**\n * Get the underlying OpenTelemetry Tracer instance.\n *\n * @returns The OpenTelemetry `Tracer`.\n */\n static getOTELTracer(): Tracer {\n const proxy = BaseTracer._getProxyProvider();\n return proxy.getTracer(TRACER_NAME);\n }\n\n /**\n * Start a new span without setting it as active.\n *\n * **Most users should prefer {@link observe} or {@link with}**, which\n * handle activation, error recording, and span ending automatically.\n * Use this only when you need low-level control over the span lifecycle.\n *\n * @param name - The span name.\n * @param attributes - Optional span attributes.\n * @returns The created span.\n */\n static startSpan(name: string, attributes?: Attributes): Span {\n const span = BaseTracer.getOTELTracer().startSpan(name, { attributes });\n BaseTracer._emitPartial();\n return span;\n }\n\n /**\n * Start a new active span and run a function within it.\n *\n * The span is automatically ended when the function completes.\n *\n * **Most users should prefer {@link observe} or {@link with}**, which\n * additionally record inputs/outputs and capture errors automatically.\n * Use this only when you need low-level control over the span lifecycle.\n *\n * @param options - Span options. `name` is required; `attributes` is optional.\n * @param fn - Function to execute within the span context.\n * @returns The return value of `fn`.\n *\n * @example\n * ```typescript\n * Tracer.startActiveSpan({ name: \"fetch-user\" }, (span) => {\n * // ...\n * });\n * ```\n */\n static startActiveSpan<T>(\n options: { name: string; attributes?: Attributes },\n fn: (span: Span) => T,\n ): T {\n const { name, attributes } = options;\n return BaseTracer.getOTELTracer().startActiveSpan(\n name,\n { attributes },\n (span) => {\n BaseTracer._emitPartial();\n try {\n const result = fn(span);\n if (result instanceof Promise) {\n return (result as Promise<unknown>).finally(() => {\n span.end();\n }) as T;\n }\n span.end();\n return result;\n } catch (e) {\n span.end();\n throw e;\n }\n },\n );\n }\n\n // ------------------------------------------------------------------ //\n // Static: Span Helpers //\n // ------------------------------------------------------------------ //\n\n /**\n * Create a named span, execute a function, and handle errors.\n *\n * Errors are recorded on the span and re-thrown.\n *\n * @param spanName - The span name.\n * @param fn - Function to execute within the span.\n * @returns The return value of `fn`.\n */\n static span<T>(spanName: string, fn: (span: Span) => T): T {\n return BaseTracer.startActiveSpan({ name: spanName }, (span) => {\n try {\n const result = fn(span);\n if (result instanceof Promise) {\n return result.catch((e: unknown) => {\n span.setStatus({ code: SpanStatusCode.ERROR, message: String(e) });\n span.recordException(e as Error);\n throw e;\n }) as T;\n }\n return result;\n } catch (e) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: String(e) });\n span.recordException(e as Error);\n throw e;\n }\n });\n }\n\n /**\n * Alias for {@link span}. Create a named span and execute a function within it.\n *\n * @param spanName - The span name.\n * @param fn - Function to execute within the span.\n * @returns The return value of `fn`.\n */\n static with<T>(spanName: string, fn: (span: Span) => T): T {\n return BaseTracer.span(spanName, fn);\n }\n\n /**\n * Continue a distributed trace from an upstream service.\n *\n * Extracts W3C trace context and baggage from `carrier` and installs\n * it as the active context for the duration of `fn`. Any span started\n * inside — including `@Tracer.observe`-wrapped functions and\n * `Tracer.with` blocks — becomes a child of the upstream parent,\n * stitching your service into the caller's trace.\n *\n * Use this at the entry point of an inbound request (HTTP handler,\n * message queue consumer, RPC dispatcher, etc.) to join a trace\n * started by the upstream caller. If the carrier contains no trace\n * context, `fn` still runs normally with a fresh context.\n *\n * @param carrier - A mapping containing propagation headers. Typically\n * `req.headers` from Node's `http`/Express/Fastify, but any dict-shaped\n * object with lowercase keys works (queue attributes, Lambda event\n * headers, RPC metadata, etc.).\n * @param fn - Function to run inside the extracted context. Receives\n * the extracted {@link Context} as its argument; most callers ignore\n * it. Sync or async.\n * @returns The return value of `fn`.\n *\n * @example\n * ```typescript\n * import { Tracer } from \"judgeval\";\n *\n * const handle = Tracer.observe(async (payload: unknown) => {\n * // ... your agent logic ...\n * });\n *\n * // Express / Node http handler:\n * app.post(\"/run\", async (req, res) => {\n * await Tracer.continueTrace(req.headers, async () => {\n * const result = await handle(req.body);\n * res.json(result);\n * });\n * });\n * ```\n *\n * Propagating in the opposite direction (outbound):\n *\n * @example\n * ```typescript\n * import { propagation } from \"judgeval\";\n *\n * const headers: Record<string, string> = {};\n * propagation.inject(headers);\n * await fetch(downstreamUrl, { headers, method: \"POST\", body });\n * ```\n */\n static continueTrace<T>(carrier: object, fn: (ctx: Context) => T): T {\n const proxy = BaseTracer._getProxyProvider();\n const ctx = extract(carrier);\n return proxy.withContext(ctx, () => fn(ctx));\n }\n\n // ------------------------------------------------------------------ //\n // Static API: Observation Decorator //\n // ------------------------------------------------------------------ //\n\n /**\n * Wrap a function to automatically create spans and record inputs/outputs.\n *\n * Can be called with a function to wrap it directly, or with just options\n * to get a decorator (e.g. for TC39 decorator syntax).\n *\n * @param func - The function to wrap. Omit to get a decorator.\n * @param options - Optional observation options.\n * @returns The wrapped function, or a decorator if `func` is omitted.\n *\n * @example\n * ```typescript\n * // Direct wrapping\n * const traced = Tracer.observe(\n * async (query: string) => search(query),\n * { spanType: \"tool\" },\n * );\n *\n * // Decorator form\n * class Agent {\n * \\@Tracer.observe({ spanType: \"llm\" })\n * async chat(input: string) { ... }\n * }\n *\n * // Fork into a linked trace\n * const delegate = Tracer.observe(runSubsystem, {\n * spanType: \"agent\",\n * fork: true,\n * });\n * ```\n */\n static observe<TArgs extends unknown[], TReturn>(\n func: (...args: TArgs) => TReturn,\n options?: ObserveOptions,\n ): (...args: TArgs) => TReturn;\n static observe(\n options?: ObserveOptions,\n ): <TArgs extends unknown[], TReturn>(\n func: (...args: TArgs) => TReturn,\n context?: unknown,\n ) => (...args: TArgs) => TReturn;\n static observe<TArgs extends unknown[], TReturn>(\n funcOrOptions?: ((...args: TArgs) => TReturn) | ObserveOptions,\n options?: ObserveOptions,\n ):\n | ((...args: TArgs) => TReturn)\n | ((func: (...args: TArgs) => TReturn) => (...args: TArgs) => TReturn) {\n let func: ((...args: TArgs) => TReturn) | undefined;\n if (typeof funcOrOptions === \"function\") {\n func = funcOrOptions;\n } else {\n options = funcOrOptions;\n }\n const {\n spanType = \"span\",\n spanName,\n recordInput = true,\n recordOutput = true,\n fork = false,\n } = options ?? {};\n const proxy = BaseTracer._getProxyProvider();\n const decorator = (\n innerFunc: (...args: TArgs) => TReturn,\n ): ((...args: TArgs) => TReturn) => {\n const name = spanName ?? innerFunc.name;\n return function (this: unknown, ...args: TArgs): TReturn {\n const otelTracer = proxy.getTracer(TRACER_NAME);\n\n const shouldFork =\n fork &&\n proxy.getActiveTracer() !== null &&\n proxy.getCurrentSpan()?.isRecording() === true;\n\n if (shouldFork) {\n const serializer = BaseTracer._getSerializer();\n\n // Invocation span — child of current trace\n const invocationSpan = otelTracer.startSpan(name);\n const invocationCtx = invocationSpan.spanContext();\n if (spanType) {\n invocationSpan.setAttribute(\n AttributeKeys.JUDGMENT_SPAN_KIND,\n spanType,\n );\n }\n\n // Linked-root span — root of a new trace\n const linkedRootAttrs: Attributes = {\n [AttributeKeys.JUDGMENT_LINK_SOURCE_TRACE_ID]:\n invocationCtx.traceId,\n [AttributeKeys.JUDGMENT_LINK_SOURCE_SPAN_ID]: invocationCtx.spanId,\n };\n if (spanType) {\n linkedRootAttrs[AttributeKeys.JUDGMENT_SPAN_KIND] = spanType;\n }\n\n const parentlessCtx = proxy.setSpan(\n proxy.getCurrentContext(),\n proxy.wrapSpanContext(INVALID_SPAN_CONTEXT),\n );\n const linkedRoot = otelTracer.startSpan(\n name,\n { attributes: linkedRootAttrs },\n parentlessCtx,\n );\n const linkedRootCtx = linkedRoot.spanContext();\n invocationSpan.setAttribute(\n AttributeKeys.JUDGMENT_LINK_TARGET_TRACE_ID,\n linkedRootCtx.traceId,\n );\n invocationSpan.setAttribute(\n AttributeKeys.JUDGMENT_LINK_TARGET_SPAN_ID,\n linkedRootCtx.spanId,\n );\n\n const endBoth = (): void => {\n linkedRoot.end();\n invocationSpan.end();\n };\n const recordErrorOnBoth = (e: unknown): void => {\n for (const s of [linkedRoot, invocationSpan]) {\n s.recordException(e as Error);\n s.setStatus({\n code: SpanStatusCode.ERROR,\n message: String(e),\n });\n }\n };\n const recordOutputOnBoth = (value: unknown): void => {\n const serialized = serializeAttribute(value, serializer);\n linkedRoot.setAttribute(AttributeKeys.JUDGMENT_OUTPUT, serialized);\n invocationSpan.setAttribute(\n AttributeKeys.JUDGMENT_OUTPUT,\n serialized,\n );\n };\n\n if (recordInput) {\n const serializedInput = serializeAttribute(\n getInputs(innerFunc, args),\n serializer,\n );\n linkedRoot.setAttribute(\n AttributeKeys.JUDGMENT_INPUT,\n serializedInput,\n );\n invocationSpan.setAttribute(\n AttributeKeys.JUDGMENT_INPUT,\n serializedInput,\n );\n }\n BaseTracer._emitPartial();\n\n return proxy.useSpan(linkedRoot, false, false, false, (): TReturn => {\n try {\n const result = innerFunc.call(this, ...args);\n if (result instanceof Promise) {\n return (result as Promise<unknown>)\n .then((res) => {\n if (recordOutput) recordOutputOnBoth(res);\n return res as TReturn;\n })\n .catch((e: unknown) => {\n recordErrorOnBoth(e);\n throw e;\n })\n .finally(endBoth) as TReturn;\n }\n if (recordOutput) recordOutputOnBoth(result);\n endBoth();\n return result;\n } catch (e) {\n recordErrorOnBoth(e);\n endBoth();\n throw e;\n }\n });\n }\n\n return otelTracer.startActiveSpan(name, (span) => {\n if (spanType) {\n span.setAttribute(AttributeKeys.JUDGMENT_SPAN_KIND, spanType);\n }\n try {\n if (recordInput) {\n span.setAttribute(\n AttributeKeys.JUDGMENT_INPUT,\n serializeAttribute(\n getInputs(innerFunc, args),\n BaseTracer._getSerializer(),\n ),\n );\n }\n BaseTracer._emitPartial();\n const result = innerFunc.call(this, ...args);\n\n if (result instanceof Promise) {\n return (result as Promise<unknown>)\n .then((res) => {\n if (recordOutput) {\n span.setAttribute(\n AttributeKeys.JUDGMENT_OUTPUT,\n serializeAttribute(res, BaseTracer._getSerializer()),\n );\n }\n return res as TReturn;\n })\n .catch((e: unknown) => {\n span.recordException(e as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: String(e),\n });\n throw e;\n })\n .finally(() => {\n span.end();\n }) as TReturn;\n }\n\n if (recordOutput) {\n span.setAttribute(\n AttributeKeys.JUDGMENT_OUTPUT,\n serializeAttribute(result, BaseTracer._getSerializer()),\n );\n }\n span.end();\n return result;\n } catch (e) {\n span.recordException(e as Error);\n span.setStatus({ code: SpanStatusCode.ERROR, message: String(e) });\n span.end();\n throw e;\n }\n });\n };\n };\n\n if (!func) return decorator;\n return decorator(func);\n }\n\n // ------------------------------------------------------------------ //\n // Internal: resolve target span //\n // ------------------------------------------------------------------ //\n\n private static _resolveSpan(span?: Span): Span | undefined {\n if (span) return span;\n return BaseTracer._getProxyProvider().getCurrentSpan();\n }\n\n // ------------------------------------------------------------------ //\n // Static: Span Kind //\n // ------------------------------------------------------------------ //\n\n /**\n * Set the kind of a span.\n *\n * @param kind - The span kind (e.g. \"llm\", \"tool\", \"span\").\n * @param span - Target span. Defaults to the current active span.\n */\n static setSpanKind(kind: string): void;\n static setSpanKind(kind: string, span: Span): void;\n static setSpanKind(kind: string, span?: Span): void {\n dontThrow(\"BaseTracer.setSpanKind\", () => {\n if (!kind) return;\n const target = BaseTracer._resolveSpan(span);\n if (target?.isRecording()) {\n target.setAttribute(AttributeKeys.JUDGMENT_SPAN_KIND, kind);\n }\n });\n }\n\n /**\n * Set the current span kind to \"llm\".\n */\n static setLLMSpan(): void {\n BaseTracer.setSpanKind(\"llm\");\n }\n\n /**\n * Set the current span kind to \"tool\".\n */\n static setToolSpan(): void {\n BaseTracer.setSpanKind(\"tool\");\n }\n\n /**\n * Set the current span kind to \"span\".\n */\n static setGeneralSpan(): void {\n BaseTracer.setSpanKind(\"span\");\n }\n\n // ------------------------------------------------------------------ //\n // Static: Span Attribute Operations //\n // ------------------------------------------------------------------ //\n\n /**\n * Set a single attribute on a span.\n *\n * @param key - The attribute key.\n * @param value - The attribute value (will be serialized).\n * @param span - Target span. Defaults to the current active span.\n */\n static setAttribute(key: string, value: unknown): void;\n static setAttribute(key: string, value: unknown, span: Span): void;\n static setAttribute(key: string, value: unknown, span?: Span): void {\n dontThrow(\"BaseTracer.setAttribute\", () => {\n const target = BaseTracer._resolveSpan(span);\n if (!target?.isRecording()) return;\n if (!key || value == null) return;\n target.setAttribute(\n key,\n serializeAttribute(value, BaseTracer._getSerializer()),\n );\n });\n }\n\n /**\n * Set multiple attributes on a span.\n *\n * @param attributes - Key-value pairs to set.\n * @param span - Target span. Defaults to the current active span.\n */\n static setAttributes(attributes: Record<string, unknown>): void;\n static setAttributes(attributes: Record<string, unknown>, span: Span): void;\n static setAttributes(attributes: Record<string, unknown>, span?: Span): void {\n for (const [key, value] of Object.entries(attributes)) {\n if (span) BaseTracer.setAttribute(key, value, span);\n else BaseTracer.setAttribute(key, value);\n }\n }\n\n /**\n * Set the input data on a span.\n *\n * @param inputData - The input data to record.\n * @param span - Target span. Defaults to the current active span.\n */\n static setInput(inputData: unknown): void;\n static setInput(inputData: unknown, span: Span): void;\n static setInput(inputData: unknown, span?: Span): void {\n if (span)\n BaseTracer.setAttribute(AttributeKeys.JUDGMENT_INPUT, inputData, span);\n else BaseTracer.setAttribute(AttributeKeys.JUDGMENT_INPUT, inputData);\n }\n\n /**\n * Set the output data on a span.\n *\n * @param outputData - The output data to record.\n * @param span - Target span. Defaults to the current active span.\n */\n static setOutput(outputData: unknown): void;\n static setOutput(outputData: unknown, span: Span): void;\n static setOutput(outputData: unknown, span?: Span): void {\n if (span)\n BaseTracer.setAttribute(AttributeKeys.JUDGMENT_OUTPUT, outputData, span);\n else BaseTracer.setAttribute(AttributeKeys.JUDGMENT_OUTPUT, outputData);\n }\n\n /**\n * Record an error on a span.\n *\n * Sets the span status to ERROR and records the exception.\n *\n * @param error - The error to record.\n * @param span - Target span. Defaults to the current active span.\n */\n static setError(error: unknown): void;\n static setError(error: unknown, span: Span): void;\n static setError(error: unknown, span?: Span): void {\n dontThrow(\"BaseTracer.setError\", () => {\n const target = BaseTracer._resolveSpan(span);\n if (!target?.isRecording()) return;\n target.recordException(error as Error);\n target.setStatus({ code: SpanStatusCode.ERROR, message: String(error) });\n });\n }\n\n /**\n * Record LLM usage metadata on a span.\n *\n * @param metadata - LLM metadata including model, provider, and token counts.\n * @param span - Target span. Defaults to the current active span.\n *\n * @example\n * ```typescript\n * Tracer.recordLLMMetadata({\n * model: \"gpt-4o\",\n * provider: \"openai\",\n * output_tokens: 150,\n * });\n * ```\n */\n static recordLLMMetadata(metadata: LLMMetadata): void;\n static recordLLMMetadata(metadata: LLMMetadata, span: Span): void;\n static recordLLMMetadata(metadata: LLMMetadata, span?: Span): void {\n dontThrow(\"BaseTracer.recordLLMMetadata\", () => {\n const target = BaseTracer._resolveSpan(span);\n if (!target?.isRecording()) return;\n\n if (typeof metadata.model === \"string\") {\n target.setAttribute(\n AttributeKeys.JUDGMENT_LLM_MODEL_NAME,\n metadata.model,\n );\n }\n\n if (typeof metadata.provider === \"string\") {\n target.setAttribute(\n AttributeKeys.JUDGMENT_LLM_PROVIDER,\n metadata.provider,\n );\n }\n\n if (typeof metadata.non_cached_input_tokens === \"number\") {\n target.setAttribute(\n AttributeKeys.JUDGMENT_USAGE_NON_CACHED_INPUT_TOKENS,\n metadata.non_cached_input_tokens,\n );\n }\n if (typeof metadata.output_tokens === \"number\") {\n target.setAttribute(\n AttributeKeys.JUDGMENT_USAGE_OUTPUT_TOKENS,\n metadata.output_tokens,\n );\n }\n if (typeof metadata.cache_read_input_tokens === \"number\") {\n target.setAttribute(\n AttributeKeys.JUDGMENT_USAGE_CACHE_READ_INPUT_TOKENS,\n metadata.cache_read_input_tokens,\n );\n }\n if (typeof metadata.cache_creation_input_tokens === \"number\") {\n target.setAttribute(\n AttributeKeys.JUDGMENT_USAGE_CACHE_CREATION_INPUT_TOKENS,\n metadata.cache_creation_input_tokens,\n );\n }\n if (typeof metadata.total_cost_usd === \"number\") {\n target.setAttribute(\n AttributeKeys.JUDGMENT_USAGE_TOTAL_COST_USD,\n metadata.total_cost_usd,\n );\n }\n });\n }\n\n // ------------------------------------------------------------------ //\n // Static: Context Propagation //\n // ------------------------------------------------------------------ //\n\n /**\n * Set a key on the current span and on baggage so it propagates to all\n * child spans. Also reattaches the current context to the updated one.\n */\n private static _setPropagatingBaggageKey(key: string, value: string): void {\n dontThrow(\"BaseTracer._setPropagatingBaggageKey\", () => {\n const proxy = BaseTracer._getProxyProvider();\n const currentSpan = proxy.getCurrentSpan();\n if (!currentSpan?.isRecording()) return;\n currentSpan.setAttribute(key, value);\n const ctx = proxy.getCurrentContext();\n const baggage = (getBaggage(ctx) ?? createBaggage()).setEntry(key, {\n value,\n });\n proxy.attachContext(setBaggage(ctx, baggage));\n });\n }\n\n /**\n * Set the customer ID on the current active span.\n *\n * The ID is automatically propagated to all child spans via baggage.\n * This method always targets the active span because it modifies\n * the active context's baggage for propagation.\n *\n * @param customerId - The customer identifier.\n */\n static setCustomerId(customerId: string): void {\n BaseTracer._setPropagatingBaggageKey(\n AttributeKeys.JUDGMENT_CUSTOMER_ID,\n customerId,\n );\n }\n\n /**\n * Set the customer user ID on the current active span.\n *\n * The ID is automatically propagated to all child spans via baggage.\n * This method always targets the active span because it modifies\n * the active context's baggage for propagation.\n *\n * @param customerUserId - The customer user identifier.\n */\n static setCustomerUserId(customerUserId: string): void {\n BaseTracer._setPropagatingBaggageKey(\n AttributeKeys.JUDGMENT_CUSTOMER_USER_ID,\n customerUserId,\n );\n }\n\n /**\n * Set the session ID on the current active span.\n *\n * The ID is automatically propagated to all child spans via baggage.\n * This method always targets the active span because it modifies\n * the active context's baggage for propagation.\n *\n * @param sessionId - The session identifier.\n */\n static setSessionId(sessionId: string): void {\n BaseTracer._setPropagatingBaggageKey(\n AttributeKeys.JUDGMENT_SESSION_ID,\n sessionId,\n );\n }\n\n // ------------------------------------------------------------------ //\n // Static: Tags //\n // ------------------------------------------------------------------ //\n\n /**\n * Add tags to the current trace.\n *\n * @param tags - A single tag string or an array of tag strings.\n *\n * @example\n * ```typescript\n * Tracer.tag(\"production\");\n * Tracer.tag([\"important\", \"customer-facing\"]);\n * ```\n */\n static tag(tags: string | string[]): void {\n dontThrow(\"BaseTracer.tag\", () => {\n if (!tags || (Array.isArray(tags) && tags.length === 0)) return;\n const proxy = BaseTracer._getProxyProvider();\n const tracer = proxy.getActiveTracer();\n if (!tracer?.projectId || !tracer._client) return;\n if (!tracer.supportsLiveInstrumentation) return;\n const ids = BaseTracer._getCurrentTraceAndSpanId();\n if (!ids) return;\n const [traceId] = ids;\n const tagArray = Array.isArray(tags) ? tags : [tags];\n tracer._client\n .postV1projectsTracesByTraceIdTags(tracer.projectId, traceId, {\n tags: tagArray,\n })\n .catch((err: unknown) => {\n Logger.error(`tag failed: ${String(err)}`);\n });\n });\n }\n\n // ------------------------------------------------------------------ //\n // Static API: Async Evaluation //\n // ------------------------------------------------------------------ //\n\n /**\n * Trigger an asynchronous server-side evaluation on a span.\n *\n * The evaluation is queued and processed server-side by the Judgment\n * platform after the span ends. Use this to score live traffic\n * without blocking your application.\n *\n * @param options - Evaluation options. `judge` is required; `example`\n * is optional evaluation data.\n * @param span - Target span. Defaults to the current active span.\n *\n * @example\n * ```typescript\n * Tracer.asyncEvaluate({\n * judge: \"answer_relevancy\",\n * example: {\n * input: \"What is AI?\",\n * actual_output: response,\n * },\n * });\n * ```\n */\n static asyncEvaluate(options: AsyncEvaluateOptions): void;\n static asyncEvaluate(options: AsyncEvaluateOptions, span: Span): void;\n static asyncEvaluate(options: AsyncEvaluateOptions, span?: Span): void {\n dontThrow(\"BaseTracer.asyncEvaluate\", () => {\n const { judge, example } = options;\n const proxy = BaseTracer._getProxyProvider();\n const tracer = proxy.getActiveTracer();\n if (!tracer?.projectId) return;\n if (!tracer.supportsLiveInstrumentation) return;\n const target = BaseTracer._resolveSpan(span);\n if (!target?.isRecording()) return;\n\n const processor = tracer.getSpanProcessor();\n const ctx = target.spanContext();\n\n const idx = processor.stateIncr(\n ctx,\n InternalAttributeKeys.PENDING_EVALS_COUNT,\n );\n const payload: PendingEvalPayload = {\n project_id: tracer.projectId,\n eval_name: `async_evaluate_${judge}_${idx}`,\n judges: [{ name: judge }],\n examples: [\n {\n ...example,\n example_id: crypto.randomUUID(),\n created_at: new Date().toISOString(),\n trace_id: ctx.traceId,\n span_id: ctx.spanId,\n },\n ],\n is_offline: false,\n is_behavior: false,\n };\n const updated = processor.stateAppend<PendingEvalPayload>(\n ctx,\n InternalAttributeKeys.PENDING_EVALS,\n payload,\n );\n\n // Raw setAttribute — value is already JSON-stringified, BaseTracer.setAttribute would double-serialize.\n target.setAttribute(\n AttributeKeys.JUDGMENT_PENDING_TRACE_EVAL,\n JSON.stringify(updated),\n );\n });\n }\n}\n\nfunction getInputs<TArgs extends unknown[]>(\n f: (...args: TArgs) => unknown,\n args: TArgs,\n): Record<string, unknown> {\n try {\n const paramNames = parseFunctionArgs(f)\n .map((param) =>\n param\n .replace(/^\\.\\.\\./, \"\")\n .split(\"=\")[0]\n .trim(),\n )\n .filter((param) => param.length > 0);\n const inputs: Record<string, unknown> = {};\n paramNames.forEach((name, index) => {\n if (index < args.length) {\n inputs[name] = args[index];\n }\n });\n return inputs;\n } catch {\n return {};\n }\n}\n",
38
+ "import {\n ROOT_CONTEXT,\n context as otelContext,\n type Context,\n} from \"@opentelemetry/api\";\nimport { AsyncLocalStorage } from \"async_hooks\";\n\ntype OTelContextApi = typeof otelContext;\n\nlet installed = false;\nlet getJudgmentContext: (() => Context) | null = null;\n\nconst gateStorage = new AsyncLocalStorage<boolean>();\nconst bridgeContextStorage = new AsyncLocalStorage<Context>();\n\nconst originalActive = otelContext.active.bind(otelContext);\nconst originalWith = otelContext.with.bind(otelContext);\nconst originalBind = otelContext.bind.bind(otelContext);\n\nfunction isGateEnabled(): boolean {\n return gateStorage.getStore() === true;\n}\n\nexport function installOtelContextBridge(\n getCurrentJudgmentContext: () => Context,\n): void {\n getJudgmentContext = getCurrentJudgmentContext;\n if (installed) return;\n\n const api = otelContext as OTelContextApi & {\n active: () => Context;\n with: <A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n context: Context,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n ) => ReturnType<F>;\n bind: <T>(context: Context, target: T) => T;\n };\n\n api.active = (): Context => {\n if (!isGateEnabled()) return originalActive();\n const bridged = bridgeContextStorage.getStore();\n if (bridged) return bridged;\n return getJudgmentContext ? getJudgmentContext() : ROOT_CONTEXT;\n };\n\n api.with = (contextValue, fn, thisArg, ...args) => {\n if (!isGateEnabled())\n return originalWith(contextValue, fn, thisArg, ...args);\n return bridgeContextStorage.run(contextValue, () =>\n fn.apply(thisArg, args),\n );\n };\n\n api.bind = (contextValue, target) => {\n if (!isGateEnabled()) return originalBind(contextValue, target);\n if (typeof target !== \"function\") return target;\n const fn = target as unknown as (...args: unknown[]) => unknown;\n return ((...args: unknown[]) =>\n bridgeContextStorage.run(contextValue, () =>\n fn(...args),\n )) as typeof target;\n };\n\n installed = true;\n}\n\nexport function runWithOtelBridgeGate<T>(ctx: Context, fn: () => T): T {\n return gateStorage.run(true, () => bridgeContextStorage.run(ctx, fn));\n}\n",
39
+ "import {\n ROOT_CONTEXT,\n SpanStatusCode,\n trace,\n type Context,\n type Span,\n type SpanContext,\n type SpanOptions,\n type Tracer,\n type TracerProvider,\n} from \"@opentelemetry/api\";\nimport {\n registerInstrumentations,\n type Instrumentation,\n} from \"@opentelemetry/instrumentation\";\nimport { AsyncLocalStorage } from \"async_hooks\";\nimport { Logger } from \"../utils/logger\";\nimport type { BaseTracer } from \"./BaseTracer\";\nimport {\n installOtelContextBridge,\n runWithOtelBridgeGate,\n} from \"./instrumentation/OtelContextBridge\";\nimport { noOpTracer } from \"./NoOpTracer\";\nimport { setTraceRuntime } from \"./runtime\";\n\nconst TRACER_NAME = \"judgeval\";\n\nconst _contextStorage = new AsyncLocalStorage<Context>();\n\nclass ProxyTracer implements Tracer {\n private _provider: JudgmentTracerProvider;\n\n constructor(provider: JudgmentTracerProvider) {\n this._provider = provider;\n }\n\n startSpan(name: string, options?: SpanOptions, context?: Context): Span {\n const ctx = context ?? this._provider.getCurrentContext();\n const delegate = this._provider._getDelegateTracer();\n return delegate.startSpan(name, options, ctx);\n }\n\n startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n options: SpanOptions,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n options: SpanOptions,\n context: Context,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n ...args: [F] | [SpanOptions, F] | [SpanOptions, Context, F]\n ): ReturnType<F> {\n let options: SpanOptions = {};\n let context: Context = this._provider.getCurrentContext();\n let fn: F;\n\n if (args.length === 1) {\n fn = args[0];\n } else if (args.length === 2) {\n options = args[0];\n fn = args[1];\n } else {\n options = args[0];\n context = args[1];\n fn = args[2];\n }\n\n const span = this.startSpan(name, options, context);\n return this._provider.useSpan(span, false, false, false, () =>\n fn(span),\n ) as ReturnType<F>;\n }\n}\n\n/**\n * Global singleton that manages tracer registration and context propagation.\n *\n * Acts as a proxy TracerProvider that delegates to the currently active\n * tracer's underlying OpenTelemetry provider.\n */\nexport class JudgmentTracerProvider implements TracerProvider {\n private static _instance: JudgmentTracerProvider | null = null;\n\n private _activeTracer: BaseTracer | null = null;\n private _instrumentations: Instrumentation[] = [];\n private _proxyTracer: ProxyTracer;\n private _tracers = new Set<BaseTracer>();\n\n private constructor() {\n this._proxyTracer = new ProxyTracer(this);\n setTraceRuntime(this);\n installOtelContextBridge(() => this.getCurrentContext());\n }\n\n /**\n * Get the singleton JudgmentTracerProvider instance.\n *\n * @returns The global provider instance.\n */\n static getInstance(): JudgmentTracerProvider {\n JudgmentTracerProvider._instance ??= new JudgmentTracerProvider();\n return JudgmentTracerProvider._instance;\n }\n\n /**\n * Install the JudgmentTracerProvider as the global tracer provider.\n * This generally does not need to be called - Judgeval automatically uses this for all its observability functionality.\n * Only use this if you specifically want to override the global tracer provider, which will enable all Opentelemetry captured instrumentations to flow through judgeval.\n * @returns True if the installation was successful, false otherwise.\n */\n static installAsGlobalTracerProvider(): boolean {\n const instance = JudgmentTracerProvider.getInstance();\n return trace.setGlobalTracerProvider(instance);\n }\n\n /**\n * Register a tracer with the provider.\n *\n * @param tracer - The tracer to register.\n */\n register(tracer: BaseTracer): void {\n this._tracers.add(tracer);\n }\n\n /**\n * Remove a tracer from the provider.\n *\n * @param tracer - The tracer to deregister.\n */\n deregister(tracer: BaseTracer): void {\n this._tracers.delete(tracer);\n }\n\n /**\n * Set a tracer as the active tracer.\n *\n * Cannot be called while a root span is active.\n *\n * @param tracer - The tracer to activate.\n * @returns `true` if activation succeeded.\n */\n setActive(tracer: BaseTracer): boolean {\n const currentSpan = this.getCurrentSpan();\n if (currentSpan?.isRecording()) {\n if (trace.getSpan(this.getCurrentContext()) === currentSpan) {\n Logger.error(\n \"Cannot set_active() while a root span is active. Keeping existing tracer provider.\",\n );\n return false;\n }\n }\n this.register(tracer);\n this._activeTracer = tracer;\n return true;\n }\n\n /**\n * Get the currently active tracer.\n *\n * @returns The active tracer, or `null` if none.\n */\n getActiveTracer(): BaseTracer | null {\n return this._activeTracer;\n }\n\n /**\n * Get the current OpenTelemetry context.\n *\n * @returns The current context.\n */\n getCurrentContext(): Context {\n return _contextStorage.getStore() ?? ROOT_CONTEXT;\n }\n\n /**\n * Set a span on a context, returning a new context.\n */\n setSpan(ctx: Context, span: Span): Context {\n return trace.setSpan(ctx, span);\n }\n\n /**\n * Wrap a SpanContext into a non-recording Span.\n */\n wrapSpanContext(spanContext: SpanContext): Span {\n return trace.wrapSpanContext(spanContext);\n }\n\n /**\n * Get the span from the current context.\n *\n * @returns The current span, or `undefined` if none.\n */\n getCurrentSpan(): Span | undefined {\n const ctx = this.getCurrentContext();\n return trace.getSpan(ctx);\n }\n\n /**\n * Check whether there is an active root span.\n *\n * @returns `true` if a root span is currently recording.\n */\n hasActiveRootSpan(): boolean {\n const currentSpan = this.getCurrentSpan();\n if (!currentSpan?.isRecording()) return false;\n return true;\n }\n\n _getDelegateTracer(): Tracer {\n const tracer = this._activeTracer;\n if (!tracer) {\n Logger.debug(\"No active tracer, returning NoOpTracer\");\n return noOpTracer;\n }\n return tracer._tracerProvider.getTracer(TRACER_NAME);\n }\n\n getTracer(\n _instrumentingModuleName: string,\n _instrumentingLibraryVersion?: string,\n _options?: { schemaUrl?: string },\n ): Tracer {\n return this._proxyTracer;\n }\n\n /**\n * Register an OpenTelemetry instrumentation.\n *\n * @param instrumentor - The instrumentation to add.\n */\n addInstrumentation(instrumentor: Instrumentation): void {\n try {\n registerInstrumentations({\n tracerProvider: this,\n instrumentations: [instrumentor],\n });\n this._instrumentations.push(instrumentor);\n } catch (err: unknown) {\n Logger.error(`Failed to add instrumentation: ${String(err)}`);\n }\n }\n\n useSpan<T>(\n span: Span,\n endOnExit: boolean,\n recordException: boolean,\n setStatusOnException: boolean,\n fn: () => T,\n ): T {\n const prevCtx = this.getCurrentContext();\n const ctx = trace.setSpan(prevCtx, span);\n return _contextStorage.run(ctx, () =>\n runWithOtelBridgeGate(ctx, () => {\n try {\n const result = fn();\n if (result instanceof Promise) {\n return result\n .catch((exc: unknown) => {\n if (span.isRecording()) {\n if (recordException) span.recordException(exc as Error);\n if (setStatusOnException) {\n const err = exc as Error;\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: `${err.name}: ${err.message}`,\n });\n }\n }\n throw exc;\n })\n .finally(() => {\n if (endOnExit) span.end();\n }) as T;\n }\n if (endOnExit) span.end();\n return result;\n } catch (exc) {\n if (span.isRecording()) {\n if (recordException) span.recordException(exc as Error);\n if (setStatusOnException) {\n const err = exc as Error;\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: `${err.name}: ${err.message}`,\n });\n }\n }\n if (endOnExit) span.end();\n throw exc;\n }\n }),\n );\n }\n\n attachContext(ctx: Context): void {\n _contextStorage.enterWith(ctx);\n }\n\n /**\n * Run `fn` with `ctx` installed as the active context for the\n * duration of the callback. Sync or async.\n */\n withContext<T>(ctx: Context, fn: () => T): T {\n return _contextStorage.run(ctx, () => runWithOtelBridgeGate(ctx, fn));\n }\n\n /**\n * Flush all registered tracers.\n */\n async forceFlush(): Promise<void> {\n const results = await Promise.allSettled(\n Array.from(this._tracers).map((t) => t._tracerProvider.forceFlush()),\n );\n for (const r of results) {\n if (r.status === \"rejected\") {\n Logger.error(`forceFlush failed: ${String(r.reason)}`);\n }\n }\n }\n\n /**\n * Shut down all registered tracers and clear state.\n */\n async shutdown(): Promise<void> {\n const results = await Promise.allSettled(\n Array.from(this._tracers).map((t) => t._tracerProvider.shutdown()),\n );\n for (const r of results) {\n if (r.status === \"rejected\") {\n Logger.error(`shutdown failed: ${String(r.reason)}`);\n }\n }\n this._activeTracer = null;\n this._tracers.clear();\n }\n}\n",
40
+ "import type { ExportResult } from \"@opentelemetry/core\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\nimport type { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\nimport { Logger } from \"../../utils/logger\";\n\n/**\n * Span exporter that sends traces to the Judgment platform via OTLP HTTP.\n *\n * Wraps the OpenTelemetry OTLP trace exporter with Judgment-specific\n * authentication headers.\n */\nexport class JudgmentSpanExporter implements SpanExporter {\n protected _delegate: OTLPTraceExporter | null;\n\n /**\n * Create a new JudgmentSpanExporter.\n *\n * @param endpoint - The OTLP HTTP endpoint URL.\n * @param apiKey - Judgment API key for authentication.\n * @param organizationId - Judgment organization ID.\n * @param projectId - Judgment project ID.\n */\n constructor(\n endpoint: string,\n apiKey: string,\n organizationId: string,\n projectId: string,\n ) {\n if (!endpoint) {\n this._delegate = null;\n return;\n }\n this._delegate = new OTLPTraceExporter({\n url: endpoint,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"X-Organization-Id\": organizationId,\n \"X-Project-Id\": projectId,\n },\n });\n }\n\n /**\n * Export a batch of spans.\n *\n * @param spans - The spans to export.\n * @param resultCallback - Callback invoked with the export result.\n */\n export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n Logger.info(`Exported ${spans.length} spans`);\n this._delegate?.export(spans, resultCallback);\n }\n\n /**\n * Shut down the exporter.\n */\n shutdown(): Promise<void> {\n return this._delegate?.shutdown() ?? Promise.resolve();\n }\n\n /**\n * Flush any pending exports.\n */\n forceFlush(): Promise<void> {\n return this._delegate?.forceFlush() ?? Promise.resolve();\n }\n}\n",
41
+ "import { ExportResultCode, type ExportResult } from \"@opentelemetry/core\";\nimport type { ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\nimport { JudgmentSpanExporter } from \"./JudgmentSpanExporter\";\n\n/**\n * A no-op span exporter that discards all spans.\n *\n * Used when monitoring is disabled or credentials are missing.\n */\nexport class NoOpSpanExporter extends JudgmentSpanExporter {\n constructor() {\n super(\"\", \"\", \"\", \"\");\n }\n\n override export(\n _spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n resultCallback({ code: ExportResultCode.SUCCESS });\n }\n\n override shutdown(): Promise<void> {\n return Promise.resolve();\n }\n\n override forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n}\n",
42
+ "import type { Context } from \"@opentelemetry/api\";\nimport type {\n ReadableSpan,\n Span,\n SpanProcessor,\n} from \"@opentelemetry/sdk-trace-base\";\nimport { getBaggage } from \"../baggage\";\n\n/**\n * Predicate that decides which baggage keys are propagated to span\n * attributes.\n */\nexport type BaggageKeyPredicate = (baggageKey: string) => boolean;\n\n/** Default predicate that allows every baggage key. */\nexport const ALLOW_ALL_BAGGAGE_KEYS: BaggageKeyPredicate = () => true;\n\n/**\n * Span processor that copies baggage entries onto span attributes at\n * span start. Use `keyPredicate` to control which keys are propagated.\n *\n * @example\n * ```typescript\n * const processor = new JudgmentBaggageSpanProcessor(\n * (key) => key.startsWith(\"judgment.\"),\n * );\n * ```\n */\nexport class JudgmentBaggageSpanProcessor implements SpanProcessor {\n private _keyPredicate: BaggageKeyPredicate;\n\n constructor(keyPredicate: BaggageKeyPredicate = ALLOW_ALL_BAGGAGE_KEYS) {\n this._keyPredicate = keyPredicate;\n }\n\n /** Copy matching baggage entries from the parent context onto the span. */\n onStart(span: Span, parentContext: Context): void {\n const entries = getBaggage(parentContext)?.getAllEntries() ?? [];\n for (const [key, entry] of entries) {\n if (this._keyPredicate(key)) {\n span.setAttribute(key, entry.value);\n }\n }\n }\n\n /** No-op. */\n onEnd(_span: ReadableSpan): void {\n /* no-op */\n }\n\n /** No-op. */\n forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n\n /** No-op. */\n shutdown(): Promise<void> {\n return Promise.resolve();\n }\n}\n",
43
+ "import type {\n Attributes,\n Context,\n HrTime,\n SpanContext,\n} from \"@opentelemetry/api\";\nimport {\n BatchSpanProcessor,\n type ReadableSpan,\n type Span,\n type SpanExporter,\n} from \"@opentelemetry/sdk-trace-base\";\nimport {\n AttributeKeys,\n InternalAttributeKeys,\n} from \"../../JudgmentAttributeKeys\";\nimport { dontThrow } from \"../../utils/dont-throw\";\nimport type { BaseTracer } from \"../BaseTracer\";\nimport { getTraceRuntime } from \"../runtime\";\nimport { JudgmentBaggageSpanProcessor } from \"./JudgmentBaggageSpanProcessor\";\n\ntype SpanKey = `${string}:${string}`;\n\nfunction makeSpanKey(ctx: SpanContext): SpanKey {\n return `${ctx.traceId}:${ctx.spanId}`;\n}\n\nfunction isZeroHrTime(hrTime: HrTime): boolean {\n return hrTime[0] === 0 && hrTime[1] === 0;\n}\n\n/**\n * Span processor that manages span lifecycle, state, and batched export\n * to the Judgment platform. Supports per-span state (counters, lists),\n * partial-span emission for streaming updates, and baggage propagation\n * onto child spans.\n *\n * Created automatically by `Tracer.init()`. Use it directly only when\n * building a custom tracing pipeline.\n */\nexport class JudgmentSpanProcessor extends BatchSpanProcessor {\n tracer: BaseTracer | null;\n private _state = new Map<SpanKey, Map<string, unknown>>();\n private _spanFinalizers: FinalizationRegistry<SpanKey>;\n private _baggageProcessor: JudgmentBaggageSpanProcessor;\n\n constructor(\n tracer: BaseTracer | null,\n exporter: SpanExporter,\n config?: {\n maxQueueSize?: number;\n scheduledDelayMillis?: number;\n maxExportBatchSize?: number;\n exportTimeoutMillis?: number;\n },\n ) {\n super(exporter, config);\n this.tracer = tracer;\n this._spanFinalizers = new FinalizationRegistry<SpanKey>((spanKey) => {\n this._cleanupSpanState(spanKey);\n });\n this._baggageProcessor = new JudgmentBaggageSpanProcessor();\n }\n\n private _cleanupSpanState(spanKey: SpanKey): void {\n this._state.delete(spanKey);\n }\n\n private _registerSpan(span: Span): void {\n const ctx = span.spanContext();\n if (!ctx.traceId || !ctx.spanId) return;\n const spanKey = makeSpanKey(ctx);\n // Registers the live Span object with the GC; if it is ever\n // collected without going through `onEnd`, cleanup still runs.\n this._spanFinalizers.register(span, spanKey);\n }\n\n /** Store a value in the mutable state for a span. */\n stateSet(spanContext: SpanContext, key: string, value: unknown): void {\n const spanKey = makeSpanKey(spanContext);\n let attrs = this._state.get(spanKey);\n if (!attrs) {\n attrs = new Map();\n this._state.set(spanKey, attrs);\n }\n attrs.set(key, value);\n }\n\n /** Retrieve a value from the mutable state for a span. */\n stateGet<T>(spanContext: SpanContext, key: string, defaultValue: T): T {\n const spanKey = makeSpanKey(spanContext);\n const attrs = this._state.get(spanKey);\n if (!attrs?.has(key)) return defaultValue;\n return attrs.get(key) as T;\n }\n\n /** Atomically increment a counter. Returns the value before increment. */\n stateIncr(spanContext: SpanContext, key: string): number {\n const spanKey = makeSpanKey(spanContext);\n let attrs = this._state.get(spanKey);\n if (!attrs) {\n attrs = new Map();\n this._state.set(spanKey, attrs);\n }\n const stored = attrs.get(key);\n const prev = typeof stored === \"number\" ? stored : 0;\n attrs.set(key, prev + 1);\n return prev;\n }\n\n /** Atomically append to a list. Returns the new list. */\n stateAppend<T>(spanContext: SpanContext, key: string, item: T): T[] {\n const spanKey = makeSpanKey(spanContext);\n let attrs = this._state.get(spanKey);\n if (!attrs) {\n attrs = new Map();\n this._state.set(spanKey, attrs);\n }\n const stored = attrs.get(key);\n const list: T[] = Array.isArray(stored)\n ? [...(stored as T[]), item]\n : [item];\n attrs.set(key, list);\n return list;\n }\n\n private _emitSpan(span: ReadableSpan, isPartial = false): void {\n const ctx = span.spanContext();\n if (!ctx.traceId) return;\n const currId = this.stateIncr(ctx, AttributeKeys.JUDGMENT_UPDATE_ID);\n const attributes: Attributes = {\n ...span.attributes,\n [AttributeKeys.JUDGMENT_UPDATE_ID]: currId,\n };\n\n if (isPartial) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete attributes[AttributeKeys.JUDGMENT_PENDING_TRACE_EVAL];\n }\n\n const emittedSpan = Object.create(span) as ReadableSpan;\n Object.defineProperty(emittedSpan, \"attributes\", {\n value: attributes,\n writable: false,\n });\n const endTime = isZeroHrTime(span.endTime) ? span.startTime : span.endTime;\n Object.defineProperty(emittedSpan, \"endTime\", {\n value: endTime,\n writable: false,\n });\n\n super.onEnd(emittedSpan);\n }\n\n /** Export the current span's in-progress state for streaming updates. */\n emitPartial(): void {\n dontThrow(\"JudgmentSpanProcessor.emitPartial\", () => {\n const span = getTraceRuntime().getCurrentSpan();\n if (!span?.isRecording()) return;\n const ctx = span.spanContext();\n if (!ctx.traceId) return;\n if (\n this.stateGet<boolean>(\n ctx,\n InternalAttributeKeys.DISABLE_PARTIAL_EMIT,\n false,\n )\n ) {\n return;\n }\n this._emitSpan(span as unknown as ReadableSpan, true);\n });\n }\n\n onStart(span: Span, parentContext: Context): void {\n dontThrow(\"JudgmentSpanProcessor.onStart\", () => {\n this._baggageProcessor.onStart(span, parentContext);\n this._registerSpan(span);\n });\n }\n\n onEnd(span: ReadableSpan): void {\n dontThrow(\"JudgmentSpanProcessor.onEnd\", () => {\n const ctx = span.spanContext();\n if (!ctx.traceId) {\n super.onEnd(span);\n return;\n }\n const spanKey = makeSpanKey(ctx);\n try {\n const isCancelled = this.stateGet<boolean>(\n ctx,\n InternalAttributeKeys.CANCELLED,\n false,\n );\n if (!isCancelled) {\n this._emitSpan(span);\n }\n } finally {\n this._cleanupSpanState(spanKey);\n }\n });\n }\n}\n",
44
+ "import type { Context, SpanContext } from \"@opentelemetry/api\";\nimport type { ReadableSpan, Span } from \"@opentelemetry/sdk-trace-base\";\nimport { NoOpSpanExporter } from \"../exporters/NoOpSpanExporter\";\nimport { JudgmentSpanProcessor } from \"./JudgmentSpanProcessor\";\n\n/**\n * A no-op span processor that discards all spans.\n *\n * Used when monitoring is disabled or credentials are missing.\n */\nexport class NoOpSpanProcessor extends JudgmentSpanProcessor {\n constructor() {\n super(null, new NoOpSpanExporter());\n }\n\n onStart(_span: Span, _parentContext: Context): void {\n /* empty */\n }\n\n onEnd(_span: ReadableSpan): void {\n /* empty */\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve();\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n\n emitPartial(): void {\n /* empty */\n }\n\n stateSet(_spanContext: SpanContext, _key: string, _value: unknown): void {\n /* empty */\n }\n\n stateGet<T>(_spanContext: SpanContext, _key: string, defaultValue: T): T {\n return defaultValue;\n }\n\n stateIncr(_spanContext: SpanContext, _key: string): number {\n return 0;\n }\n\n stateAppend<T>(_spanContext: SpanContext, _key: string, item: T): T[] {\n return [item];\n }\n}\n",
45
+ "import {\n defaultResource,\n resourceFromAttributes,\n} from \"@opentelemetry/resources\";\nimport { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\";\nimport { JUDGMENT_API_KEY, JUDGMENT_API_URL, JUDGMENT_ORG_ID } from \"../env\";\nimport { JudgmentApiClient } from \"../internal/api\";\nimport { Logger } from \"../utils/logger\";\nimport { resolveProjectId } from \"../utils/resolve-project-id\";\nimport { safeStringify } from \"../utils/serializer\";\nimport { VERSION } from \"../version\";\nimport type { TracerConfig } from \"./BaseTracer\";\nimport { BaseTracer } from \"./BaseTracer\";\nimport { JudgmentTracerProvider } from \"./JudgmentTracerProvider\";\nimport { JudgmentSpanExporter } from \"./exporters/JudgmentSpanExporter\";\nimport { NoOpSpanExporter } from \"./exporters/NoOpSpanExporter\";\nimport { JudgmentSpanProcessor } from \"./processors/JudgmentSpanProcessor\";\nimport { NoOpSpanProcessor } from \"./processors/NoOpSpanProcessor\";\n\n/**\n * Concrete tracer implementation for Node.js applications.\n *\n * Use `Tracer.init()` to create and activate a new tracer. This sets up\n * OpenTelemetry span processing and export to the Judgment platform.\n *\n * @example\n * ```typescript\n * import { Tracer } from \"judgeval\";\n *\n * const tracer = await Tracer.init({ projectName: \"my-project\" });\n *\n * const traced = Tracer.observe(async (input: string) => {\n * return await processInput(input);\n * });\n *\n * await traced(\"hello\");\n * await Tracer.forceFlush();\n * await Tracer.shutdown();\n * ```\n */\nexport class Tracer extends BaseTracer {\n private _spanExporter: JudgmentSpanExporter | null = null;\n private _spanProcessor: JudgmentSpanProcessor | null = null;\n\n protected constructor(\n projectName: string | null,\n projectId: string | null,\n apiKey: string | null,\n organizationId: string | null,\n apiUrl: string | null,\n environment: string | null,\n serializer: (v: unknown) => string,\n tracerProvider: NodeTracerProvider,\n client: JudgmentApiClient | null,\n enableMonitoring: boolean,\n ) {\n super(\n projectName,\n projectId,\n apiKey,\n organizationId,\n apiUrl,\n environment,\n serializer,\n tracerProvider,\n client,\n enableMonitoring,\n );\n }\n\n /**\n * Create and activate a new Tracer.\n *\n * This is the recommended way to initialize tracing. Credentials are\n * read from environment variables if not provided explicitly.\n *\n * @param config - Tracer configuration options.\n * @returns A configured and activated `Tracer` instance.\n *\n * @example\n * ```typescript\n * const tracer = await Tracer.init({\n * projectName: \"my-project\",\n * environment: \"production\",\n * });\n * ```\n */\n static async init(config: TracerConfig = {}): Promise<Tracer> {\n const apiKey = config.apiKey ?? JUDGMENT_API_KEY;\n const organizationId = config.organizationId ?? JUDGMENT_ORG_ID;\n const apiUrl = config.apiUrl ?? JUDGMENT_API_URL;\n const projectName = config.projectName ?? null;\n const serializer = config.serializer ?? safeStringify;\n\n let enableMonitoring = true;\n\n if (!projectName) {\n Logger.warning(\n \"project_name not provided. Tracer will not export spans.\",\n );\n enableMonitoring = false;\n }\n if (!apiKey) {\n Logger.warning(\"api_key not provided. Tracer will not export spans.\");\n enableMonitoring = false;\n }\n if (!organizationId) {\n Logger.warning(\n \"organization_id not provided. Tracer will not export spans.\",\n );\n enableMonitoring = false;\n }\n if (!apiUrl) {\n Logger.warning(\"api_url not provided. Tracer will not export spans.\");\n enableMonitoring = false;\n }\n\n let client: JudgmentApiClient | null = null;\n let projectId: string | null = null;\n\n if (enableMonitoring && projectName && apiKey && organizationId && apiUrl) {\n client = new JudgmentApiClient(apiUrl, apiKey, organizationId);\n projectId = await resolveProjectId(client, projectName).catch(() => null);\n if (!projectId) {\n Logger.warning(\n `Project '${projectName}' not found. Tracer will not export spans.`,\n );\n enableMonitoring = false;\n }\n }\n\n const resourceAttrs: Record<string, string> = {\n \"service.name\": projectName ?? \"unknown\",\n \"telemetry.sdk.name\": \"judgeval\",\n \"telemetry.sdk.version\": VERSION,\n };\n if (config.environment) {\n resourceAttrs[\"deployment.environment\"] = config.environment;\n }\n if (config.resourceAttributes) {\n Object.assign(resourceAttrs, config.resourceAttributes);\n }\n\n const resource = defaultResource().merge(\n resourceFromAttributes(resourceAttrs),\n );\n\n const tracerProvider = new NodeTracerProvider({\n resource,\n sampler: config.sampler,\n spanLimits: config.spanLimits,\n });\n\n const tracer = new Tracer(\n projectName,\n projectId,\n apiKey,\n organizationId,\n apiUrl,\n config.environment ?? null,\n serializer,\n tracerProvider,\n client,\n enableMonitoring,\n );\n\n if (enableMonitoring) {\n const providerWithProcessor = new NodeTracerProvider({\n resource,\n sampler: config.sampler,\n spanLimits: config.spanLimits,\n spanProcessors: [\n tracer.getSpanProcessor(),\n ...(config.spanProcessors ?? []),\n ],\n });\n tracer._tracerProvider = providerWithProcessor;\n }\n\n const proxy = JudgmentTracerProvider.getInstance();\n proxy.register(tracer);\n\n if (config.setActive ?? true) {\n tracer.setActive();\n }\n\n return tracer;\n }\n\n /**\n * Get or create the span exporter for this tracer.\n *\n * @returns The span exporter instance.\n */\n getSpanExporter(): JudgmentSpanExporter {\n if (this._spanExporter) return this._spanExporter;\n\n if (\n !this._enableMonitoring ||\n !this.projectId ||\n !this.apiKey ||\n !this.organizationId ||\n !this.apiUrl\n ) {\n this._spanExporter = new NoOpSpanExporter();\n } else {\n const endpoint = this.apiUrl.endsWith(\"/\")\n ? this.apiUrl + \"otel/v1/traces\"\n : this.apiUrl + \"/otel/v1/traces\";\n this._spanExporter = new JudgmentSpanExporter(\n endpoint,\n this.apiKey,\n this.organizationId,\n this.projectId,\n );\n }\n return this._spanExporter;\n }\n\n /**\n * Get or create the span processor for this tracer.\n *\n * @returns The span processor instance.\n */\n getSpanProcessor(): JudgmentSpanProcessor {\n if (this._spanProcessor) return this._spanProcessor;\n\n if (!this._enableMonitoring) {\n this._spanProcessor = new NoOpSpanProcessor();\n } else {\n this._spanProcessor = new JudgmentSpanProcessor(\n this,\n this.getSpanExporter(),\n );\n }\n return this._spanProcessor;\n }\n}\n",
46
+ "import type { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\nimport { Example } from \"../../data/Example\";\nimport type { BaseTracer } from \"../BaseTracer\";\nimport { JudgmentSpanProcessor } from \"./JudgmentSpanProcessor\";\n\n/**\n * Span processor used by `OfflineTracer`.\n *\n * Extends `JudgmentSpanProcessor` (so it inherits batched export, span\n * state, and partial-emit support) and additionally appends a new\n * `Example` to the caller-supplied `dataset` list whenever a *root*\n * span ends. Each emitted example carries the `offline_trace_id` of\n * the trace plus any static `exampleFields` configured at init time.\n */\nexport class OfflineJudgmentSpanProcessor extends JudgmentSpanProcessor {\n private readonly _dataset: Example[];\n private readonly _exampleFields: Record<string, unknown>;\n private readonly _seenTraceIds = new Set<string>();\n\n constructor(\n tracer: BaseTracer,\n exporter: SpanExporter,\n options: {\n dataset: Example[];\n exampleFields?: Record<string, unknown>;\n },\n ) {\n super(tracer, exporter);\n this._dataset = options.dataset;\n this._exampleFields = { ...(options.exampleFields ?? {}) };\n }\n\n private _maybeCreateExample(span: ReadableSpan): void {\n if (span.parentSpanContext) return;\n const ctx = span.spanContext();\n if (!ctx?.traceId) return;\n\n if (this._seenTraceIds.has(ctx.traceId)) return;\n this._seenTraceIds.add(ctx.traceId);\n\n const example = Example.create({\n ...this._exampleFields,\n offline_trace_id: ctx.traceId,\n });\n this._dataset.push(example);\n }\n\n onEnd(span: ReadableSpan): void {\n try {\n this._maybeCreateExample(span);\n } finally {\n super.onEnd(span);\n }\n }\n}\n",
47
+ "import {\n defaultResource,\n resourceFromAttributes,\n} from \"@opentelemetry/resources\";\nimport type { Sampler, SpanLimits } from \"@opentelemetry/sdk-trace-base\";\nimport { type SpanProcessor } from \"@opentelemetry/sdk-trace-base\";\nimport { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\";\nimport type { Example } from \"../data/Example\";\nimport { JUDGMENT_API_KEY, JUDGMENT_API_URL, JUDGMENT_ORG_ID } from \"../env\";\nimport { JudgmentApiClient } from \"../internal/api\";\nimport { resolveProjectId } from \"../utils/resolve-project-id\";\nimport { safeStringify } from \"../utils/serializer\";\nimport { VERSION } from \"../version\";\nimport { JudgmentTracerProvider } from \"./JudgmentTracerProvider\";\nimport { Tracer } from \"./Tracer\";\nimport { JudgmentSpanExporter } from \"./exporters/JudgmentSpanExporter\";\nimport { OfflineJudgmentSpanProcessor } from \"./processors/OfflineJudgmentSpanProcessor\";\n\nconst OFFLINE_TRACES_PATH = \"otel/v1/offline-traces\";\n\n/**\n * Configuration for `OfflineTracer.create()`.\n */\nexport interface OfflineTracerConfig {\n /** List that receives an `Example` for each completed root span. */\n dataset: Example[];\n /**\n * Fields included on every `Example` in `dataset`\n * (e.g. `{ input: ..., goldenOutput: ... }`).\n */\n exampleFields?: Record<string, unknown>;\n /** Your Judgment project name. Required. */\n projectName?: string;\n /** Judgment API key. Defaults to `JUDGMENT_API_KEY` env var. */\n apiKey?: string;\n /** Judgment organization ID. Defaults to `JUDGMENT_ORG_ID` env var. */\n organizationId?: string;\n /** Judgment API URL. Defaults to `JUDGMENT_API_URL` env var. */\n apiUrl?: string;\n /** Deployment environment name (e.g. \"production\"). */\n environment?: string;\n /** Whether to set this tracer as active. Defaults to `true`. */\n setActive?: boolean;\n /** Custom serialization function for span attribute values. */\n serializer?: (value: unknown) => string;\n /** Additional OpenTelemetry resource attributes. */\n resourceAttributes?: Record<string, string>;\n /** Custom OpenTelemetry sampler. */\n sampler?: Sampler;\n /** Custom OpenTelemetry span limits. */\n spanLimits?: SpanLimits;\n /** Additional OpenTelemetry span processors. */\n spanProcessors?: SpanProcessor[];\n}\n\n/**\n * Tracer for offline / experiment-style runs.\n *\n * Behaves like `Tracer` for span creation and `@Tracer.observe`, with\n * two differences:\n *\n * * Spans are pushed to the project's *offline* OTLP endpoint and stored\n * in the `offline_otel_traces` ClickHouse table. They do **not** appear\n * on the live monitoring page.\n * * Each completed root span produces a new `Example` that is appended\n * to the caller-supplied `dataset` list. The example carries the\n * `offline_trace_id` of the offline trace plus any static\n * `exampleFields` configured at init time.\n *\n * Unlike `Tracer`, `OfflineTracer` requires all credentials upfront and\n * throws if any are missing — there is no no-op fallback. Prefer\n * `judgeval.offlineTracer({ ... })` over calling `OfflineTracer.create`\n * directly so credentials are reused from the active `Judgeval` client.\n *\n * @example\n * ```typescript\n * import { Judgeval, type Example } from \"judgeval\";\n *\n * const judgeval = await Judgeval.create({ projectName: \"my-project\" });\n * const dataset: Example[] = [];\n * const tracer = await judgeval.offlineTracer({\n * dataset,\n * exampleFields: { input: \"What is 2+2?\", expected_output: \"4\" },\n * });\n * ```\n */\nexport class OfflineTracer extends Tracer {\n readonly supportsLiveInstrumentation: boolean = false;\n\n private readonly _offlineApiUrl: string;\n private readonly _offlineApiKey: string;\n private readonly _offlineOrganizationId: string;\n private readonly _offlineProjectId: string;\n\n private readonly _dataset: Example[];\n private readonly _exampleFields: Record<string, unknown>;\n\n private _offlineSpanExporter: JudgmentSpanExporter | null = null;\n private _offlineSpanProcessor: OfflineJudgmentSpanProcessor | null = null;\n\n private constructor(args: {\n projectName: string;\n projectId: string;\n apiKey: string;\n organizationId: string;\n apiUrl: string;\n environment: string | null;\n serializer: (value: unknown) => string;\n tracerProvider: NodeTracerProvider;\n client: JudgmentApiClient;\n dataset: Example[];\n exampleFields: Record<string, unknown>;\n }) {\n super(\n args.projectName,\n args.projectId,\n args.apiKey,\n args.organizationId,\n args.apiUrl,\n args.environment,\n args.serializer,\n args.tracerProvider,\n args.client,\n true,\n );\n this._offlineApiUrl = args.apiUrl;\n this._offlineApiKey = args.apiKey;\n this._offlineOrganizationId = args.organizationId;\n this._offlineProjectId = args.projectId;\n this._dataset = args.dataset;\n this._exampleFields = args.exampleFields;\n }\n\n /**\n * Create and activate a new `OfflineTracer`.\n *\n * @throws Error if `projectName`, `apiKey`, `organizationId`, or\n * `apiUrl` cannot be resolved (explicit arg or env var), or if the\n * project cannot be found on the backend.\n */\n static async create(config: OfflineTracerConfig): Promise<OfflineTracer> {\n const apiKey = config.apiKey ?? JUDGMENT_API_KEY;\n const organizationId = config.organizationId ?? JUDGMENT_ORG_ID;\n const apiUrl = config.apiUrl ?? JUDGMENT_API_URL;\n const projectName = config.projectName;\n const serializer = config.serializer ?? safeStringify;\n\n if (!projectName) {\n throw new Error(\"projectName is required for OfflineTracer\");\n }\n if (!apiKey) {\n throw new Error(\"apiKey is required for OfflineTracer\");\n }\n if (!organizationId) {\n throw new Error(\"organizationId is required for OfflineTracer\");\n }\n if (!apiUrl) {\n throw new Error(\"apiUrl is required for OfflineTracer\");\n }\n\n const client = new JudgmentApiClient(apiUrl, apiKey, organizationId);\n let projectId: string;\n try {\n projectId = await resolveProjectId(client, projectName);\n } catch (err) {\n throw new Error(\n `Project '${projectName}' not found; cannot start OfflineTracer: ${String(err)}`,\n );\n }\n\n const resourceAttrs: Record<string, string> = {\n \"service.name\": projectName,\n \"telemetry.sdk.name\": \"judgeval\",\n \"telemetry.sdk.version\": VERSION,\n \"judgment.offline\": \"true\",\n };\n if (config.environment) {\n resourceAttrs[\"deployment.environment\"] = config.environment;\n }\n if (config.resourceAttributes) {\n Object.assign(resourceAttrs, config.resourceAttributes);\n }\n\n const resource = defaultResource().merge(\n resourceFromAttributes(resourceAttrs),\n );\n\n const tracer = new OfflineTracer({\n projectName,\n projectId,\n apiKey,\n organizationId,\n apiUrl,\n environment: config.environment ?? null,\n serializer,\n tracerProvider: new NodeTracerProvider({ resource }),\n client,\n dataset: config.dataset,\n exampleFields: { ...(config.exampleFields ?? {}) },\n });\n\n const providerWithProcessor = new NodeTracerProvider({\n resource,\n sampler: config.sampler,\n spanLimits: config.spanLimits,\n spanProcessors: [\n tracer.getSpanProcessor(),\n ...(config.spanProcessors ?? []),\n ],\n });\n tracer._tracerProvider = providerWithProcessor;\n\n const proxy = JudgmentTracerProvider.getInstance();\n proxy.register(tracer);\n\n if (config.setActive ?? true) {\n tracer.setActive();\n }\n\n return tracer;\n }\n\n /**\n * Return the offline span exporter for this tracer.\n *\n * Targets the project's offline OTLP endpoint. Credentials are\n * guaranteed present (validated in `create`).\n */\n getSpanExporter(): JudgmentSpanExporter {\n if (this._offlineSpanExporter) return this._offlineSpanExporter;\n const base = this._offlineApiUrl.endsWith(\"/\")\n ? this._offlineApiUrl + OFFLINE_TRACES_PATH\n : this._offlineApiUrl + \"/\" + OFFLINE_TRACES_PATH;\n this._offlineSpanExporter = new JudgmentSpanExporter(\n base,\n this._offlineApiKey,\n this._offlineOrganizationId,\n this._offlineProjectId,\n );\n return this._offlineSpanExporter;\n }\n\n /** Return the offline span processor for this tracer. */\n getSpanProcessor(): OfflineJudgmentSpanProcessor {\n if (this._offlineSpanProcessor) return this._offlineSpanProcessor;\n this._offlineSpanProcessor = new OfflineJudgmentSpanProcessor(\n this,\n this.getSpanExporter(),\n {\n dataset: this._dataset,\n exampleFields: this._exampleFields,\n },\n );\n return this._offlineSpanProcessor;\n }\n}\n",
48
+ "import { JUDGMENT_API_KEY, JUDGMENT_API_URL, JUDGMENT_ORG_ID } from \"./env\";\nimport { JudgmentApiClient } from \"./internal/api\";\nimport { resolveProjectId } from \"./utils/resolve-project-id\";\nimport { Logger } from \"./utils/logger\";\nimport { EvaluationFactory } from \"./evaluation/EvaluationFactory\";\nimport { DatasetFactory } from \"./datasets/DatasetFactory\";\nimport { AgentJudgeFactory } from \"./agent-judges/AgentJudgeFactory\";\nimport { OfflineTestsFactory } from \"./offline-tests/OfflineTestsFactory\";\nimport type { OfflineTracer, OfflineTracerConfig } from \"./trace/OfflineTracer\";\n\n/**\n * Options for {@link Judgeval.offlineTracer}.\n * Credentials and `projectName` are taken from the parent `Judgeval` instance.\n */\nexport type JudgevalOfflineTracerOptions = Omit<\n OfflineTracerConfig,\n \"projectName\" | \"apiKey\" | \"organizationId\" | \"apiUrl\"\n>;\n\n/**\n * Configuration options for the Judgeval client.\n *\n * Credentials are resolved in order: explicit arguments first, then\n * environment variables `JUDGMENT_API_KEY`, `JUDGMENT_ORG_ID`, and\n * `JUDGMENT_API_URL`.\n */\nexport interface JudgevalConfig {\n /** The project name on the Judgment platform. */\n projectName: string;\n /** Judgment API key. Defaults to `JUDGMENT_API_KEY` env var. */\n apiKey?: string;\n /** Judgment organization ID. Defaults to `JUDGMENT_ORG_ID` env var. */\n organizationId?: string;\n /** Judgment API URL. Defaults to `JUDGMENT_API_URL` env var. */\n apiUrl?: string;\n}\n\n/**\n * The main entry point for interacting with the Judgment platform.\n *\n * `Judgeval` connects to your Judgment project and gives you access to\n * evaluation, datasets, and monitoring through the Judgment platform.\n *\n * @example\n * ```typescript\n * import { Judgeval } from \"judgeval\";\n *\n * const client = await Judgeval.create({ projectName: \"my-project\" });\n * ```\n *\n * @throws Error if any required credential is missing.\n */\nexport class Judgeval {\n private readonly _client: JudgmentApiClient;\n private readonly _projectName: string;\n private readonly _projectId: string | null;\n\n private constructor(\n client: JudgmentApiClient,\n projectName: string,\n projectId: string | null,\n ) {\n this._client = client;\n this._projectName = projectName;\n this._projectId = projectId;\n }\n\n /**\n * Create a new Judgeval client instance.\n *\n * Resolves the `projectName` to a `projectId` via the Judgment API.\n *\n * @param config - Configuration options. Credentials default to environment variables.\n * @returns A new `Judgeval` instance.\n *\n * @example\n * ```typescript\n * const client = await Judgeval.create({\n * projectName: \"my-project\",\n * apiKey: \"<your-api-key>\",\n * organizationId: \"<your-organization-id>\",\n * });\n * ```\n */\n static async create(config: JudgevalConfig): Promise<Judgeval> {\n const apiKey = config.apiKey ?? JUDGMENT_API_KEY;\n const organizationId = config.organizationId ?? JUDGMENT_ORG_ID;\n const apiUrl = config.apiUrl ?? JUDGMENT_API_URL;\n\n if (!apiKey) {\n throw new Error(\"API key is required\");\n }\n if (!organizationId) {\n throw new Error(\"Organization ID is required\");\n }\n if (!apiUrl) {\n throw new Error(\"API URL is required\");\n }\n if (!config.projectName) {\n throw new Error(\"Project name is required\");\n }\n\n const client = new JudgmentApiClient(apiUrl, apiKey, organizationId);\n let projectId: string | null = null;\n try {\n projectId = await resolveProjectId(client, config.projectName);\n } catch {\n Logger.warning(\n `Project '${config.projectName}' not found. ` +\n \"Some operations requiring project_id will be skipped.\",\n );\n }\n\n return new Judgeval(client, config.projectName, projectId);\n }\n\n /**\n * Create and activate an `OfflineTracer` for this project.\n *\n * Reuses the credentials supplied to this `Judgeval` instance. Each\n * completed root span appends an `Example` to `dataset`, carrying\n * the offline trace id and the static `exampleFields`.\n *\n * @example\n * ```typescript\n * const judgeval = await Judgeval.create({ projectName: \"my-project\" });\n * const dataset: Example[] = [];\n * const tracer = await judgeval.offlineTracer({\n * dataset,\n * exampleFields: { input: item.input, golden_output: item.goldenOutput },\n * });\n * ```\n */\n async offlineTracer(\n options: JudgevalOfflineTracerOptions,\n ): Promise<OfflineTracer> {\n const { OfflineTracer } = await import(\"./trace/OfflineTracer\");\n return OfflineTracer.create({\n ...options,\n projectName: this._projectName,\n apiKey: this._client.getApiKey(),\n organizationId: this._client.getOrganizationId(),\n apiUrl: this._client.getBaseUrl(),\n });\n }\n\n /** Access dataset management (create, get, list). */\n get datasets(): DatasetFactory {\n return new DatasetFactory(this._client, this._projectId, this._projectName);\n }\n\n /** Access evaluation (create evaluation runs). */\n get evaluation(): EvaluationFactory {\n return new EvaluationFactory(\n this._client,\n this._projectId,\n this._projectName,\n );\n }\n\n /** Manage Agent Judges (prompt-based scorers) on the platform. */\n get agentJudges(): AgentJudgeFactory {\n return new AgentJudgeFactory(\n this._client,\n this._projectId,\n this._projectName,\n );\n }\n\n /** Create test configs and run offline tests (dataset + judges). */\n get offlineTests(): OfflineTestsFactory {\n return new OfflineTestsFactory(\n this._client,\n this._projectId,\n this._projectName,\n );\n }\n}\n",
49
+ "import type { Example } from \"../data/Example\";\nimport type { BaseResponse } from \"./responses\";\n\n/**\n * Base class for building custom evaluation scorers.\n *\n * Subclass `Judge` and implement the `score` method to create your own\n * evaluation logic.\n *\n * @example\n * ```typescript\n * class ContainsAnswer extends Judge<BinaryResponse> {\n * async score(data: Example): Promise<BinaryResponse> {\n * const expected = (data.get(\"expected_output\") as string).toLowerCase();\n * const actual = (data.get(\"actual_output\") as string).toLowerCase();\n * return {\n * value: actual.includes(expected),\n * reason: actual.includes(expected) ? \"Found\" : \"Not found\",\n * };\n * }\n * }\n * ```\n */\nexport abstract class Judge<R extends BaseResponse = BaseResponse> {\n /** Evaluate a single example and return a score. */\n abstract score(data: Example): Promise<R>;\n}\n",
50
+ "import type { JudgmentApiClient } from \"../internal/api/client\";\nimport type { Example } from \"../data/Example\";\nimport type { ScoringResult } from \"../data/ScoringResult\";\nimport { Judge } from \"../judges/Judge\";\nimport { Logger } from \"../utils/logger\";\nimport { LocalEvaluatorRunner } from \"./LocalEvaluatorRunner\";\nimport { HostedEvaluatorRunner } from \"./HostedEvaluatorRunner\";\n\nexport interface EvaluationRunOptions {\n /** The examples to evaluate. */\n examples: Example[];\n /**\n * Hosted scorer names (strings like `\"faithfulness\"`) **or**\n * custom `Judge` instances. Cannot mix both.\n */\n scorers: string[] | Judge[];\n /** A name for this run, visible in the dashboard. */\n evalRunName: string;\n /**\n * If true, throws an error when any scorer fails its threshold.\n * Useful in CI/CD pipelines.\n */\n assertTest?: boolean;\n /**\n * Maximum seconds to wait for hosted scorer results before timing out.\n * @default 300\n */\n timeoutSeconds?: number;\n}\n\n/**\n * Score a batch of examples using hosted scorers or custom judges.\n *\n * Two modes are supported:\n *\n * - **Hosted scorers** — pass scorer names as strings (e.g.\n * `\"faithfulness\"`, `\"answer_relevancy\"`). Evaluation runs server-side\n * on the Judgment platform.\n * - **Custom judges** — pass {@link Judge} subclass instances for\n * in-process evaluation with your own scoring logic.\n *\n * Create an `Evaluation` via `client.evaluation.create()`, then call\n * `.run()` to execute scorers against your examples.\n *\n * @example\n * ```typescript\n * const evaluation = client.evaluation.create();\n * const results = await evaluation.run({\n * examples,\n * scorers: [\"faithfulness\", \"answer_relevancy\"],\n * evalRunName: \"nightly-eval\",\n * });\n * ```\n */\nexport class Evaluation {\n private readonly _local: LocalEvaluatorRunner;\n private readonly _hosted: HostedEvaluatorRunner;\n\n constructor(\n client: JudgmentApiClient,\n projectId: string | null,\n projectName: string,\n ) {\n this._local = new LocalEvaluatorRunner(client, projectId, projectName);\n this._hosted = new HostedEvaluatorRunner(client, projectId, projectName);\n }\n\n /**\n * Run scorers against your examples and return results.\n *\n * Pass **either** hosted scorer names (strings) **or** custom {@link Judge}\n * instances. Mixing both in one call is not supported.\n *\n * @param options - Evaluation configuration including examples, scorers, and run name.\n * @returns A list of {@link ScoringResult} objects, one per example.\n */\n run(options: EvaluationRunOptions): Promise<ScoringResult[]> {\n const {\n examples,\n scorers,\n evalRunName,\n assertTest = false,\n timeoutSeconds = 300,\n } = options;\n\n const hostedScorers = scorers.filter(\n (s): s is string => typeof s === \"string\",\n );\n const localScorers = scorers.filter((s): s is Judge => s instanceof Judge);\n\n if (localScorers.length > 0 && hostedScorers.length > 0) {\n Logger.error(\n \"Running both local and hosted scorers is not supported. \" +\n \"Please run your evaluation with either local or hosted scorers, but not both.\",\n );\n return Promise.resolve([]);\n }\n if (localScorers.length === 0 && hostedScorers.length === 0) {\n Logger.error(\n \"No valid local or hosted scorers provided. \" +\n \"Please provide at least one local or hosted scorer.\",\n );\n return Promise.resolve([]);\n }\n\n if (localScorers.length > 0) {\n return this._local.run(\n examples,\n localScorers,\n evalRunName,\n assertTest,\n timeoutSeconds,\n );\n }\n\n return this._hosted.run(\n examples,\n hostedScorers,\n evalRunName,\n assertTest,\n timeoutSeconds,\n );\n }\n}\n",
51
+ "import pc from \"picocolors\";\nimport type { ExampleEvaluationRun } from \"../internal/api/models/ExampleEvaluationRun\";\nimport type { LocalScorerResult } from \"../internal/api/models/LocalScorerResult\";\nimport type { Example } from \"../data/Example\";\nimport type { Judge } from \"../judges/Judge\";\nimport type { BaseResponse } from \"../judges/responses\";\nimport { EvaluatorRunner } from \"./EvaluatorRunner\";\n\ninterface ScorerJobResult {\n exampleIdx: number;\n scorer: Judge;\n result: BaseResponse | null;\n error: string | null;\n}\n\n/**\n * Evaluation runner for custom (in-process) scorers.\n *\n * Runs all {@link Judge} instances locally against the provided examples,\n * posts results to the Judgment platform, then polls for finalized scores.\n * Used internally by {@link Evaluation}.\n */\nexport class LocalEvaluatorRunner extends EvaluatorRunner<Judge> {\n protected _buildPayload(\n evalId: string,\n projectId: string,\n evalRunName: string,\n createdAt: string,\n examples: Example[],\n _scorers: Judge[],\n ): ExampleEvaluationRun {\n return {\n id: evalId,\n project_id: projectId,\n eval_name: evalRunName,\n created_at: createdAt,\n examples: examples.map((e) => e.toJSON()),\n judgment_scorers: [],\n custom_scorers: [],\n };\n }\n\n protected async _submit(\n projectId: string,\n _evalId: string,\n examples: Example[],\n scorers: Judge[],\n payload: ExampleEvaluationRun,\n ): Promise<number> {\n const startTime = Date.now();\n\n const jobs: Promise<ScorerJobResult>[] = examples.flatMap(\n (example, exampleIdx) =>\n scorers.map((scorer) =>\n scorer\n .score(example)\n .then(\n (result): ScorerJobResult => ({\n exampleIdx,\n scorer,\n result,\n error: null,\n }),\n )\n .catch(\n (err: unknown): ScorerJobResult => ({\n exampleIdx,\n scorer,\n result: null,\n error: String(err),\n }),\n ),\n ),\n );\n\n const jobResults = await Promise.all(jobs);\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n console.log(\n `${pc.green(\"\\u2713\")} Scoring completed in ${pc.bold(`${elapsed}s`)}`,\n );\n\n // Group by example index\n const byExample = new Map<number, ScorerJobResult[]>();\n for (const jr of jobResults) {\n let list = byExample.get(jr.exampleIdx);\n if (!list) {\n list = [];\n byExample.set(jr.exampleIdx, list);\n }\n list.push(jr);\n }\n\n const apiResults: LocalScorerResult[] = examples.map((example, i) => {\n const entries = byExample.get(i) ?? [];\n return {\n scorers_data: entries.map((jr) => {\n if (jr.error !== null) {\n return {\n scorer_name: jr.scorer.constructor.name,\n value: 0,\n reason: \"\",\n error: jr.error,\n };\n }\n const r = jr.result!;\n return {\n scorer_name: jr.scorer.constructor.name,\n value: r.value,\n reason: r.reason,\n ...(r.citations && {\n citations: r.citations.map((c) => ({\n span_id: c.spanId,\n span_attribute: c.spanAttribute,\n })),\n }),\n };\n }),\n data_object: example.toJSON(),\n };\n });\n\n await this._client.postV1projectsEvalResultsExamples(projectId, {\n results: apiResults,\n run: payload,\n });\n\n return examples.length;\n }\n}\n",
52
+ "import pc from \"picocolors\";\nimport type { JudgmentApiClient } from \"../internal/api/client\";\nimport type { ExampleEvaluationRun } from \"../internal/api/models/ExampleEvaluationRun\";\nimport type { ExperimentRunItem } from \"../internal/api/models/ExperimentRunItem\";\nimport type { Example } from \"../data/Example\";\nimport type { ScoringResult } from \"../data/ScoringResult\";\nimport type { Judge } from \"../judges/Judge\";\nimport { Logger } from \"../utils/logger\";\n\nconst POLL_INTERVAL_MS = 2000;\n\n/**\n * Abstract base for evaluation runners.\n *\n * Provides the shared run -> poll -> display flow.\n * Subclasses implement `_buildPayload` and `_submit` for local vs hosted mode.\n */\nexport abstract class EvaluatorRunner<S extends string | Judge> {\n protected readonly _client: JudgmentApiClient;\n protected readonly _projectId: string | null;\n protected readonly _projectName: string;\n\n constructor(\n client: JudgmentApiClient,\n projectId: string | null,\n projectName: string,\n ) {\n this._client = client;\n this._projectId = projectId;\n this._projectName = projectName;\n }\n\n protected abstract _buildPayload(\n evalId: string,\n projectId: string,\n evalRunName: string,\n createdAt: string,\n examples: Example[],\n scorers: S[],\n ): ExampleEvaluationRun;\n\n protected abstract _submit(\n projectId: string,\n evalId: string,\n examples: Example[],\n scorers: S[],\n payload: ExampleEvaluationRun,\n ): Promise<number>;\n\n protected async _poll(\n projectId: string,\n evalId: string,\n expectedCount: number,\n timeoutSeconds: number,\n ): Promise<{ results: ExperimentRunItem[]; url: string }> {\n const startTime = Date.now();\n\n while (true) {\n const elapsed = (Date.now() - startTime) / 1000;\n if (elapsed > timeoutSeconds) {\n throw new Error(`Evaluation timed out after ${timeoutSeconds}s`);\n }\n\n const response = await this._client.getV1projectsExperimentsByRunId(\n projectId,\n evalId,\n );\n const resultsData = response.results ?? [];\n const completed = resultsData.length;\n\n if (completed >= expectedCount) {\n const url = response.ui_results_url ?? \"Failed to get UI results URL\";\n console.log(\n `${pc.green(\"\\u2713\")} Evals completed and saved in ${pc.bold(`${elapsed.toFixed(1)}s`)}`,\n );\n // The experiments alias now returns a union (legacy experiment rows |\n // offline test-run rows). This hosted runner only drives the legacy\n // experiment path, so the rows are ExperimentRunItem at runtime.\n return { results: resultsData as ExperimentRunItem[], url };\n }\n\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n }\n\n protected _displayResults(\n examples: Example[],\n resultsData: ExperimentRunItem[],\n url: string,\n assertTest: boolean,\n ): ScoringResult[] {\n const results: ScoringResult[] = [];\n let passed = 0;\n let failed = 0;\n\n console.log();\n\n for (let i = 0; i < resultsData.length; i++) {\n const res = resultsData[i];\n const success = res.scorers.every((s) => Boolean(s.success));\n\n if (success) {\n passed++;\n console.log(\n `${pc.green(\"\\u2713\")} Example ${i + 1}: ${pc.green(\"PASSED\")}`,\n );\n } else {\n failed++;\n console.log(\n `${pc.red(\"\\u2717\")} Example ${i + 1}: ${pc.red(\"FAILED\")}`,\n );\n }\n\n for (const s of res.scorers) {\n const scoreStr = s.score !== null ? s.score.toFixed(3) : \"N/A\";\n const colored = s.success ? pc.green(scoreStr) : pc.red(scoreStr);\n console.log(\n ` ${pc.dim(`${s.name}:`)} ${colored} ${pc.dim(`(threshold: ${s.threshold})`)}`,\n );\n }\n\n results.push({ success, scorers: res.scorers, example: examples[i] });\n }\n\n console.log();\n if (passed === results.length) {\n console.log(\n `${pc.bold(pc.green(\"\\u2713 All tests passed!\"))} (${passed}/${results.length})`,\n );\n } else {\n console.log(\n `${pc.bold(pc.yellow(\"\\u26A0 Results:\"))} ${pc.green(`${passed} passed`)} | ${pc.red(`${failed} failed`)}`,\n );\n }\n console.log(`${pc.dim(\"View full details:\")} ${pc.underline(url)}`);\n console.log();\n\n if (assertTest && results.some((r) => !r.success)) {\n const lines = [\n `Evaluation failed: ${failed}/${results.length} examples failed`,\n ];\n for (let i = 0; i < results.length; i++) {\n if (!results[i].success) {\n lines.push(` Example ${i + 1}:`);\n for (const s of results[i].scorers) {\n if (!s.success) {\n lines.push(\n ` ${s.name}: ${s.score !== null ? s.score.toFixed(3) : \"N/A\"} (threshold: ${s.threshold})`,\n );\n if (s.reason) lines.push(` ${s.reason}`);\n }\n }\n }\n }\n throw new Error(lines.join(\"\\n\"));\n }\n\n return results;\n }\n\n async run(\n examples: Example[],\n scorers: S[],\n evalRunName: string,\n assertTest: boolean = false,\n timeoutSeconds: number = 300,\n ): Promise<ScoringResult[]> {\n if (!this._projectId) {\n Logger.error(\n \"Project ID is not resolved. Evaluation requires a valid project.\",\n );\n return [];\n }\n const projectId = this._projectId;\n const evalId = crypto.randomUUID();\n const createdAt = new Date().toISOString();\n\n console.log();\n console.log(pc.bold(pc.cyan(\"Starting Evaluation\")));\n console.log(`${pc.dim(\"Run:\")} ${evalRunName}`);\n console.log(`${pc.dim(\"Project:\")} ${this._projectName}`);\n console.log(\n `${pc.dim(\"Examples:\")} ${examples.length} | ${pc.dim(\"Scorers:\")} ${scorers.length}`,\n );\n console.log();\n\n const payload = this._buildPayload(\n evalId,\n projectId,\n evalRunName,\n createdAt,\n examples,\n scorers,\n );\n\n const expectedCount = await this._submit(\n projectId,\n evalId,\n examples,\n scorers,\n payload,\n );\n\n const { results: resultsData, url } = await this._poll(\n projectId,\n evalId,\n expectedCount,\n timeoutSeconds,\n );\n\n return this._displayResults(examples, resultsData, url, assertTest);\n }\n}\n",
53
+ "import pc from \"picocolors\";\nimport type { ExampleEvaluationRun } from \"../internal/api/models/ExampleEvaluationRun\";\nimport type { Example } from \"../data/Example\";\nimport { EvaluatorRunner } from \"./EvaluatorRunner\";\n\n/**\n * Evaluation runner for hosted (server-side) scorers.\n *\n * Submits scorer names to the Judgment platform's evaluation queue\n * and polls for results. Used internally by {@link Evaluation}.\n */\nexport class HostedEvaluatorRunner extends EvaluatorRunner<string> {\n protected _buildPayload(\n evalId: string,\n projectId: string,\n evalRunName: string,\n createdAt: string,\n examples: Example[],\n scorers: string[],\n ): ExampleEvaluationRun {\n return {\n id: evalId,\n project_id: projectId,\n eval_name: evalRunName,\n created_at: createdAt,\n examples: examples.map((e) => e.toJSON()),\n judgment_scorers: scorers.map((name) => ({ name })),\n custom_scorers: [],\n };\n }\n\n protected async _submit(\n projectId: string,\n _evalId: string,\n examples: Example[],\n _scorers: string[],\n payload: ExampleEvaluationRun,\n ): Promise<number> {\n await this._client.postV1projectsEvalQueueExamples(projectId, payload);\n console.log(`${pc.green(\"\\u2713\")} Evaluation submitted`);\n return examples.length;\n }\n}\n",
54
+ "import type { JudgmentApiClient } from \"../internal/api/client\";\nimport { Evaluation } from \"./Evaluation\";\n\n/**\n * Creates {@link Evaluation} instances for running batch scoring.\n *\n * Access via `client.evaluation`.\n *\n * @example\n * ```typescript\n * const evaluation = client.evaluation.create();\n * const results = await evaluation.run({ examples, scorers, evalRunName: \"my-eval\" });\n * ```\n */\nexport class EvaluationFactory {\n private readonly _client: JudgmentApiClient;\n private readonly _projectId: string | null;\n private readonly _projectName: string;\n\n constructor(\n client: JudgmentApiClient,\n projectId: string | null,\n projectName: string,\n ) {\n this._client = client;\n this._projectId = projectId;\n this._projectName = projectName;\n }\n\n /** Create a new `Evaluation` bound to the current project. */\n create(): Evaluation {\n return new Evaluation(this._client, this._projectId, this._projectName);\n }\n}\n",
55
+ "import type { JudgmentApiClient } from \"../internal/api/client\";\nimport type { PullAllOfflineDatasetsResponse } from \"../internal/api/models\";\nimport { Example, type ExampleDict } from \"../data/Example\";\nimport { Logger } from \"../utils/logger\";\nimport { Dataset } from \"./Dataset\";\nimport {\n type DatasetSchema,\n inferSchemaFromExamples,\n validateDatasetSchema,\n} from \"./schema\";\n\n/**\n * Creates, retrieves, and lists datasets in your project.\n *\n * Access via `client.datasets`.\n *\n * @example\n * ```typescript\n * const datasets = await client.datasets.list();\n * const dataset = await client.datasets.get(\"golden-set\");\n * ```\n */\nexport class DatasetFactory {\n private readonly _client: JudgmentApiClient;\n private readonly _projectId: string | null;\n private readonly _projectName: string;\n\n constructor(\n client: JudgmentApiClient,\n projectId: string | null,\n projectName: string,\n ) {\n this._client = client;\n this._projectId = projectId;\n this._projectName = projectName;\n }\n\n /**\n * Retrieve a dataset by name, including all its examples.\n *\n * @param name - The dataset name.\n * @returns The dataset with all examples hydrated, or `null` if the project is unresolved.\n */\n async get(name: string): Promise<Dataset | null> {\n const projectId = this._expectProjectId();\n if (!projectId) return null;\n\n const response =\n await this._client.getV1projectsDatasetsByDatasetIdentifier(\n projectId,\n name,\n );\n\n const datasetKind = response.dataset_kind ?? \"example\";\n // Offline datasets nest the user fields under `data` and carry server\n // metadata (organization_id, project_id, user_id) at the top level. Unwrap\n // `data` so user properties (input, etc.) become the Example's properties —\n // otherwise `example.get(\"input\")` is undefined and the metadata / the\n // nested `data` object leak into properties.\n const examples = (response.examples ?? []).map((e) =>\n Example.from({\n ...(e.data ?? {}),\n example_id: e.example_id,\n created_at: e.created_at ?? \"\",\n } as ExampleDict),\n );\n\n return new Dataset({\n name,\n projectId,\n projectName: this._projectName,\n datasetKind,\n examples,\n client: this._client,\n });\n }\n\n /**\n * Create a new dataset, optionally pre-populated with examples.\n *\n * @param name - The dataset name.\n * @param options.examples - Examples to upload after creation.\n * @param options.overwrite - If `true`, overwrite an existing dataset with the same name.\n * @param options.batchSize - Number of examples per batch upload request. Defaults to 100.\n * @returns The newly created dataset, or `null` if the project is unresolved.\n */\n async create(\n name: string,\n options: {\n examples?: Example[];\n overwrite?: boolean;\n batchSize?: number;\n schema?: DatasetSchema;\n } = {},\n ): Promise<Dataset | null> {\n const projectId = this._expectProjectId();\n if (!projectId) return null;\n\n const {\n examples = [],\n overwrite = false,\n batchSize = 100,\n schema,\n } = options;\n\n let resolvedSchema: DatasetSchema;\n if (schema !== undefined) {\n validateDatasetSchema(schema);\n resolvedSchema = schema;\n } else {\n if (examples.length === 0) {\n throw new Error(\n \"Datasets require a JSON Schema. Pass `schema` to create(), or provide `examples` to infer one.\",\n );\n }\n resolvedSchema = inferSchemaFromExamples(examples);\n }\n\n await this._client.postV1projectsDatasets(projectId, {\n name,\n examples: [],\n dataset_kind: \"example\",\n overwrite,\n schema: resolvedSchema as unknown as Record<string, unknown>,\n });\n\n const dataset = new Dataset({\n name,\n projectId,\n projectName: this._projectName,\n examples,\n client: this._client,\n });\n\n if (examples.length > 0) {\n await dataset.addExamples(examples, batchSize);\n }\n\n return dataset;\n }\n\n /**\n * List all datasets in the project.\n *\n * @returns An array of dataset metadata, or `null` if the project is unresolved.\n */\n list(): Promise<PullAllOfflineDatasetsResponse | null> {\n const projectId = this._expectProjectId();\n if (!projectId) return Promise.resolve(null);\n\n return this._client.getV1projectsDatasets(projectId);\n }\n\n private _expectProjectId(): string | null {\n if (!this._projectId) {\n Logger.error(\n \"Project ID is not resolved. Dataset operations require a valid project.\",\n );\n return null;\n }\n return this._projectId;\n }\n}\n",
56
+ "import type { JudgmentApiClient } from \"../internal/api/client\";\nimport { Example } from \"../data/Example\";\n\n/**\n * A collection of {@link Example} objects stored on the Judgment platform.\n *\n * Datasets are retrieved via {@link DatasetFactory.get} or created via\n * {@link DatasetFactory.create}. Once obtained, you can iterate over\n * the examples directly, or add new ones.\n *\n * @example\n * ```typescript\n * const dataset = await client.datasets.get(\"golden-set\");\n * for (const example of dataset) {\n * console.log(example.get(\"input\"));\n * }\n * ```\n */\nexport class Dataset {\n readonly name: string;\n readonly projectId: string;\n readonly projectName: string;\n readonly datasetKind: string;\n readonly examples: Example[];\n private readonly _client: JudgmentApiClient | null;\n\n constructor(opts: {\n name: string;\n projectId: string;\n projectName: string;\n datasetKind?: string;\n examples?: Example[];\n client?: JudgmentApiClient | null;\n }) {\n this.name = opts.name;\n this.projectId = opts.projectId;\n this.projectName = opts.projectName;\n this.datasetKind = opts.datasetKind ?? \"example\";\n this.examples = opts.examples ?? [];\n this._client = opts.client ?? null;\n }\n\n /**\n * Upload examples to this dataset in batches.\n *\n * @param examples - The examples to upload.\n * @param batchSize - Number of examples per batch request. Defaults to 100.\n */\n async addExamples(\n examples: Example[],\n batchSize: number = 100,\n ): Promise<void> {\n if (!this._client) return;\n\n for (let i = 0; i < examples.length; i += batchSize) {\n const batch = examples.slice(i, i + batchSize);\n await this._client.postV1projectsDatasetsByDatasetIdentifierExamples(\n this.projectId,\n this.name,\n { examples: batch.map((e) => e.toJSON()) },\n );\n }\n }\n\n /**\n * Load examples from a JSON file and add them to the dataset.\n *\n * Expects the file to contain a JSON array of objects, each with\n * properties like `input`, `actual_output`, etc.\n *\n * @param filePath - Path to the JSON file.\n * @param batchSize - Number of examples per batch request. Defaults to 100.\n */\n async addFromJson(filePath: string, batchSize: number = 100): Promise<void> {\n const { readFile } = await import(\"fs/promises\");\n const raw = await readFile(filePath, \"utf-8\");\n const data: unknown[] = JSON.parse(raw);\n\n const examples: Example[] = data.map((item) => {\n if (typeof item !== \"object\" || item === null) {\n throw new Error(\"Each item in the JSON array must be an object\");\n }\n return Example.create(item as Record<string, unknown>);\n });\n\n await this.addExamples(examples, batchSize);\n }\n\n /** Number of examples in this dataset. */\n get length(): number {\n return this.examples.length;\n }\n\n /** Iterate over examples. */\n [Symbol.iterator](): Iterator<Example> {\n return this.examples[Symbol.iterator]();\n }\n\n toString(): string {\n return `Dataset(name=${this.name}, examples=${this.examples.length})`;\n }\n}\n",
57
+ "import { Example } from \"../data/Example\";\n\n/**\n * A dataset column type: a JSON Schema primitive or the Judgment pointer type\n * `\"trace\"` (whose stored value is a trace id rather than literal data).\n */\nexport type DatasetColumnType =\n | \"string\"\n | \"integer\"\n | \"number\"\n | \"boolean\"\n | \"array\"\n | \"object\"\n | \"trace\";\n\n/** A single dataset column declaration. */\nexport interface DatasetSchemaProperty {\n type: DatasetColumnType;\n}\n\n/**\n * A dataset's JSON Schema. Datasets are object-typed with one property per\n * column. A column declared `{ type: \"trace\" }` (under any name) holds a trace\n * id; at most one trace column is allowed per dataset.\n */\nexport interface DatasetSchema {\n type: \"object\";\n properties: Record<string, DatasetSchemaProperty>;\n}\n\nconst TRACE_TYPE = \"trace\";\n\n/**\n * Validate a dataset JSON Schema client-side before sending. Mirrors the\n * server's structural checks so obvious mistakes fail fast; the server remains\n * the source of truth for full JSON Schema validation.\n *\n * @throws Error if the schema is not an object, does not declare top-level\n * `type: \"object\"`, lacks a `properties` object, or declares more than one\n * trace-typed column.\n */\nexport function validateDatasetSchema(schema: unknown): void {\n if (typeof schema !== \"object\" || schema === null || Array.isArray(schema)) {\n throw new Error(\"Dataset schema must be a JSON object.\");\n }\n // Narrowing is now justified by the runtime object-check above.\n const s = schema as Record<string, unknown>;\n if (s.type !== \"object\") {\n throw new Error('Dataset schema must declare top-level type \"object\".');\n }\n const properties = s.properties;\n if (\n typeof properties !== \"object\" ||\n properties === null ||\n Array.isArray(properties)\n ) {\n throw new Error(\"Dataset schema must declare a 'properties' object.\");\n }\n const traceCols = Object.entries(properties as Record<string, unknown>)\n .filter(\n ([, prop]) =>\n typeof prop === \"object\" &&\n prop !== null &&\n (prop as Record<string, unknown>).type === TRACE_TYPE,\n )\n .map(([name]) => name);\n if (traceCols.length > 1) {\n throw new Error(\n `A dataset may declare at most one trace column; found ${traceCols.length}: ${traceCols.join(\", \")}.`,\n );\n }\n}\n\nfunction jsonSchemaType(value: unknown): DatasetColumnType {\n if (typeof value === \"boolean\") return \"boolean\";\n if (typeof value === \"number\") {\n return Number.isInteger(value) ? \"integer\" : \"number\";\n }\n if (typeof value === \"string\") return \"string\";\n if (Array.isArray(value)) return \"array\";\n if (typeof value === \"object\" && value !== null) return \"object\";\n return \"string\";\n}\n\n/**\n * Infer a JSON Schema from a set of examples. Convenience for\n * `client.datasets.create()` when no explicit schema is supplied. Every\n * example must share the same set of non-null fields; inferred types are JSON\n * Schema primitives only (declare a trace column with an explicit schema).\n *\n * @throws Error if no examples are provided or examples have heterogeneous fields.\n */\nexport function inferSchemaFromExamples(examples: Example[]): DatasetSchema {\n if (examples.length === 0) {\n throw new Error(\n \"Cannot infer a dataset schema without examples. Pass an explicit `schema` to client.datasets.create().\",\n );\n }\n\n const properties: Record<string, DatasetSchemaProperty> = {};\n let allKeys: Set<string> | null = null;\n\n for (const example of examples) {\n const keys = new Set<string>();\n for (const [key, value] of Object.entries(example.properties)) {\n if (value === null || value === undefined) continue;\n keys.add(key);\n if (!(key in properties)) {\n properties[key] = { type: jsonSchemaType(value) };\n }\n }\n if (allKeys === null) {\n allKeys = keys;\n } else if (\n allKeys.size !== keys.size ||\n ![...allKeys].every((k) => keys.has(k))\n ) {\n throw new Error(\n \"All examples must share the same set of fields (dataset schemas require all declared properties). Pass an explicit `schema` or make all examples homogeneous.\",\n );\n }\n }\n\n return { type: \"object\", properties };\n}\n",
58
+ "import type { JudgmentApiClient } from \"../internal/api/client\";\nimport type { SDKCreateAgentJudgeRequest } from \"../internal/api/models/SDKCreateAgentJudgeRequest\";\nimport type { SDKUpdateAgentJudgeRequest } from \"../internal/api/models/SDKUpdateAgentJudgeRequest\";\nimport type { SDKUpdateAgentJudgeResponse } from \"../internal/api/models/SDKUpdateAgentJudgeResponse\";\nimport { Logger } from \"../utils/logger\";\nimport type { AgentJudge, ScoreType } from \"./AgentJudge\";\n\n/**\n * Create and update prompt-based Agent Judges on the Judgment platform.\n *\n * Access via `client.agentJudges`.\n *\n * @example\n * ```typescript\n * const judge = await client.agentJudges.create({\n * name: \"helpfulness\",\n * prompt: \"Rate the assistant's helpfulness from 0 to 1.\",\n * model: \"gpt-5.2\",\n * scoreType: \"numeric\",\n * });\n *\n * await client.agentJudges.update({\n * judgeId: judge.judgeId,\n * prompt: \"Updated rubric prompt.\",\n * });\n * ```\n */\nexport class AgentJudgeFactory {\n private readonly _client: JudgmentApiClient;\n private readonly _projectId: string | null;\n private readonly _projectName: string;\n\n constructor(\n client: JudgmentApiClient,\n projectId: string | null,\n projectName: string,\n ) {\n this._client = client;\n this._projectId = projectId;\n this._projectName = projectName;\n }\n\n /**\n * Create a new Agent Judge (prompt-based scorer).\n *\n * @param options.name - Unique judge name within the project.\n * @param options.prompt - Rubric prompt template used by the agent judge harness.\n * @param options.model - LiteLLM model id (e.g. `\"gpt-5.2\"`).\n * @param options.scoreType - One of `\"numeric\"`, `\"binary\"`, or `\"categorical\"`.\n * @param options.description - Description stored on the underlying scorer version.\n * @param options.judgeDescription - Description shown in the UI.\n * @param options.categories - Choice list for `categorical` judges.\n * @param options.minScore - Lower bound for `numeric` judges (defaults to `0` server-side).\n * @param options.maxScore - Upper bound for `numeric` judges (defaults to `1` server-side).\n * @returns The newly created `AgentJudge`, or `null` if the project is unresolved.\n */\n async create(options: {\n name: string;\n prompt: string;\n model: string;\n scoreType: ScoreType;\n description?: string;\n judgeDescription?: string;\n categories?: { name: string; description: string }[];\n minScore?: number;\n maxScore?: number;\n }): Promise<AgentJudge | null> {\n const projectId = this._expectProjectId();\n if (!projectId) return null;\n\n const payload: SDKCreateAgentJudgeRequest = {\n name: options.name,\n prompt: options.prompt,\n model: options.model,\n score_type: options.scoreType,\n };\n if (options.description !== undefined)\n payload.description = options.description;\n if (options.judgeDescription !== undefined)\n payload.judge_description = options.judgeDescription;\n if (options.categories !== undefined)\n payload.categories = options.categories;\n if (options.minScore !== undefined) payload.min_score = options.minScore;\n if (options.maxScore !== undefined) payload.max_score = options.maxScore;\n\n const response = await this._client.postV1projectsJudges(\n projectId,\n payload,\n );\n\n return {\n judgeId: response.judge_id,\n name: options.name,\n prompt: options.prompt,\n model: options.model,\n scoreType: options.scoreType,\n description: options.description ?? null,\n judgeDescription: options.judgeDescription ?? null,\n categories: options.categories ?? null,\n minScore: options.minScore ?? null,\n maxScore: options.maxScore ?? null,\n majorVersion: 0,\n minorVersion: 0,\n };\n }\n\n /**\n * Update an existing Agent Judge.\n *\n * Passing any of `prompt`, `model`, `categories`, `minScore`, or\n * `maxScore` writes a new version of the underlying prompt scorer.\n * When `targetMajorVersion` / `targetMinorVersion` are omitted, the\n * server auto-bumps the latest version's minor by 1 — matching the\n * UI's default \"save\" behaviour.\n *\n * @param options.judgeId - ID of the judge to update.\n * @param options.prompt - New rubric prompt template.\n * @param options.model - New LiteLLM model id.\n * @param options.scoreType - New score type.\n * @param options.description - New scorer-version description.\n * @param options.judgeDescription - New UI-facing description.\n * @param options.categories - New choices for `categorical` judges.\n * @param options.minScore - New lower bound for `numeric` judges.\n * @param options.maxScore - New upper bound for `numeric` judges.\n * @param options.sourceMajorVersion - Major version to copy unspecified fields from.\n * @param options.sourceMinorVersion - Minor version to copy unspecified fields from.\n * @param options.targetMajorVersion - Major version to write to.\n * @param options.targetMinorVersion - Minor version to write to.\n * @returns The updated `AgentJudge`, or `null` if the project is unresolved.\n */\n async update(options: {\n judgeId: string;\n prompt?: string;\n model?: string;\n scoreType?: ScoreType;\n description?: string;\n judgeDescription?: string;\n categories?: { name: string; description: string }[];\n minScore?: number;\n maxScore?: number;\n sourceMajorVersion?: number;\n sourceMinorVersion?: number;\n targetMajorVersion?: number;\n targetMinorVersion?: number;\n }): Promise<AgentJudge | null> {\n const projectId = this._expectProjectId();\n if (!projectId) return null;\n\n const payload: SDKUpdateAgentJudgeRequest = {};\n if (options.prompt !== undefined) payload.prompt = options.prompt;\n if (options.model !== undefined) payload.model = options.model;\n if (options.scoreType !== undefined) payload.score_type = options.scoreType;\n if (options.description !== undefined)\n payload.description = options.description;\n if (options.judgeDescription !== undefined)\n payload.judge_description = options.judgeDescription;\n if (options.categories !== undefined)\n payload.categories = options.categories;\n if (options.minScore !== undefined) payload.min_score = options.minScore;\n if (options.maxScore !== undefined) payload.max_score = options.maxScore;\n if (options.sourceMajorVersion !== undefined)\n payload.source_major_version = options.sourceMajorVersion;\n if (options.sourceMinorVersion !== undefined)\n payload.source_minor_version = options.sourceMinorVersion;\n if (options.targetMajorVersion !== undefined)\n payload.target_major_version = options.targetMajorVersion;\n if (options.targetMinorVersion !== undefined)\n payload.target_minor_version = options.targetMinorVersion;\n\n const response = await this._client.patchV1projectsJudgesByJudgeId(\n projectId,\n options.judgeId,\n payload,\n );\n\n return agentJudgeFromDetail(response);\n }\n\n private _expectProjectId(): string | null {\n if (!this._projectId) {\n Logger.error(\n \"Project ID is not resolved. Agent judge operations require a valid project.\",\n );\n return null;\n }\n return this._projectId;\n }\n}\n\nfunction agentJudgeFromDetail(\n response: SDKUpdateAgentJudgeResponse,\n): AgentJudge {\n const judge = response.judge;\n return {\n judgeId: judge.id,\n name: judge.name,\n prompt: judge.prompt ?? \"\",\n model: judge.model ?? \"\",\n scoreType: judge.score_type as ScoreType,\n description: judge.description ?? null,\n judgeDescription: judge.judge_description ?? null,\n categories: judge.categories ?? null,\n minScore: judge.min_score ?? null,\n maxScore: judge.max_score ?? null,\n majorVersion: judge.major_version ?? null,\n minorVersion: judge.minor_version ?? null,\n };\n}\n",
59
+ "import type { JudgmentApiClient } from \"../internal/api/client\";\nimport type { CreateTestConfigRequest } from \"../internal/api/models\";\nimport { Logger } from \"../utils/logger\";\nimport { OfflineTestRunner, type OfflineRunOptions } from \"./OfflineTestRunner\";\nimport {\n type OfflineTestResult,\n type TestConfig,\n testConfigFromDict,\n} from \"./types\";\n\nconst UUID_RE =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction isUuid(value: string): boolean {\n return UUID_RE.test(value);\n}\n\n/** A judge to attach to a test config: a judge name, or `{ judgeId }` / `{ name }`. */\nexport type JudgeRef = string | { judgeId?: string; name?: string };\n\n/**\n * Create test configs and execute offline test runs. Access via\n * `client.offlineTests`. A *test config* pairs a dataset with a set of platform\n * judges; a *test run* evaluates one dataset version and stores per-example\n * results.\n *\n * @example\n * ```typescript\n * const config = await client.offlineTests.createConfig(\"nightly\", \"golden-set\", [\n * \"helpfulness\",\n * \"faithfulness\",\n * ]);\n * const result = await client.offlineTests.run(\"nightly\");\n * console.log(result?.uiResultsUrl);\n * ```\n */\nexport class OfflineTestsFactory {\n private readonly _client: JudgmentApiClient;\n private readonly _projectId: string | null;\n private readonly _projectName: string;\n\n constructor(\n client: JudgmentApiClient,\n projectId: string | null,\n projectName: string,\n ) {\n this._client = client;\n this._projectId = projectId;\n this._projectName = projectName;\n }\n\n /**\n * Create a test config binding a dataset to a set of judges.\n *\n * @param name - Name for the test config.\n * @param dataset - Dataset name or dataset id.\n * @param judges - Judges to attach (judge names, or `{ judgeId }` / `{ name }`).\n * @param description - Optional human-readable description.\n */\n async createConfig(\n name: string,\n dataset: string,\n judges: JudgeRef[],\n description?: string,\n ): Promise<TestConfig | null> {\n const projectId = this._expectProjectId();\n if (!projectId) return null;\n\n const judgeEntries: { judge_id?: string; name?: string }[] = [];\n for (const judge of judges) {\n if (typeof judge === \"string\") {\n judgeEntries.push(\n isUuid(judge) ? { judge_id: judge } : { name: judge },\n );\n } else if (judge.judgeId) {\n judgeEntries.push({ judge_id: judge.judgeId });\n } else if (judge.name) {\n judgeEntries.push({ name: judge.name });\n } else {\n throw new Error(\n \"judges entries must be judge names or objects with a 'judgeId' or 'name'\",\n );\n }\n }\n\n const payload: CreateTestConfigRequest = { name, judges: judgeEntries };\n if (description !== undefined) payload.description = description;\n if (isUuid(dataset)) {\n payload.dataset_id = dataset;\n } else {\n payload.dataset_name = dataset;\n }\n\n const response = await this._client.postV1projectsTestConfigs(\n projectId,\n payload,\n );\n Logger.info(`Created test config ${name}`);\n return testConfigFromDict(\n (response.test_config as Record<string, unknown> | undefined) ?? {},\n );\n }\n\n /** Fetch a test config by id (UUID) or name. */\n async getConfig(testConfig: string): Promise<TestConfig | null> {\n const projectId = this._expectProjectId();\n if (!projectId) return null;\n\n if (isUuid(testConfig)) {\n const response =\n await this._client.getV1projectsTestConfigsByTestConfigId(\n projectId,\n testConfig,\n );\n return testConfigFromDict(\n (response.test_config as Record<string, unknown> | undefined) ?? {},\n );\n }\n\n const configs = (await this.listConfigs()) ?? [];\n const match = configs.find((config) => config.name === testConfig);\n if (!match) {\n Logger.error(`Test config '${testConfig}' not found`);\n return null;\n }\n return match;\n }\n\n /** List test configs in the project, optionally filtered to one dataset. */\n async listConfigs(datasetId?: string): Promise<TestConfig[] | null> {\n const projectId = this._expectProjectId();\n if (!projectId) return null;\n\n const response = await this._client.getV1projectsTestConfigs(\n projectId,\n datasetId,\n );\n const rows = Array.isArray(response.test_configs)\n ? response.test_configs\n : [];\n return rows.map((row) =>\n testConfigFromDict(row as Record<string, unknown>),\n );\n }\n\n /** Delete a test config by id. Returns `false` if the project is unresolved. */\n async deleteConfig(testConfigId: string): Promise<boolean> {\n const projectId = this._expectProjectId();\n if (!projectId) return false;\n\n await this._client.deleteV1projectsTestConfigsByTestConfigId(\n projectId,\n testConfigId,\n );\n Logger.info(`Deleted test config ${testConfigId}`);\n return true;\n }\n\n /**\n * Run an offline test for a test config.\n *\n * Without `agentFunction`, the judges score each example's existing trace.\n * With `agentFunction`, the agent runs once per example first and the judges\n * score the resulting agent trace.\n *\n * @param testConfig - Test config name, id, or `TestConfig` object.\n * @param options - Run options (agent function, judge versions, dataset\n * version, pass condition, assert, timeout).\n */\n async run(\n testConfig: string | TestConfig,\n options: OfflineRunOptions = {},\n ): Promise<OfflineTestResult | null> {\n const projectId = this._expectProjectId();\n if (!projectId) return null;\n\n const config =\n typeof testConfig === \"string\"\n ? await this.getConfig(testConfig)\n : testConfig;\n if (!config || !config.id) return null;\n\n const runner = new OfflineTestRunner(\n this._client,\n projectId,\n this._projectName,\n );\n return runner.run(config, options);\n }\n\n private _expectProjectId(): string | null {\n if (!this._projectId) {\n Logger.error(\n \"Project ID is not resolved. Offline-test operations require a valid project.\",\n );\n return null;\n }\n return this._projectId;\n }\n}\n",
60
+ "import type { JudgmentApiClient } from \"../internal/api/client\";\nimport type {\n ApplyTestRunSuccessRequest,\n CreateTestRunRequest,\n PreparedTestRunResponse,\n} from \"../internal/api/models\";\nimport { Logger } from \"../utils/logger\";\nimport { Example } from \"../data/Example\";\nimport { Tracer } from \"../trace/Tracer\";\nimport { OfflineTracer } from \"../trace/OfflineTracer\";\nimport { JudgmentTracerProvider } from \"../trace/JudgmentTracerProvider\";\nimport { sleep } from \"../utils/sleep\";\nimport {\n type AgentFunction,\n type JudgeVersionPin,\n type OfflineExampleResult,\n type OfflineTestResult,\n type PassConditionFn,\n type TestConfig,\n computePassed,\n} from \"./types\";\nimport {\n asArray,\n asRecord,\n asString,\n assertAllPassed,\n buildResults,\n displayResults,\n displayStart,\n normalizeJudgeVersions,\n} from \"./utils\";\n\nconst TERMINAL_STATUSES = new Set([\"completed\", \"error\", \"cancelled\"]);\nconst EXAMPLES_PAGE_SIZE = 100;\nconst ITEMS_PAGE_SIZE = 200;\nconst POLL_INTERVAL_MS = 2000;\nconst MAX_PAGES = 10_000;\n\ninterface ExampleRow {\n exampleId: string;\n data: Record<string, unknown>;\n offlineTraceId: string | null;\n createdAt: string | null;\n}\n\n/** Options accepted by {@link OfflineTestRunner.run}. */\nexport interface OfflineRunOptions {\n agentFunction?: AgentFunction;\n judgeVersions?: JudgeVersionPin[];\n datasetVersion?: number | string;\n passConditionFn?: PassConditionFn;\n assertTest?: boolean;\n timeoutSeconds?: number;\n /** Optional display name for the run; server auto-names it when omitted. */\n runName?: string;\n}\n\n/**\n * Executes the offline-test lifecycle for a test config: resolve the dataset\n * version, optionally run the agent to produce offline traces, create the test\n * run, wait for terminal status, fetch results, evaluate the pass condition,\n * and report successes.\n */\nexport class OfflineTestRunner {\n private readonly _client: JudgmentApiClient;\n private readonly _projectId: string;\n private readonly _projectName: string;\n\n constructor(\n client: JudgmentApiClient,\n projectId: string,\n projectName: string,\n ) {\n this._client = client;\n this._projectId = projectId;\n this._projectName = projectName;\n }\n\n async resolveDatasetVersion(\n testConfig: TestConfig,\n datasetVersion?: number | string,\n ): Promise<Record<string, unknown>> {\n const response =\n await this._client.getV1projectsDatasetsByDatasetIdentifierVersions(\n this._projectId,\n testConfig.datasetId,\n );\n const versions = asArray(response.versions)\n .filter((v) => typeof v === \"object\" && v !== null)\n .map((v) => v as Record<string, unknown>);\n\n if (datasetVersion === undefined) {\n if (versions.length === 0) {\n throw new Error(\n `Dataset of test config '${testConfig.name}' has no versions`,\n );\n }\n return versions.reduce((best, v) =>\n Number(v.version_number ?? 0) > Number(best.version_number ?? 0)\n ? v\n : best,\n );\n }\n\n if (typeof datasetVersion === \"number\") {\n const match = versions.find(\n (v) => Number(v.version_number ?? 0) === datasetVersion,\n );\n if (match) return match;\n } else {\n const match = versions.find((v) => v.version_id === datasetVersion);\n if (match) return match;\n }\n throw new Error(\n `Dataset version ${JSON.stringify(datasetVersion)} does not exist for the dataset of test config '${testConfig.name}'`,\n );\n }\n\n async fetchExamples(\n testConfig: TestConfig,\n versionNumber: number,\n ): Promise<ExampleRow[]> {\n const examples: ExampleRow[] = [];\n let cursorCreatedAt: string | undefined;\n let cursorExampleId: string | undefined;\n let pageCount = 0;\n\n for (;;) {\n if (pageCount >= MAX_PAGES) {\n throw new Error(\n `fetchExamples exceeded ${MAX_PAGES} pages for dataset of test config '${testConfig.name}'`,\n );\n }\n const page =\n await this._client.getV1projectsDatasetsByDatasetIdentifierPage(\n this._projectId,\n testConfig.datasetId,\n String(versionNumber),\n String(EXAMPLES_PAGE_SIZE),\n cursorCreatedAt,\n cursorExampleId,\n );\n pageCount += 1;\n\n for (const entry of asArray(page.entries)) {\n const example = asRecord(asRecord(entry).example);\n let data = example.data;\n if (typeof data === \"string\") {\n try {\n data = JSON.parse(data);\n } catch {\n data = {};\n }\n }\n examples.push({\n exampleId: asString(example.example_id),\n data: asRecord(data),\n offlineTraceId:\n typeof example.offline_trace_id === \"string\"\n ? example.offline_trace_id\n : null,\n createdAt:\n typeof example.created_at === \"string\" ? example.created_at : null,\n });\n }\n\n const metadata = asRecord(page.metadata);\n const nextCursor = asRecord(metadata.nextCursor);\n if (!metadata.hasMore || Object.keys(nextCursor).length === 0) break;\n cursorCreatedAt = asString(nextCursor.created_at);\n cursorExampleId = asString(nextCursor.example_id);\n }\n\n return examples;\n }\n\n createTestRun(\n testConfig: TestConfig,\n options: {\n datasetVersion?: number | string;\n judgeVersions?: JudgeVersionPin[];\n agentTraces?: Record<string, string>;\n source?: string;\n name?: string;\n } = {},\n ): Promise<PreparedTestRunResponse> {\n const payload: CreateTestRunRequest = {\n test_config_id: testConfig.id,\n source: options.source ?? \"sdk\",\n };\n if (options.name) {\n payload.name = options.name;\n }\n if (typeof options.datasetVersion === \"number\") {\n payload.dataset_version_number = options.datasetVersion;\n } else if (typeof options.datasetVersion === \"string\") {\n payload.dataset_version_id = options.datasetVersion;\n }\n const normalized = normalizeJudgeVersions(options.judgeVersions);\n if (normalized) {\n payload.judge_versions =\n normalized as CreateTestRunRequest[\"judge_versions\"];\n }\n\n const agentTraces = options.agentTraces ?? {};\n if (Object.keys(agentTraces).length > 0) {\n payload.agent_traces = Object.entries(agentTraces).map(\n ([exampleId, traceId]) => ({\n example_id: exampleId,\n agent_offline_trace_id: traceId,\n }),\n );\n }\n\n return this._client.postV1projectsTestRuns(this._projectId, payload);\n }\n\n /**\n * Run the agent once per dataset example, producing one offline trace each.\n *\n * NOTE: the offline-tracer lifecycle here (active-tracer swap, async\n * `observe`, per-example trace attribution) still needs validation against a\n * live run.\n */\n async runAgent(\n agentFunction: AgentFunction,\n examples: ExampleRow[],\n ): Promise<Record<string, string>> {\n const captured: Example[] = [];\n // Restore whatever tracer was active before we swap in the offline tracer,\n // so an agent run doesn't leave the offline tracer globally active.\n const previousTracer =\n JudgmentTracerProvider.getInstance().getActiveTracer();\n await OfflineTracer.create({\n projectName: this._projectName,\n apiKey: this._client.getApiKey(),\n organizationId: this._client.getOrganizationId(),\n apiUrl: this._client.getBaseUrl(),\n dataset: captured,\n setActive: true,\n });\n\n const agentTraces: Record<string, string> = {};\n try {\n const wrapped = Tracer.observe(agentFunction, { spanType: \"agent\" });\n for (const example of examples) {\n const before = captured.length;\n try {\n await wrapped(example.data);\n } catch (error) {\n Logger.error(\n `Agent entrypoint raised for example ${example.exampleId}: ${String(error)}`,\n );\n }\n for (const produced of captured.slice(before)) {\n const traceId = produced.get(\"offline_trace_id\");\n if (example.exampleId && typeof traceId === \"string\") {\n agentTraces[example.exampleId] = traceId;\n break;\n }\n }\n }\n } finally {\n await Tracer.forceFlush();\n if (previousTracer) previousTracer.setActive();\n }\n\n return agentTraces;\n }\n\n async waitForCompletion(\n testRunId: string,\n timeoutSeconds: number,\n ): Promise<string> {\n const start = Date.now();\n for (;;) {\n if ((Date.now() - start) / 1000 > timeoutSeconds) {\n throw new Error(\n `Test run ${testRunId} did not complete within ${timeoutSeconds}s`,\n );\n }\n const response = await this._client.getV1projectsTestRunsByTestRunId(\n this._projectId,\n testRunId,\n );\n const status = asString(asRecord(response.test_run).status);\n if (TERMINAL_STATUSES.has(status)) return status;\n await sleep(POLL_INTERVAL_MS);\n }\n }\n\n async fetchItems(\n testRunId: string,\n ): Promise<{ items: Record<string, unknown>[]; uiResultsUrl: string }> {\n const items: Record<string, unknown>[] = [];\n let uiResultsUrl = \"\";\n let cursor: string | undefined;\n let pageCount = 0;\n\n for (;;) {\n if (pageCount >= MAX_PAGES) {\n throw new Error(\n `fetchItems exceeded ${MAX_PAGES} pages for test run ${testRunId}`,\n );\n }\n const response = await this._client.getV1projectsTestRunsByTestRunIdItems(\n this._projectId,\n testRunId,\n String(ITEMS_PAGE_SIZE),\n cursor,\n );\n pageCount += 1;\n\n for (const item of asArray(response.results)) {\n items.push(asRecord(item));\n }\n if (!uiResultsUrl) uiResultsUrl = asString(response.ui_results_url);\n\n const nextCursor = response.next_cursor;\n if (!response.has_more || typeof nextCursor !== \"string\" || !nextCursor) {\n break;\n }\n cursor = nextCursor;\n }\n\n return { items, uiResultsUrl };\n }\n\n async reportSuccess(\n testRunId: string,\n prepared: PreparedTestRunResponse,\n items: Record<string, unknown>[],\n results: OfflineExampleResult[],\n ): Promise<void> {\n const refsByVersion = new Map<string, string>();\n const refsByName = new Map<string, string>();\n const versionKey = (\n exampleId: string,\n judgeId: string,\n major: number,\n minor: number,\n ): string => `${exampleId}\u0000${judgeId}\u0000${major}\u0000${minor}`;\n const nameKey = (exampleId: string, judgeName: string): string =>\n `${exampleId}\u0000${judgeName}`;\n\n for (const rawRef of asArray(prepared.evaluation_runs)) {\n const ref = asRecord(rawRef);\n const runId = ref.run_id;\n if (typeof runId !== \"string\" || !runId) continue;\n refsByVersion.set(\n versionKey(\n asString(ref.example_id),\n asString(ref.judge_id),\n Number(ref.judge_major_version ?? 0),\n Number(ref.judge_minor_version ?? 0),\n ),\n runId,\n );\n refsByName.set(\n nameKey(asString(ref.example_id), asString(ref.judge_name)),\n runId,\n );\n }\n\n const resultsByExample = new Map<string, OfflineExampleResult>();\n for (const result of results)\n resultsByExample.set(result.exampleId, result);\n\n const successes: ApplyTestRunSuccessRequest[\"successes\"] = [];\n for (const item of items) {\n const exampleId = asString(item.example_id);\n const result = resultsByExample.get(exampleId);\n const successByIndex = result\n ? result.scorers.map((s) => s.success ?? null)\n : [];\n\n const scorerRows = asArray(item.scorers);\n for (let index = 0; index < scorerRows.length; index += 1) {\n const scorer = asRecord(scorerRows[index]);\n const evaluationRunId =\n refsByVersion.get(\n versionKey(\n exampleId,\n asString(scorer.judge_id),\n Number(scorer.judge_major_version ?? 0),\n Number(scorer.judge_minor_version ?? 0),\n ),\n ) ?? refsByName.get(nameKey(exampleId, asString(scorer.judge_name)));\n if (!evaluationRunId) {\n Logger.warning(\n `No evaluation run ref for scorer ${asString(scorer.judge_name)} of example ${exampleId}; skipping its success update`,\n );\n continue;\n }\n successes.push({\n evaluation_run_id: evaluationRunId,\n success: index < successByIndex.length ? successByIndex[index] : null,\n });\n }\n }\n\n if (successes.length === 0) return;\n await this._client.patchV1projectsTestRunsByTestRunIdSuccess(\n this._projectId,\n testRunId,\n { successes },\n );\n }\n\n async run(\n testConfig: TestConfig,\n options: OfflineRunOptions = {},\n ): Promise<OfflineTestResult> {\n const {\n agentFunction,\n judgeVersions,\n datasetVersion,\n passConditionFn,\n assertTest = false,\n timeoutSeconds = 600,\n runName,\n } = options;\n\n if (assertTest && !passConditionFn) {\n throw new Error(\n \"assertTest=true requires a passConditionFn to decide whether each row passes.\",\n );\n }\n\n const version = await this.resolveDatasetVersion(\n testConfig,\n datasetVersion,\n );\n const versionNumber = Number(version.version_number ?? 0);\n const examples = await this.fetchExamples(testConfig, versionNumber);\n displayStart(testConfig.name, this._projectName, examples.length);\n Logger.info(\n `Dataset version ${versionNumber}: ${examples.length} example(s)`,\n );\n\n // Pin the run to the exact version the examples were fetched from.\n const pinnedVersion =\n typeof datasetVersion === \"string\" ? datasetVersion : versionNumber;\n\n let agentTraces: Record<string, string> = {};\n if (agentFunction && examples.length > 0) {\n agentTraces = await this.runAgent(agentFunction, examples);\n }\n\n const prepared = await this.createTestRun(testConfig, {\n datasetVersion: pinnedVersion,\n judgeVersions,\n agentTraces,\n name: runName,\n });\n const testRun = asRecord(prepared.test_run);\n const testRunId = asString(testRun.id);\n let uiResultsUrl = asString(prepared.ui_results_url);\n Logger.info(\n `Created test run ${testRunId} over ${examples.length} examples`,\n );\n\n const status = await this.waitForCompletion(testRunId, timeoutSeconds);\n\n const { items, uiResultsUrl: itemsUrl } = await this.fetchItems(testRunId);\n if (itemsUrl) uiResultsUrl = itemsUrl;\n\n const results = buildResults(items, agentTraces, passConditionFn);\n if (passConditionFn) {\n await this.reportSuccess(testRunId, prepared, items, results);\n }\n\n displayResults(results, uiResultsUrl || undefined);\n\n const outcome: OfflineTestResult = {\n testRunId,\n status,\n uiResultsUrl: uiResultsUrl || undefined,\n results,\n agentOfflineTraceIds: agentTraces,\n passed: computePassed(results),\n };\n\n if (assertTest) assertAllPassed(outcome);\n return outcome;\n }\n}\n",
61
+ "/**\n * Types for the offline-tests SDK surface: TestConfig, OfflineTestResult,\n * JudgeVersionPin, AgentFunction, PassConditionFn.\n */\n\n/**\n * A reusable offline-test configuration (a dataset + a set of platform judges).\n * Created via `client.offlineTests.createConfig()`.\n */\nexport interface TestConfig {\n /** Unique test config id. */\n id: string;\n /** Config name. */\n name: string;\n /** The dataset evaluated by this config. */\n datasetId: string;\n /** Optional human-readable description. */\n description?: string | null;\n /** ISO-8601 creation timestamp. */\n createdAt?: string | null;\n /** The judge membership rows as returned by the server. */\n judges: Record<string, unknown>[];\n}\n\n/** Build a {@link TestConfig} from a raw server `test_config` object. */\nexport function testConfigFromDict(data: Record<string, unknown>): TestConfig {\n const judges = Array.isArray(data.judges)\n ? (data.judges.filter((j) => typeof j === \"object\" && j !== null) as Record<\n string,\n unknown\n >[])\n : [];\n return {\n id: typeof data.id === \"string\" ? data.id : \"\",\n name: typeof data.name === \"string\" ? data.name : \"\",\n datasetId: typeof data.dataset_id === \"string\" ? data.dataset_id : \"\",\n description: typeof data.description === \"string\" ? data.description : null,\n createdAt: typeof data.created_at === \"string\" ? data.created_at : null,\n judges,\n };\n}\n\n/**\n * A single `judgeVersions` entry. Identify the judge by `name` or `judgeId`;\n * optionally pin a `tag`, a `version` string, or a `majorVersion`/`minorVersion`\n * pair. Every entry must carry a `name` or `judgeId`.\n */\nexport interface JudgeVersionPin {\n name?: string;\n judgeId?: string;\n tag?: string;\n version?: string;\n majorVersion?: number;\n minorVersion?: number;\n}\n\n/** One judge's result for one example. */\nexport interface OfflineScorerData {\n /** Judge name. */\n name: string;\n /** The scorer result: `\"Yes\"`/`\"No\"` (binary), the category (categorical), or a number. */\n value: string | number | null;\n /** Result type returned by the scorer. */\n scoreType?: string | null;\n /** Error message, if the judge errored on this row. */\n error?: string | null;\n /** Pass-condition outcome for the row, when a `passConditionFn` was supplied. */\n success?: boolean | null;\n /** Extra metadata (judge id/version, reason). */\n metadata: Record<string, unknown>;\n}\n\n/** Per-example results for an offline test run. */\nexport interface OfflineExampleResult {\n exampleId: string;\n data: Record<string, unknown>;\n scorers: OfflineScorerData[];\n /** The offline trace produced by the agent entrypoint (agent testing only). */\n agentOfflineTraceId?: string;\n}\n\n/** The outcome of an offline test run, returned by `client.offlineTests.run()`. */\nexport interface OfflineTestResult {\n /** The test run id. */\n testRunId: string;\n /** Final run status. */\n status: string;\n /** Link to the results page in the dashboard. */\n uiResultsUrl?: string;\n /** One entry per dataset example, with per-judge scorer rows. */\n results: OfflineExampleResult[];\n /** Mapping of example id to the agent's offline trace (agent testing only). */\n agentOfflineTraceIds: Record<string, string>;\n /** Whether every row passed its pass condition; `null` when none was evaluated. */\n passed: boolean | null;\n}\n\n/**\n * An agent entrypoint. Called once per dataset example with the example's data\n * fields as a single object — read the fields you need (e.g. `fields.input`).\n * Each call is wrapped in an `OfflineTracer` and its offline trace is\n * attributed to the result row.\n */\nexport type AgentFunction = (\n fields: Record<string, unknown>,\n) => unknown | Promise<unknown>;\n\n/**\n * A pass-condition callback evaluated per example row; its boolean outcome is\n * stored as the row's `success`.\n */\nexport type PassConditionFn = (\n dataFields: Record<string, unknown>,\n scorers: OfflineScorerData[],\n) => boolean;\n\n/** Whether every evaluated pass-condition passed; `null` when none was evaluated. */\nexport function computePassed(results: OfflineExampleResult[]): boolean | null {\n const successes: boolean[] = [];\n for (const result of results) {\n for (const scorer of result.scorers) {\n if (scorer.success !== null && scorer.success !== undefined) {\n successes.push(scorer.success);\n }\n }\n }\n if (successes.length === 0) return null;\n return successes.every((s) => s);\n}\n",
62
+ "import pc from \"picocolors\";\nimport type {\n JudgeVersionPin,\n OfflineExampleResult,\n OfflineScorerData,\n OfflineTestResult,\n PassConditionFn,\n} from \"./types\";\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nexport function asArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nexport function asString(value: unknown): string {\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction binaryLabel(value: boolean): string {\n return value ? \"Yes\" : \"No\";\n}\n\n/** Extract a scorer's display value: \"Yes\"/\"No\" for binary, the string for\n * categorical, the number for numeric. */\nexport function scorerValue(\n scorer: Record<string, unknown>,\n): string | number | null {\n const scoreType = scorer.score_type;\n const bool = scorer.bool_value;\n const str = scorer.str_value;\n const num = scorer.num_value;\n if (scoreType === \"binary\") {\n return typeof bool === \"boolean\" ? binaryLabel(bool) : null;\n }\n if (scoreType === \"categorical\") {\n return typeof str === \"string\" ? str : null;\n }\n if (scoreType === \"numeric\") {\n return typeof num === \"number\" ? num : null;\n }\n if (typeof bool === \"boolean\") return binaryLabel(bool);\n if (typeof str === \"string\") return str;\n if (typeof num === \"number\") return num;\n return null;\n}\n\nfunction reasonText(raw: unknown): string | null {\n if (typeof raw === \"object\" && raw !== null) {\n const text = (raw as Record<string, unknown>).text;\n return typeof text === \"string\" && text ? text : null;\n }\n if (typeof raw === \"string\") {\n try {\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed === \"object\" && parsed !== null) {\n const text = (parsed as Record<string, unknown>).text;\n if (typeof text === \"string\") return text || null;\n }\n } catch {\n // not JSON; fall through to the raw string\n }\n return raw || null;\n }\n return null;\n}\n\n/** Validate `judgeVersions` and normalize each pin to the server's snake_case shape. */\nexport function normalizeJudgeVersions(\n pins?: JudgeVersionPin[],\n): Record<string, unknown>[] | undefined {\n if (!pins || pins.length === 0) return undefined;\n const out: Record<string, unknown>[] = [];\n for (const pin of pins) {\n if (!pin.name && !pin.judgeId) {\n throw new Error(\n \"judgeVersions entries require a 'name' (or 'judgeId') key\",\n );\n }\n const entry: Record<string, unknown> = {};\n if (pin.judgeId !== undefined) entry.judge_id = pin.judgeId;\n if (pin.name !== undefined) entry.name = pin.name;\n if (pin.tag !== undefined) entry.tag = pin.tag;\n if (pin.version !== undefined) entry.version = pin.version;\n if (pin.majorVersion !== undefined) entry.major_version = pin.majorVersion;\n if (pin.minorVersion !== undefined) entry.minor_version = pin.minorVersion;\n out.push(entry);\n }\n return out;\n}\n\n/** Turn raw test-run item rows into per-example results, applying the optional\n * pass condition to each row (its outcome is stored as every scorer's success). */\nexport function buildResults(\n items: Record<string, unknown>[],\n agentTraces: Record<string, string>,\n passConditionFn?: PassConditionFn,\n): OfflineExampleResult[] {\n const results: OfflineExampleResult[] = [];\n for (const item of items) {\n const exampleId = asString(item.example_id);\n const data = asRecord(item.data);\n\n const scorers: OfflineScorerData[] = [];\n for (const raw of asArray(item.scorers)) {\n const scorer = asRecord(raw);\n const metadata: Record<string, unknown> = {\n judge_id: scorer.judge_id,\n judge_major_version: scorer.judge_major_version,\n judge_minor_version: scorer.judge_minor_version,\n };\n const reason = reasonText(scorer.reason);\n if (reason) metadata.reason = reason;\n scorers.push({\n name: asString(scorer.judge_name),\n value: scorerValue(scorer),\n scoreType:\n typeof scorer.score_type === \"string\" ? scorer.score_type : null,\n error: typeof scorer.error === \"string\" ? scorer.error : null,\n success: typeof scorer.success === \"boolean\" ? scorer.success : null,\n metadata,\n });\n }\n\n if (passConditionFn) {\n const passed = Boolean(passConditionFn({ ...data }, scorers));\n for (const scorer of scorers) scorer.success = passed;\n }\n\n results.push({\n exampleId,\n data,\n scorers,\n agentOfflineTraceId: agentTraces[exampleId],\n });\n }\n return results;\n}\n\n/** Throw if the run did not complete or any example failed its pass condition. */\nexport function assertAllPassed(outcome: OfflineTestResult): void {\n if (outcome.status !== \"completed\") {\n throw new Error(\n `Test run ${outcome.testRunId} finished with status '${outcome.status}'`,\n );\n }\n const failed = outcome.results\n .filter((result) =>\n result.scorers.some((scorer) => scorer.success === false),\n )\n .map((result) => result.exampleId);\n if (failed.length > 0 || outcome.passed !== true) {\n throw new Error(\n `Test run ${outcome.testRunId} failed its pass condition for ${failed.length} example(s): ${JSON.stringify(failed)}`,\n );\n }\n}\n\n/** Print a header for a starting run. */\nexport function displayStart(\n configName: string,\n projectName: string,\n exampleCount: number,\n): void {\n console.log();\n console.log(pc.bold(pc.cyan(\"Starting Offline Test\")));\n console.log(`${pc.dim(\"Config:\")} ${configName}`);\n console.log(`${pc.dim(\"Project:\")} ${projectName}`);\n console.log(`${pc.dim(\"Examples:\")} ${exampleCount}`);\n console.log();\n}\n\n/** Print per-example results and the results link. */\nexport function displayResults(\n results: OfflineExampleResult[],\n uiResultsUrl: string | undefined,\n): void {\n console.log();\n results.forEach((result, i) => {\n const hasVerdict = result.scorers.some(\n (s) => s.success !== null && s.success !== undefined,\n );\n if (hasVerdict) {\n const passed = result.scorers.every((s) => s.success === true);\n console.log(\n passed\n ? `${pc.green(\"✓\")} Example ${i + 1}: ${pc.green(\"PASSED\")}`\n : `${pc.red(\"✗\")} Example ${i + 1}: ${pc.red(\"FAILED\")}`,\n );\n } else {\n console.log(`${pc.cyan(\"•\")} Example ${i + 1}:`);\n }\n for (const s of result.scorers) {\n if (s.error) {\n console.log(` ${pc.dim(`${s.name}:`)} ${pc.red(`error: ${s.error}`)}`);\n continue;\n }\n const valueStr = s.value === null ? \"N/A\" : String(s.value);\n const colored =\n s.success === true\n ? pc.green(valueStr)\n : s.success === false\n ? pc.red(valueStr)\n : valueStr;\n console.log(` ${pc.dim(`${s.name}:`)} ${colored}`);\n }\n });\n console.log();\n if (uiResultsUrl) {\n console.log(\n `${pc.dim(\"View full details:\")} ${pc.underline(uiResultsUrl)}`,\n );\n console.log();\n }\n}\n",
63
+ "export {\n BaseTracer,\n type AsyncEvaluateOptions,\n type LLMMetadata,\n type ObserveOptions,\n type TracerConfig,\n} from \"./BaseTracer\";\nexport { JudgmentSpanExporter } from \"./exporters/JudgmentSpanExporter\";\nexport { NoOpSpanExporter } from \"./exporters/NoOpSpanExporter\";\nexport { JudgmentTracerProvider } from \"./JudgmentTracerProvider\";\nexport { JudgmentSpanProcessor } from \"./processors/JudgmentSpanProcessor\";\nexport { NoOpSpanProcessor } from \"./processors/NoOpSpanProcessor\";\nexport { OfflineJudgmentSpanProcessor } from \"./processors/OfflineJudgmentSpanProcessor\";\nexport {\n ALLOW_ALL_BAGGAGE_KEYS,\n JudgmentBaggageSpanProcessor,\n type BaggageKeyPredicate,\n} from \"./processors/JudgmentBaggageSpanProcessor\";\nexport { JudgmentBaggagePropagator } from \"./baggage/JudgmentBaggagePropagator\";\nexport * as baggage from \"./baggage\";\nexport * as propagation from \"./propagation\";\nexport { Tracer } from \"./Tracer\";\nexport { OfflineTracer, type OfflineTracerConfig } from \"./OfflineTracer\";\n",
64
+ "export {\n Judgeval,\n type JudgevalConfig,\n type JudgevalOfflineTracerOptions,\n} from \"./Judgeval\";\n\nexport {\n BaseTracer,\n JudgmentBaggagePropagator,\n JudgmentBaggageSpanProcessor,\n JudgmentSpanExporter,\n JudgmentTracerProvider,\n Tracer,\n OfflineTracer,\n type OfflineTracerConfig,\n NoOpSpanExporter,\n NoOpSpanProcessor,\n OfflineJudgmentSpanProcessor,\n ALLOW_ALL_BAGGAGE_KEYS,\n type BaggageKeyPredicate,\n baggage,\n propagation,\n} from \"./trace\";\n\nexport { wrap, wrapOpenAI } from \"./instrumentation\";\n\nexport { Example } from \"./data\";\nexport type { ScoringResult } from \"./data\";\n\nexport { Judge } from \"./judges\";\nexport type {\n BinaryResponse,\n NumericResponse,\n CategoricalResponse,\n ScorerResponse,\n Citation,\n} from \"./judges\";\n\nexport { Evaluation, type EvaluationRunOptions } from \"./evaluation\";\n\nexport { Dataset } from \"./datasets\";\nexport type { DatasetInfo } from \"./internal/api/models/DatasetInfo\";\nexport type { ExperimentScorer } from \"./internal/api/models/ExperimentScorer\";\nexport {\n validateDatasetSchema,\n inferSchemaFromExamples,\n type DatasetSchema,\n type DatasetSchemaProperty,\n type DatasetColumnType,\n} from \"./datasets/schema\";\n\nexport { AgentJudgeFactory } from \"./agent-judges\";\nexport type { AgentJudge, ScoreType } from \"./agent-judges\";\n\nexport {\n OfflineTestsFactory,\n OfflineTestRunner,\n type JudgeRef,\n type OfflineRunOptions,\n type TestConfig,\n type JudgeVersionPin,\n type OfflineScorerData,\n type OfflineExampleResult,\n type OfflineTestResult,\n type AgentFunction,\n type PassConditionFn,\n} from \"./offline-tests\";\n",
65
+ "export { Example, type ExampleDict } from \"./Example\";\nexport type { ScoringResult } from \"./ScoringResult\";\n"
66
+ ],
67
+ "mappings": "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",
68
+ "debugId": "FDFFE9AE8A0D021B64756E2164756E21",
69
+ "names": []
70
+ }