observability-toolkit 2.0.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +166 -398
- package/dist/__tests__/find-constant-dedup.test.d.ts +11 -0
- package/dist/__tests__/find-constant-dedup.test.d.ts.map +1 -0
- package/dist/__tests__/find-constant-dedup.test.js +132 -0
- package/dist/__tests__/find-constant-dedup.test.js.map +1 -0
- package/dist/backends/backend-schemas.d.ts +309 -0
- package/dist/backends/backend-schemas.d.ts.map +1 -0
- package/dist/backends/backend-schemas.js +215 -0
- package/dist/backends/backend-schemas.js.map +1 -0
- package/dist/backends/cloud.d.ts +46 -0
- package/dist/backends/cloud.d.ts.map +1 -0
- package/dist/backends/cloud.js +520 -0
- package/dist/backends/cloud.js.map +1 -0
- package/dist/backends/cloud.test.d.ts +2 -0
- package/dist/backends/cloud.test.d.ts.map +1 -0
- package/dist/backends/cloud.test.js +436 -0
- package/dist/backends/cloud.test.js.map +1 -0
- package/dist/backends/index.d.ts +659 -386
- package/dist/backends/index.d.ts.map +1 -1
- package/dist/backends/index.js +318 -41
- package/dist/backends/index.js.map +1 -1
- package/dist/backends/index.test.js +578 -57
- package/dist/backends/index.test.js.map +1 -1
- package/dist/backends/local-jsonl-boolean-search.test.js +8 -7
- package/dist/backends/local-jsonl-boolean-search.test.js.map +1 -1
- package/dist/backends/local-jsonl-cache.test.js +33 -31
- package/dist/backends/local-jsonl-cache.test.js.map +1 -1
- package/dist/backends/local-jsonl-circuit-breaker.test.js +9 -7
- package/dist/backends/local-jsonl-circuit-breaker.test.js.map +1 -1
- package/dist/backends/local-jsonl-export.test.js +73 -58
- package/dist/backends/local-jsonl-export.test.js.map +1 -1
- package/dist/backends/local-jsonl-index.test.js +52 -50
- package/dist/backends/local-jsonl-index.test.js.map +1 -1
- package/dist/backends/local-jsonl-logs.test.js +47 -31
- package/dist/backends/local-jsonl-logs.test.js.map +1 -1
- package/dist/backends/local-jsonl-metrics.test.js +85 -82
- package/dist/backends/local-jsonl-metrics.test.js.map +1 -1
- package/dist/backends/local-jsonl-otlp-unwrap.test.d.ts +2 -0
- package/dist/backends/local-jsonl-otlp-unwrap.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-otlp-unwrap.test.js +602 -0
- package/dist/backends/local-jsonl-otlp-unwrap.test.js.map +1 -0
- package/dist/backends/local-jsonl-traces.test.js +161 -147
- package/dist/backends/local-jsonl-traces.test.js.map +1 -1
- package/dist/backends/local-jsonl.d.ts +37 -8
- package/dist/backends/local-jsonl.d.ts.map +1 -1
- package/dist/backends/local-jsonl.js +1088 -241
- package/dist/backends/local-jsonl.js.map +1 -1
- package/dist/backends/shared.d.ts +9 -0
- package/dist/backends/shared.d.ts.map +1 -0
- package/dist/backends/shared.js +9 -0
- package/dist/backends/shared.js.map +1 -0
- package/dist/generated/opentelemetry/proto/collector/logs/v1/logs_service_pb.d.ts +40 -0
- package/dist/generated/opentelemetry/proto/collector/logs/v1/logs_service_pb.d.ts.map +1 -0
- package/dist/generated/opentelemetry/proto/collector/logs/v1/logs_service_pb.js +27 -0
- package/dist/generated/opentelemetry/proto/collector/logs/v1/logs_service_pb.js.map +1 -0
- package/dist/generated/opentelemetry/proto/collector/metrics/v1/metrics_service_pb.d.ts +106 -0
- package/dist/generated/opentelemetry/proto/collector/metrics/v1/metrics_service_pb.d.ts.map +1 -0
- package/dist/generated/opentelemetry/proto/collector/metrics/v1/metrics_service_pb.js +43 -0
- package/dist/generated/opentelemetry/proto/collector/metrics/v1/metrics_service_pb.js.map +1 -0
- package/dist/generated/opentelemetry/proto/collector/profiles/v1development/profiles_service_pb.d.ts +111 -0
- package/dist/generated/opentelemetry/proto/collector/profiles/v1development/profiles_service_pb.d.ts.map +1 -0
- package/dist/generated/opentelemetry/proto/collector/profiles/v1development/profiles_service_pb.js +42 -0
- package/dist/generated/opentelemetry/proto/collector/profiles/v1development/profiles_service_pb.js.map +1 -0
- package/dist/generated/opentelemetry/proto/collector/trace/v1/trace_service_pb.d.ts +106 -0
- package/dist/generated/opentelemetry/proto/collector/trace/v1/trace_service_pb.d.ts.map +1 -0
- package/dist/generated/opentelemetry/proto/collector/trace/v1/trace_service_pb.js +43 -0
- package/dist/generated/opentelemetry/proto/collector/trace/v1/trace_service_pb.js.map +1 -0
- package/dist/generated/opentelemetry/proto/common/v1/common_pb.d.ts +243 -0
- package/dist/generated/opentelemetry/proto/common/v1/common_pb.d.ts.map +1 -0
- package/dist/generated/opentelemetry/proto/common/v1/common_pb.js +49 -0
- package/dist/generated/opentelemetry/proto/common/v1/common_pb.js.map +1 -0
- package/dist/generated/opentelemetry/proto/logs/v1/logs_pb.d.ts +90 -0
- package/dist/generated/opentelemetry/proto/logs/v1/logs_pb.d.ts.map +1 -0
- package/dist/generated/opentelemetry/proto/logs/v1/logs_pb.js +66 -0
- package/dist/generated/opentelemetry/proto/logs/v1/logs_pb.js.map +1 -0
- package/dist/generated/opentelemetry/proto/metrics/v1/metrics_pb.d.ts +1134 -0
- package/dist/generated/opentelemetry/proto/metrics/v1/metrics_pb.d.ts.map +1 -0
- package/dist/generated/opentelemetry/proto/metrics/v1/metrics_pb.js +223 -0
- package/dist/generated/opentelemetry/proto/metrics/v1/metrics_pb.js.map +1 -0
- package/dist/generated/opentelemetry/proto/profiles/v1development/profiles_pb.d.ts +678 -0
- package/dist/generated/opentelemetry/proto/profiles/v1development/profiles_pb.d.ts.map +1 -0
- package/dist/generated/opentelemetry/proto/profiles/v1development/profiles_pb.js +107 -0
- package/dist/generated/opentelemetry/proto/profiles/v1development/profiles_pb.js.map +1 -0
- package/dist/generated/opentelemetry/proto/resource/v1/resource_pb.d.ts +46 -0
- package/dist/generated/opentelemetry/proto/resource/v1/resource_pb.d.ts.map +1 -0
- package/dist/generated/opentelemetry/proto/resource/v1/resource_pb.js +25 -0
- package/dist/generated/opentelemetry/proto/resource/v1/resource_pb.js.map +1 -0
- package/dist/generated/opentelemetry/proto/trace/v1/trace_pb.d.ts +569 -0
- package/dist/generated/opentelemetry/proto/trace/v1/trace_pb.d.ts.map +1 -0
- package/dist/generated/opentelemetry/proto/trace/v1/trace_pb.js +195 -0
- package/dist/generated/opentelemetry/proto/trace/v1/trace_pb.js.map +1 -0
- package/dist/lib/agent-judge/agent-as-judge.d.ts +157 -0
- package/dist/lib/agent-judge/agent-as-judge.d.ts.map +1 -0
- package/dist/lib/agent-judge/agent-as-judge.js +137 -0
- package/dist/lib/agent-judge/agent-as-judge.js.map +1 -0
- package/dist/lib/agent-judge/agent-as-judge.test.d.ts.map +1 -0
- package/dist/lib/agent-judge/agent-as-judge.test.js +839 -0
- package/dist/lib/agent-judge/agent-as-judge.test.js.map +1 -0
- package/dist/lib/agent-judge/agent-eval-metrics.d.ts +293 -0
- package/dist/lib/agent-judge/agent-eval-metrics.d.ts.map +1 -0
- package/dist/lib/agent-judge/agent-eval-metrics.js +715 -0
- package/dist/lib/agent-judge/agent-eval-metrics.js.map +1 -0
- package/dist/lib/agent-judge/agent-eval-metrics.test.d.ts +5 -0
- package/dist/lib/agent-judge/agent-eval-metrics.test.d.ts.map +1 -0
- package/dist/lib/agent-judge/agent-eval-metrics.test.js +676 -0
- package/dist/lib/agent-judge/agent-eval-metrics.test.js.map +1 -0
- package/dist/lib/agent-judge/agent-judge-classes.d.ts +95 -0
- package/dist/lib/agent-judge/agent-judge-classes.d.ts.map +1 -0
- package/dist/lib/agent-judge/agent-judge-classes.js +222 -0
- package/dist/lib/agent-judge/agent-judge-classes.js.map +1 -0
- package/dist/lib/agent-judge/agent-judge-classes.test.d.ts +6 -0
- package/dist/lib/agent-judge/agent-judge-classes.test.d.ts.map +1 -0
- package/dist/lib/agent-judge/agent-judge-classes.test.js +271 -0
- package/dist/lib/agent-judge/agent-judge-classes.test.js.map +1 -0
- package/dist/lib/agent-judge/agent-judge-consensus.d.ts +58 -0
- package/dist/lib/agent-judge/agent-judge-consensus.d.ts.map +1 -0
- package/dist/lib/agent-judge/agent-judge-consensus.js +149 -0
- package/dist/lib/agent-judge/agent-judge-consensus.js.map +1 -0
- package/dist/lib/agent-judge/agent-judge-consensus.test.d.ts +2 -0
- package/dist/lib/agent-judge/agent-judge-consensus.test.d.ts.map +1 -0
- package/dist/lib/agent-judge/agent-judge-consensus.test.js +170 -0
- package/dist/lib/agent-judge/agent-judge-consensus.test.js.map +1 -0
- package/dist/lib/agent-judge/agent-judge-verification.d.ts +89 -0
- package/dist/lib/agent-judge/agent-judge-verification.d.ts.map +1 -0
- package/dist/lib/agent-judge/agent-judge-verification.js +235 -0
- package/dist/lib/agent-judge/agent-judge-verification.js.map +1 -0
- package/dist/lib/agent-judge/agent-judge-verification.test.d.ts +5 -0
- package/dist/lib/agent-judge/agent-judge-verification.test.d.ts.map +1 -0
- package/dist/lib/agent-judge/agent-judge-verification.test.js +399 -0
- package/dist/lib/agent-judge/agent-judge-verification.test.js.map +1 -0
- package/dist/lib/audit/agent-auditor-scoring.d.ts +167 -0
- package/dist/lib/audit/agent-auditor-scoring.d.ts.map +1 -0
- package/dist/lib/audit/agent-auditor-scoring.js +338 -0
- package/dist/lib/audit/agent-auditor-scoring.js.map +1 -0
- package/dist/lib/audit/agent-auditor-scoring.test.d.ts +2 -0
- package/dist/lib/audit/agent-auditor-scoring.test.d.ts.map +1 -0
- package/dist/lib/audit/agent-auditor-scoring.test.js +576 -0
- package/dist/lib/audit/agent-auditor-scoring.test.js.map +1 -0
- package/dist/lib/audit/audit-record.d.ts +139 -0
- package/dist/lib/audit/audit-record.d.ts.map +1 -0
- package/dist/lib/audit/audit-record.js +288 -0
- package/dist/lib/audit/audit-record.js.map +1 -0
- package/dist/lib/audit/audit-record.test.d.ts +5 -0
- package/dist/lib/audit/audit-record.test.d.ts.map +1 -0
- package/dist/lib/audit/audit-record.test.js +258 -0
- package/dist/lib/audit/audit-record.test.js.map +1 -0
- package/dist/lib/audit/audit-scoring-constants.d.ts +57 -0
- package/dist/lib/audit/audit-scoring-constants.d.ts.map +1 -0
- package/dist/lib/audit/audit-scoring-constants.js +59 -0
- package/dist/lib/audit/audit-scoring-constants.js.map +1 -0
- package/dist/lib/audit/compliance-report.d.ts +125 -0
- package/dist/lib/audit/compliance-report.d.ts.map +1 -0
- package/dist/lib/audit/compliance-report.js +205 -0
- package/dist/lib/audit/compliance-report.js.map +1 -0
- package/dist/lib/audit/compliance-report.test.d.ts +5 -0
- package/dist/lib/audit/compliance-report.test.d.ts.map +1 -0
- package/dist/lib/audit/compliance-report.test.js +290 -0
- package/dist/lib/audit/compliance-report.test.js.map +1 -0
- package/dist/lib/audit/retention-guard.d.ts +41 -0
- package/dist/lib/audit/retention-guard.d.ts.map +1 -0
- package/dist/lib/audit/retention-guard.js +103 -0
- package/dist/lib/audit/retention-guard.js.map +1 -0
- package/dist/lib/audit/retention-guard.test.d.ts +5 -0
- package/dist/lib/audit/retention-guard.test.d.ts.map +1 -0
- package/dist/lib/audit/retention-guard.test.js +109 -0
- package/dist/lib/audit/retention-guard.test.js.map +1 -0
- package/dist/lib/audit/skill-auditor-scoring.d.ts +69 -0
- package/dist/lib/audit/skill-auditor-scoring.d.ts.map +1 -0
- package/dist/lib/audit/skill-auditor-scoring.js +149 -0
- package/dist/lib/audit/skill-auditor-scoring.js.map +1 -0
- package/dist/lib/audit/skill-auditor-scoring.test.d.ts +2 -0
- package/dist/lib/audit/skill-auditor-scoring.test.d.ts.map +1 -0
- package/dist/lib/audit/skill-auditor-scoring.test.js +369 -0
- package/dist/lib/audit/skill-auditor-scoring.test.js.map +1 -0
- package/dist/lib/audit/verification-events.d.ts +119 -0
- package/dist/lib/audit/verification-events.d.ts.map +1 -0
- package/dist/lib/audit/verification-events.js +175 -0
- package/dist/lib/audit/verification-events.js.map +1 -0
- package/dist/lib/audit/verification-events.test.d.ts.map +1 -0
- package/dist/lib/audit/verification-events.test.js +197 -0
- package/dist/lib/audit/verification-events.test.js.map +1 -0
- package/dist/lib/core/constants-models.d.ts +90 -0
- package/dist/lib/core/constants-models.d.ts.map +1 -0
- package/dist/lib/core/constants-models.js +208 -0
- package/dist/lib/core/constants-models.js.map +1 -0
- package/dist/lib/core/constants-otel.d.ts +68 -0
- package/dist/lib/core/constants-otel.d.ts.map +1 -0
- package/dist/lib/core/constants-otel.js +128 -0
- package/dist/lib/core/constants-otel.js.map +1 -0
- package/dist/lib/core/constants-symlink.test.d.ts.map +1 -0
- package/dist/lib/core/constants-symlink.test.js +358 -0
- package/dist/lib/core/constants-symlink.test.js.map +1 -0
- package/dist/lib/core/constants-telemetry.d.ts +21 -0
- package/dist/lib/core/constants-telemetry.d.ts.map +1 -0
- package/dist/lib/core/constants-telemetry.js +162 -0
- package/dist/lib/core/constants-telemetry.js.map +1 -0
- package/dist/lib/core/constants.d.ts +152 -0
- package/dist/lib/core/constants.d.ts.map +1 -0
- package/dist/lib/core/constants.js +223 -0
- package/dist/lib/core/constants.js.map +1 -0
- package/dist/lib/core/constants.test.d.ts.map +1 -0
- package/dist/lib/core/constants.test.js +833 -0
- package/dist/lib/core/constants.test.js.map +1 -0
- package/dist/lib/core/doc-sync.test.d.ts +9 -0
- package/dist/lib/core/doc-sync.test.d.ts.map +1 -0
- package/dist/lib/core/doc-sync.test.js +159 -0
- package/dist/lib/core/doc-sync.test.js.map +1 -0
- package/dist/lib/core/edge-cases.test.d.ts.map +1 -0
- package/dist/lib/core/edge-cases.test.js +637 -0
- package/dist/lib/core/edge-cases.test.js.map +1 -0
- package/dist/lib/core/file-utils.d.ts +360 -0
- package/dist/lib/core/file-utils.d.ts.map +1 -0
- package/dist/lib/core/file-utils.js +890 -0
- package/dist/lib/core/file-utils.js.map +1 -0
- package/dist/lib/core/file-utils.test-constants.d.ts +38 -0
- package/dist/lib/core/file-utils.test-constants.d.ts.map +1 -0
- package/dist/lib/core/file-utils.test-constants.js +40 -0
- package/dist/lib/core/file-utils.test-constants.js.map +1 -0
- package/dist/lib/core/file-utils.test.d.ts.map +1 -0
- package/dist/lib/core/file-utils.test.js +1329 -0
- package/dist/lib/core/file-utils.test.js.map +1 -0
- package/dist/lib/core/input-validator.d.ts +125 -0
- package/dist/lib/core/input-validator.d.ts.map +1 -0
- package/dist/lib/core/input-validator.fuzz.test.d.ts.map +1 -0
- package/dist/lib/core/input-validator.fuzz.test.js +302 -0
- package/dist/lib/core/input-validator.fuzz.test.js.map +1 -0
- package/dist/lib/core/input-validator.js +348 -0
- package/dist/lib/core/input-validator.js.map +1 -0
- package/dist/lib/core/input-validator.test.d.ts.map +1 -0
- package/dist/lib/core/input-validator.test.js +465 -0
- package/dist/lib/core/input-validator.test.js.map +1 -0
- package/dist/lib/core/logger.d.ts +32 -0
- package/dist/lib/core/logger.d.ts.map +1 -0
- package/dist/lib/core/logger.js +104 -0
- package/dist/lib/core/logger.js.map +1 -0
- package/dist/lib/core/logger.test.d.ts.map +1 -0
- package/dist/lib/core/logger.test.js.map +1 -0
- package/dist/lib/core/schema-types.d.ts +37 -0
- package/dist/lib/core/schema-types.d.ts.map +1 -0
- package/dist/lib/core/schema-types.js +29 -0
- package/dist/lib/core/schema-types.js.map +1 -0
- package/dist/lib/core/server-utils.d.ts +98 -0
- package/dist/lib/core/server-utils.d.ts.map +1 -0
- package/dist/lib/core/server-utils.js +193 -0
- package/dist/lib/core/server-utils.js.map +1 -0
- package/dist/lib/core/shared-schemas.d.ts +301 -0
- package/dist/lib/core/shared-schemas.d.ts.map +1 -0
- package/dist/lib/core/shared-schemas.js +222 -0
- package/dist/lib/core/shared-schemas.js.map +1 -0
- package/dist/lib/core/shared-schemas.test.d.ts.map +1 -0
- package/dist/lib/core/shared-schemas.test.js +136 -0
- package/dist/lib/core/shared-schemas.test.js.map +1 -0
- package/dist/lib/core/units.d.ts +67 -0
- package/dist/lib/core/units.d.ts.map +1 -0
- package/dist/lib/core/units.js +88 -0
- package/dist/lib/core/units.js.map +1 -0
- package/dist/lib/cost/cost-estimation.d.ts +264 -0
- package/dist/lib/cost/cost-estimation.d.ts.map +1 -0
- package/dist/lib/cost/cost-estimation.js +541 -0
- package/dist/lib/cost/cost-estimation.js.map +1 -0
- package/dist/lib/cost/cost-estimation.test.d.ts +5 -0
- package/dist/lib/cost/cost-estimation.test.d.ts.map +1 -0
- package/dist/lib/cost/cost-estimation.test.js +701 -0
- package/dist/lib/cost/cost-estimation.test.js.map +1 -0
- package/dist/lib/cost/pricing-cache.d.ts +59 -0
- package/dist/lib/cost/pricing-cache.d.ts.map +1 -0
- package/dist/lib/cost/pricing-cache.js +120 -0
- package/dist/lib/cost/pricing-cache.js.map +1 -0
- package/dist/lib/cost/pricing-cache.test.d.ts +5 -0
- package/dist/lib/cost/pricing-cache.test.d.ts.map +1 -0
- package/dist/lib/cost/pricing-cache.test.js +176 -0
- package/dist/lib/cost/pricing-cache.test.js.map +1 -0
- package/dist/lib/dashboard-file-utils.d.ts +35 -0
- package/dist/lib/dashboard-file-utils.d.ts.map +1 -0
- package/dist/lib/dashboard-file-utils.js +94 -0
- package/dist/lib/dashboard-file-utils.js.map +1 -0
- package/dist/lib/errors/error-sanitizer.d.ts +62 -0
- package/dist/lib/errors/error-sanitizer.d.ts.map +1 -0
- package/dist/lib/errors/error-sanitizer.js +235 -0
- package/dist/lib/errors/error-sanitizer.js.map +1 -0
- package/dist/lib/errors/error-sanitizer.test.d.ts.map +1 -0
- package/dist/lib/errors/error-sanitizer.test.js +534 -0
- package/dist/lib/errors/error-sanitizer.test.js.map +1 -0
- package/dist/lib/errors/error-types.d.ts +59 -0
- package/dist/lib/errors/error-types.d.ts.map +1 -0
- package/dist/lib/errors/error-types.js +187 -0
- package/dist/lib/errors/error-types.js.map +1 -0
- package/dist/lib/errors/error-types.test.d.ts.map +1 -0
- package/dist/lib/errors/error-types.test.js +246 -0
- package/dist/lib/errors/error-types.test.js.map +1 -0
- package/dist/lib/errors/query-sanitizer.d.ts.map +1 -0
- package/dist/lib/errors/query-sanitizer.js +269 -0
- package/dist/lib/errors/query-sanitizer.js.map +1 -0
- package/dist/lib/errors/query-sanitizer.test.d.ts.map +1 -0
- package/dist/lib/errors/query-sanitizer.test.js +403 -0
- package/dist/lib/errors/query-sanitizer.test.js.map +1 -0
- package/dist/lib/exports/confident-export.d.ts +105 -0
- package/dist/lib/exports/confident-export.d.ts.map +1 -0
- package/dist/lib/exports/confident-export.js +385 -0
- package/dist/lib/exports/confident-export.js.map +1 -0
- package/dist/lib/exports/confident-export.test.d.ts.map +1 -0
- package/dist/lib/exports/confident-export.test.js +848 -0
- package/dist/lib/exports/confident-export.test.js.map +1 -0
- package/dist/lib/exports/datadog-export.d.ts +200 -0
- package/dist/lib/exports/datadog-export.d.ts.map +1 -0
- package/dist/lib/exports/datadog-export.js +488 -0
- package/dist/lib/exports/datadog-export.js.map +1 -0
- package/dist/lib/exports/datadog-export.test.d.ts +2 -0
- package/dist/lib/exports/datadog-export.test.d.ts.map +1 -0
- package/dist/lib/exports/datadog-export.test.js +890 -0
- package/dist/lib/exports/datadog-export.test.js.map +1 -0
- package/dist/lib/exports/export-config-schemas.d.ts +67 -0
- package/dist/lib/exports/export-config-schemas.d.ts.map +1 -0
- package/dist/lib/exports/export-config-schemas.js +120 -0
- package/dist/lib/exports/export-config-schemas.js.map +1 -0
- package/dist/lib/exports/export-config-schemas.test.d.ts +8 -0
- package/dist/lib/exports/export-config-schemas.test.d.ts.map +1 -0
- package/dist/lib/exports/export-config-schemas.test.js +503 -0
- package/dist/lib/exports/export-config-schemas.test.js.map +1 -0
- package/dist/lib/exports/export-utils.d.ts +127 -0
- package/dist/lib/exports/export-utils.d.ts.map +1 -0
- package/dist/lib/exports/export-utils.js +303 -0
- package/dist/lib/exports/export-utils.js.map +1 -0
- package/dist/lib/exports/export-utils.test.d.ts.map +1 -0
- package/dist/lib/exports/export-utils.test.js +344 -0
- package/dist/lib/exports/export-utils.test.js.map +1 -0
- package/dist/lib/exports/langfuse-export.d.ts +129 -0
- package/dist/lib/exports/langfuse-export.d.ts.map +1 -0
- package/dist/lib/exports/langfuse-export.js +370 -0
- package/dist/lib/exports/langfuse-export.js.map +1 -0
- package/dist/lib/exports/langfuse-export.test.d.ts.map +1 -0
- package/dist/lib/exports/langfuse-export.test.js +1020 -0
- package/dist/lib/exports/langfuse-export.test.js.map +1 -0
- package/dist/lib/exports/otlp-export.d.ts +179 -0
- package/dist/lib/exports/otlp-export.d.ts.map +1 -0
- package/dist/lib/exports/otlp-export.js +397 -0
- package/dist/lib/exports/otlp-export.js.map +1 -0
- package/dist/lib/exports/otlp-format-converter.d.ts +70 -0
- package/dist/lib/exports/otlp-format-converter.d.ts.map +1 -0
- package/dist/lib/exports/otlp-format-converter.js +401 -0
- package/dist/lib/exports/otlp-format-converter.js.map +1 -0
- package/dist/lib/exports/otlp-proto-encode.d.ts +53 -0
- package/dist/lib/exports/otlp-proto-encode.d.ts.map +1 -0
- package/dist/lib/exports/otlp-proto-encode.js +165 -0
- package/dist/lib/exports/otlp-proto-encode.js.map +1 -0
- package/dist/lib/exports/otlp-proto-encode.test.d.ts +7 -0
- package/dist/lib/exports/otlp-proto-encode.test.d.ts.map +1 -0
- package/dist/lib/exports/otlp-proto-encode.test.js +997 -0
- package/dist/lib/exports/otlp-proto-encode.test.js.map +1 -0
- package/dist/lib/exports/phoenix-export.d.ts +119 -0
- package/dist/lib/exports/phoenix-export.d.ts.map +1 -0
- package/dist/lib/exports/phoenix-export.js +448 -0
- package/dist/lib/exports/phoenix-export.js.map +1 -0
- package/dist/lib/exports/phoenix-export.test.d.ts.map +1 -0
- package/dist/lib/exports/phoenix-export.test.js +816 -0
- package/dist/lib/exports/phoenix-export.test.js.map +1 -0
- package/dist/lib/index.d.ts +16 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +31 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/judge/evaluation-hooks-schemas.d.ts +186 -0
- package/dist/lib/judge/evaluation-hooks-schemas.d.ts.map +1 -0
- package/dist/lib/judge/evaluation-hooks-schemas.js +125 -0
- package/dist/lib/judge/evaluation-hooks-schemas.js.map +1 -0
- package/dist/lib/judge/evaluation-hooks.d.ts +88 -0
- package/dist/lib/judge/evaluation-hooks.d.ts.map +1 -0
- package/dist/lib/judge/evaluation-hooks.js +658 -0
- package/dist/lib/judge/evaluation-hooks.js.map +1 -0
- package/dist/lib/judge/evaluation-hooks.test.d.ts.map +1 -0
- package/dist/lib/judge/evaluation-hooks.test.js +934 -0
- package/dist/lib/judge/evaluation-hooks.test.js.map +1 -0
- package/dist/lib/judge/llm-as-judge.d.ts +138 -0
- package/dist/lib/judge/llm-as-judge.d.ts.map +1 -0
- package/dist/lib/judge/llm-as-judge.js +103 -0
- package/dist/lib/judge/llm-as-judge.js.map +1 -0
- package/dist/lib/judge/llm-as-judge.test.d.ts.map +1 -0
- package/dist/lib/judge/llm-as-judge.test.js +2179 -0
- package/dist/lib/judge/llm-as-judge.test.js.map +1 -0
- package/dist/lib/judge/llm-judge-bias.d.ts +44 -0
- package/dist/lib/judge/llm-judge-bias.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-bias.js +130 -0
- package/dist/lib/judge/llm-judge-bias.js.map +1 -0
- package/dist/lib/judge/llm-judge-bias.test.d.ts +2 -0
- package/dist/lib/judge/llm-judge-bias.test.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-bias.test.js +380 -0
- package/dist/lib/judge/llm-judge-bias.test.js.map +1 -0
- package/dist/lib/judge/llm-judge-code.d.ts +99 -0
- package/dist/lib/judge/llm-judge-code.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-code.js +261 -0
- package/dist/lib/judge/llm-judge-code.js.map +1 -0
- package/dist/lib/judge/llm-judge-code.test.d.ts +2 -0
- package/dist/lib/judge/llm-judge-code.test.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-code.test.js +981 -0
- package/dist/lib/judge/llm-judge-code.test.js.map +1 -0
- package/dist/lib/judge/llm-judge-config.d.ts +241 -0
- package/dist/lib/judge/llm-judge-config.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-config.js +390 -0
- package/dist/lib/judge/llm-judge-config.js.map +1 -0
- package/dist/lib/judge/llm-judge-config.test.d.ts +5 -0
- package/dist/lib/judge/llm-judge-config.test.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-config.test.js +392 -0
- package/dist/lib/judge/llm-judge-config.test.js.map +1 -0
- package/dist/lib/judge/llm-judge-constants.d.ts +111 -0
- package/dist/lib/judge/llm-judge-constants.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-constants.js +150 -0
- package/dist/lib/judge/llm-judge-constants.js.map +1 -0
- package/dist/lib/judge/llm-judge-dag.d.ts +57 -0
- package/dist/lib/judge/llm-judge-dag.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-dag.js +217 -0
- package/dist/lib/judge/llm-judge-dag.js.map +1 -0
- package/dist/lib/judge/llm-judge-dag.test.d.ts +8 -0
- package/dist/lib/judge/llm-judge-dag.test.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-dag.test.js +973 -0
- package/dist/lib/judge/llm-judge-dag.test.js.map +1 -0
- package/dist/lib/judge/llm-judge-domain.d.ts +42 -0
- package/dist/lib/judge/llm-judge-domain.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-domain.js +167 -0
- package/dist/lib/judge/llm-judge-domain.js.map +1 -0
- package/dist/lib/judge/llm-judge-domain.test.d.ts +6 -0
- package/dist/lib/judge/llm-judge-domain.test.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-domain.test.js +337 -0
- package/dist/lib/judge/llm-judge-domain.test.js.map +1 -0
- package/dist/lib/judge/llm-judge-geval.d.ts +42 -0
- package/dist/lib/judge/llm-judge-geval.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-geval.js +213 -0
- package/dist/lib/judge/llm-judge-geval.js.map +1 -0
- package/dist/lib/judge/llm-judge-geval.test.d.ts +2 -0
- package/dist/lib/judge/llm-judge-geval.test.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-geval.test.js +556 -0
- package/dist/lib/judge/llm-judge-geval.test.js.map +1 -0
- package/dist/lib/judge/llm-judge-otel.test.d.ts +9 -0
- package/dist/lib/judge/llm-judge-otel.test.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-otel.test.js +91 -0
- package/dist/lib/judge/llm-judge-otel.test.js.map +1 -0
- package/dist/lib/judge/llm-judge-qag.d.ts +38 -0
- package/dist/lib/judge/llm-judge-qag.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-qag.js +205 -0
- package/dist/lib/judge/llm-judge-qag.js.map +1 -0
- package/dist/lib/judge/llm-judge-qag.test.d.ts +2 -0
- package/dist/lib/judge/llm-judge-qag.test.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-qag.test.js +386 -0
- package/dist/lib/judge/llm-judge-qag.test.js.map +1 -0
- package/dist/lib/judge/llm-judge-resilience.d.ts +74 -0
- package/dist/lib/judge/llm-judge-resilience.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-resilience.js +146 -0
- package/dist/lib/judge/llm-judge-resilience.js.map +1 -0
- package/dist/lib/judge/llm-judge-resilience.test.d.ts +2 -0
- package/dist/lib/judge/llm-judge-resilience.test.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-resilience.test.js +353 -0
- package/dist/lib/judge/llm-judge-resilience.test.js.map +1 -0
- package/dist/lib/judge/llm-judge-security.d.ts +106 -0
- package/dist/lib/judge/llm-judge-security.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-security.js +314 -0
- package/dist/lib/judge/llm-judge-security.js.map +1 -0
- package/dist/lib/judge/llm-judge-security.test.d.ts +2 -0
- package/dist/lib/judge/llm-judge-security.test.d.ts.map +1 -0
- package/dist/lib/judge/llm-judge-security.test.js +1011 -0
- package/dist/lib/judge/llm-judge-security.test.js.map +1 -0
- package/dist/lib/observability/context-accumulator.d.ts +32 -0
- package/dist/lib/observability/context-accumulator.d.ts.map +1 -0
- package/dist/lib/observability/context-accumulator.js +87 -0
- package/dist/lib/observability/context-accumulator.js.map +1 -0
- package/dist/lib/observability/evaluation-events.d.ts +35 -0
- package/dist/lib/observability/evaluation-events.d.ts.map +1 -0
- package/dist/lib/observability/evaluation-events.js +90 -0
- package/dist/lib/observability/evaluation-events.js.map +1 -0
- package/dist/lib/observability/file-span-exporter.d.ts +17 -0
- package/dist/lib/observability/file-span-exporter.d.ts.map +1 -0
- package/dist/lib/observability/file-span-exporter.js +49 -0
- package/dist/lib/observability/file-span-exporter.js.map +1 -0
- package/dist/lib/observability/histogram-bucket-constants.d.ts +25 -0
- package/dist/lib/observability/histogram-bucket-constants.d.ts.map +1 -0
- package/dist/lib/observability/histogram-bucket-constants.js +60 -0
- package/dist/lib/observability/histogram-bucket-constants.js.map +1 -0
- package/dist/lib/observability/histogram.d.ts +112 -0
- package/dist/lib/observability/histogram.d.ts.map +1 -0
- package/dist/lib/observability/histogram.js +170 -0
- package/dist/lib/observability/histogram.js.map +1 -0
- package/dist/lib/observability/histogram.test.d.ts.map +1 -0
- package/dist/lib/observability/histogram.test.js +385 -0
- package/dist/lib/observability/histogram.test.js.map +1 -0
- package/dist/lib/observability/indexer.d.ts +114 -0
- package/dist/lib/observability/indexer.d.ts.map +1 -0
- package/dist/lib/observability/indexer.js +402 -0
- package/dist/lib/observability/indexer.js.map +1 -0
- package/dist/lib/observability/indexer.test.d.ts.map +1 -0
- package/dist/lib/observability/indexer.test.js +713 -0
- package/dist/lib/observability/indexer.test.js.map +1 -0
- package/dist/lib/observability/instrumentation-eval.test.d.ts +5 -0
- package/dist/lib/observability/instrumentation-eval.test.d.ts.map +1 -0
- package/dist/lib/observability/instrumentation-eval.test.js +63 -0
- package/dist/lib/observability/instrumentation-eval.test.js.map +1 -0
- package/dist/lib/observability/instrumentation-init-errors.test.d.ts +13 -0
- package/dist/lib/observability/instrumentation-init-errors.test.d.ts.map +1 -0
- package/dist/lib/observability/instrumentation-init-errors.test.js +194 -0
- package/dist/lib/observability/instrumentation-init-errors.test.js.map +1 -0
- package/dist/lib/observability/instrumentation-retry-timeout.test.d.ts +15 -0
- package/dist/lib/observability/instrumentation-retry-timeout.test.d.ts.map +1 -0
- package/dist/lib/observability/instrumentation-retry-timeout.test.js +188 -0
- package/dist/lib/observability/instrumentation-retry-timeout.test.js.map +1 -0
- package/dist/lib/observability/instrumentation-set-otel.test.d.ts +5 -0
- package/dist/lib/observability/instrumentation-set-otel.test.d.ts.map +1 -0
- package/dist/lib/observability/instrumentation-set-otel.test.js +59 -0
- package/dist/lib/observability/instrumentation-set-otel.test.js.map +1 -0
- package/dist/lib/observability/instrumentation.d.ts +158 -0
- package/dist/lib/observability/instrumentation.d.ts.map +1 -0
- package/dist/lib/observability/instrumentation.integration.test.d.ts.map +1 -0
- package/dist/lib/observability/instrumentation.integration.test.js +590 -0
- package/dist/lib/observability/instrumentation.integration.test.js.map +1 -0
- package/dist/lib/observability/instrumentation.js +512 -0
- package/dist/lib/observability/instrumentation.js.map +1 -0
- package/dist/lib/observability/instrumentation.test.d.ts.map +1 -0
- package/dist/lib/observability/instrumentation.test.js +822 -0
- package/dist/lib/observability/instrumentation.test.js.map +1 -0
- package/dist/lib/observability/mcp-semconv-constants.d.ts +98 -0
- package/dist/lib/observability/mcp-semconv-constants.d.ts.map +1 -0
- package/dist/lib/observability/mcp-semconv-constants.js +102 -0
- package/dist/lib/observability/mcp-semconv-constants.js.map +1 -0
- package/dist/lib/observability/mcp-semconv.d.ts +37 -0
- package/dist/lib/observability/mcp-semconv.d.ts.map +1 -0
- package/dist/lib/observability/mcp-semconv.js +87 -0
- package/dist/lib/observability/mcp-semconv.js.map +1 -0
- package/dist/lib/observability/mcp-semconv.test.d.ts +2 -0
- package/dist/lib/observability/mcp-semconv.test.d.ts.map +1 -0
- package/dist/lib/observability/mcp-semconv.test.js +168 -0
- package/dist/lib/observability/mcp-semconv.test.js.map +1 -0
- package/dist/lib/observability/metrics.d.ts +100 -0
- package/dist/lib/observability/metrics.d.ts.map +1 -0
- package/dist/lib/observability/metrics.js +429 -0
- package/dist/lib/observability/metrics.js.map +1 -0
- package/dist/lib/observability/metrics.test.d.ts.map +1 -0
- package/dist/lib/observability/metrics.test.js +191 -0
- package/dist/lib/observability/metrics.test.js.map +1 -0
- package/dist/lib/observability/observability-test-constants.d.ts +34 -0
- package/dist/lib/observability/observability-test-constants.d.ts.map +1 -0
- package/dist/lib/observability/observability-test-constants.js +55 -0
- package/dist/lib/observability/observability-test-constants.js.map +1 -0
- package/dist/lib/observability/opentelemetry-resources.test.d.ts +2 -0
- package/dist/lib/observability/opentelemetry-resources.test.d.ts.map +1 -0
- package/dist/lib/observability/opentelemetry-resources.test.js +19 -0
- package/dist/lib/observability/opentelemetry-resources.test.js.map +1 -0
- package/dist/lib/observability/parse-stats.d.ts.map +1 -0
- package/dist/lib/observability/parse-stats.js +207 -0
- package/dist/lib/observability/parse-stats.js.map +1 -0
- package/dist/lib/observability/parse-stats.test.d.ts.map +1 -0
- package/dist/lib/observability/parse-stats.test.js +287 -0
- package/dist/lib/observability/parse-stats.test.js.map +1 -0
- package/dist/lib/observability/render-trace-tree.d.ts +31 -0
- package/dist/lib/observability/render-trace-tree.d.ts.map +1 -0
- package/dist/lib/observability/render-trace-tree.js +95 -0
- package/dist/lib/observability/render-trace-tree.js.map +1 -0
- package/dist/lib/observability/render-trace-tree.test.d.ts +5 -0
- package/dist/lib/observability/render-trace-tree.test.d.ts.map +1 -0
- package/dist/lib/observability/render-trace-tree.test.js +97 -0
- package/dist/lib/observability/render-trace-tree.test.js.map +1 -0
- package/dist/lib/observability/span-attributes.d.ts +27 -0
- package/dist/lib/observability/span-attributes.d.ts.map +1 -0
- package/dist/lib/observability/span-attributes.js +85 -0
- package/dist/lib/observability/span-attributes.js.map +1 -0
- package/dist/lib/observability/trace-anomaly-detector.d.ts +23 -0
- package/dist/lib/observability/trace-anomaly-detector.d.ts.map +1 -0
- package/dist/lib/observability/trace-anomaly-detector.js +211 -0
- package/dist/lib/observability/trace-anomaly-detector.js.map +1 -0
- package/dist/lib/observability/trace-anomaly-detector.test.d.ts +5 -0
- package/dist/lib/observability/trace-anomaly-detector.test.d.ts.map +1 -0
- package/dist/lib/observability/trace-anomaly-detector.test.js +224 -0
- package/dist/lib/observability/trace-anomaly-detector.test.js.map +1 -0
- package/dist/lib/observability/trace-anomaly-schemas.d.ts +189 -0
- package/dist/lib/observability/trace-anomaly-schemas.d.ts.map +1 -0
- package/dist/lib/observability/trace-anomaly-schemas.js +167 -0
- package/dist/lib/observability/trace-anomaly-schemas.js.map +1 -0
- package/dist/lib/privacy/content-redaction.d.ts +141 -0
- package/dist/lib/privacy/content-redaction.d.ts.map +1 -0
- package/dist/lib/privacy/content-redaction.js +210 -0
- package/dist/lib/privacy/content-redaction.js.map +1 -0
- package/dist/lib/privacy/content-redaction.test.d.ts +2 -0
- package/dist/lib/privacy/content-redaction.test.d.ts.map +1 -0
- package/dist/lib/privacy/content-redaction.test.js +302 -0
- package/dist/lib/privacy/content-redaction.test.js.map +1 -0
- package/dist/lib/quality/bucket-utils.d.ts +17 -0
- package/dist/lib/quality/bucket-utils.d.ts.map +1 -0
- package/dist/lib/quality/bucket-utils.js +31 -0
- package/dist/lib/quality/bucket-utils.js.map +1 -0
- package/dist/lib/quality/bucket-utils.test.d.ts +2 -0
- package/dist/lib/quality/bucket-utils.test.d.ts.map +1 -0
- package/dist/lib/quality/bucket-utils.test.js +42 -0
- package/dist/lib/quality/bucket-utils.test.js.map +1 -0
- package/dist/lib/quality/qfe-backtest-detail.test.d.ts +5 -0
- package/dist/lib/quality/qfe-backtest-detail.test.d.ts.map +1 -0
- package/dist/lib/quality/qfe-backtest-detail.test.js +179 -0
- package/dist/lib/quality/qfe-backtest-detail.test.js.map +1 -0
- package/dist/lib/quality/qfe-calibration-paths.test.d.ts +5 -0
- package/dist/lib/quality/qfe-calibration-paths.test.d.ts.map +1 -0
- package/dist/lib/quality/qfe-calibration-paths.test.js +203 -0
- package/dist/lib/quality/qfe-calibration-paths.test.js.map +1 -0
- package/dist/lib/quality/qfe-correlation-helpers.test.d.ts +6 -0
- package/dist/lib/quality/qfe-correlation-helpers.test.d.ts.map +1 -0
- package/dist/lib/quality/qfe-correlation-helpers.test.js +143 -0
- package/dist/lib/quality/qfe-correlation-helpers.test.js.map +1 -0
- package/dist/lib/quality/qfe-cqi-paths.test.d.ts +6 -0
- package/dist/lib/quality/qfe-cqi-paths.test.d.ts.map +1 -0
- package/dist/lib/quality/qfe-cqi-paths.test.js +231 -0
- package/dist/lib/quality/qfe-cqi-paths.test.js.map +1 -0
- package/dist/lib/quality/qfe-critic-internals.test.d.ts +6 -0
- package/dist/lib/quality/qfe-critic-internals.test.d.ts.map +1 -0
- package/dist/lib/quality/qfe-critic-internals.test.js +191 -0
- package/dist/lib/quality/qfe-critic-internals.test.js.map +1 -0
- package/dist/lib/quality/qfe-derived-paths.test.d.ts +2 -0
- package/dist/lib/quality/qfe-derived-paths.test.d.ts.map +1 -0
- package/dist/lib/quality/qfe-derived-paths.test.js +372 -0
- package/dist/lib/quality/qfe-derived-paths.test.js.map +1 -0
- package/dist/lib/quality/qfe-dynamics-paths.test.d.ts +8 -0
- package/dist/lib/quality/qfe-dynamics-paths.test.d.ts.map +1 -0
- package/dist/lib/quality/qfe-dynamics-paths.test.js +223 -0
- package/dist/lib/quality/qfe-dynamics-paths.test.js.map +1 -0
- package/dist/lib/quality/qfe-granger-internals.test.d.ts +6 -0
- package/dist/lib/quality/qfe-granger-internals.test.d.ts.map +1 -0
- package/dist/lib/quality/qfe-granger-internals.test.js +158 -0
- package/dist/lib/quality/qfe-granger-internals.test.js.map +1 -0
- package/dist/lib/quality/qfe-label-normalize.test.d.ts +7 -0
- package/dist/lib/quality/qfe-label-normalize.test.d.ts.map +1 -0
- package/dist/lib/quality/qfe-label-normalize.test.js +332 -0
- package/dist/lib/quality/qfe-label-normalize.test.js.map +1 -0
- package/dist/lib/quality/qfe-ordinal-edge.test.d.ts +6 -0
- package/dist/lib/quality/qfe-ordinal-edge.test.d.ts.map +1 -0
- package/dist/lib/quality/qfe-ordinal-edge.test.js +98 -0
- package/dist/lib/quality/qfe-ordinal-edge.test.js.map +1 -0
- package/dist/lib/quality/qfe-roles-detail.test.d.ts +5 -0
- package/dist/lib/quality/qfe-roles-detail.test.d.ts.map +1 -0
- package/dist/lib/quality/qfe-roles-detail.test.js +115 -0
- package/dist/lib/quality/qfe-roles-detail.test.js.map +1 -0
- package/dist/lib/quality/qfe-rolling-detail.test.d.ts +7 -0
- package/dist/lib/quality/qfe-rolling-detail.test.d.ts.map +1 -0
- package/dist/lib/quality/qfe-rolling-detail.test.js +249 -0
- package/dist/lib/quality/qfe-rolling-detail.test.js.map +1 -0
- package/dist/lib/quality/qfe-stats-internals.test.d.ts +7 -0
- package/dist/lib/quality/qfe-stats-internals.test.d.ts.map +1 -0
- package/dist/lib/quality/qfe-stats-internals.test.js +143 -0
- package/dist/lib/quality/qfe-stats-internals.test.js.map +1 -0
- package/dist/lib/quality/qfe-streaming.test.d.ts +5 -0
- package/dist/lib/quality/qfe-streaming.test.d.ts.map +1 -0
- package/dist/lib/quality/qfe-streaming.test.js +239 -0
- package/dist/lib/quality/qfe-streaming.test.js.map +1 -0
- package/dist/lib/quality/qfe-sweep-detail.test.d.ts +6 -0
- package/dist/lib/quality/qfe-sweep-detail.test.d.ts.map +1 -0
- package/dist/lib/quality/qfe-sweep-detail.test.js +291 -0
- package/dist/lib/quality/qfe-sweep-detail.test.js.map +1 -0
- package/dist/lib/quality/quality-alerts.d.ts +23 -0
- package/dist/lib/quality/quality-alerts.d.ts.map +1 -0
- package/dist/lib/quality/quality-alerts.js +89 -0
- package/dist/lib/quality/quality-alerts.js.map +1 -0
- package/dist/lib/quality/quality-alerts.test.d.ts +2 -0
- package/dist/lib/quality/quality-alerts.test.d.ts.map +1 -0
- package/dist/lib/quality/quality-alerts.test.js +86 -0
- package/dist/lib/quality/quality-alerts.test.js.map +1 -0
- package/dist/lib/quality/quality-constants.d.ts +294 -0
- package/dist/lib/quality/quality-constants.d.ts.map +1 -0
- package/dist/lib/quality/quality-constants.js +335 -0
- package/dist/lib/quality/quality-constants.js.map +1 -0
- package/dist/lib/quality/quality-feature-engineering.d.ts +1071 -0
- package/dist/lib/quality/quality-feature-engineering.d.ts.map +1 -0
- package/dist/lib/quality/quality-feature-engineering.js +2076 -0
- package/dist/lib/quality/quality-feature-engineering.js.map +1 -0
- package/dist/lib/quality/quality-feature-engineering.test.d.ts +5 -0
- package/dist/lib/quality/quality-feature-engineering.test.d.ts.map +1 -0
- package/dist/lib/quality/quality-feature-engineering.test.js +2908 -0
- package/dist/lib/quality/quality-feature-engineering.test.js.map +1 -0
- package/dist/lib/quality/quality-metrics.d.ts +943 -0
- package/dist/lib/quality/quality-metrics.d.ts.map +1 -0
- package/dist/lib/quality/quality-metrics.js +1151 -0
- package/dist/lib/quality/quality-metrics.js.map +1 -0
- package/dist/lib/quality/quality-metrics.test.d.ts +5 -0
- package/dist/lib/quality/quality-metrics.test.d.ts.map +1 -0
- package/dist/lib/quality/quality-metrics.test.js +2766 -0
- package/dist/lib/quality/quality-metrics.test.js.map +1 -0
- package/dist/lib/quality/quality-multi-agent.d.ts +106 -0
- package/dist/lib/quality/quality-multi-agent.d.ts.map +1 -0
- package/dist/lib/quality/quality-multi-agent.js +124 -0
- package/dist/lib/quality/quality-multi-agent.js.map +1 -0
- package/dist/lib/quality/quality-multi-agent.test.d.ts +6 -0
- package/dist/lib/quality/quality-multi-agent.test.d.ts.map +1 -0
- package/dist/lib/quality/quality-multi-agent.test.js +163 -0
- package/dist/lib/quality/quality-multi-agent.test.js.map +1 -0
- package/dist/lib/quality/quality-sla.d.ts +35 -0
- package/dist/lib/quality/quality-sla.d.ts.map +1 -0
- package/dist/lib/quality/quality-sla.js +62 -0
- package/dist/lib/quality/quality-sla.js.map +1 -0
- package/dist/lib/quality/quality-sla.test.d.ts +5 -0
- package/dist/lib/quality/quality-sla.test.d.ts.map +1 -0
- package/dist/lib/quality/quality-sla.test.js +144 -0
- package/dist/lib/quality/quality-sla.test.js.map +1 -0
- package/dist/lib/quality/quality-test-constants.d.ts +23 -0
- package/dist/lib/quality/quality-test-constants.d.ts.map +1 -0
- package/dist/lib/quality/quality-test-constants.js +25 -0
- package/dist/lib/quality/quality-test-constants.js.map +1 -0
- package/dist/lib/quality/quality-trends.d.ts +101 -0
- package/dist/lib/quality/quality-trends.d.ts.map +1 -0
- package/dist/lib/quality/quality-trends.js +299 -0
- package/dist/lib/quality/quality-trends.js.map +1 -0
- package/dist/lib/quality/quality-trends.test.d.ts +6 -0
- package/dist/lib/quality/quality-trends.test.d.ts.map +1 -0
- package/dist/lib/quality/quality-trends.test.js +377 -0
- package/dist/lib/quality/quality-trends.test.js.map +1 -0
- package/dist/lib/quality/quality-views.d.ts +966 -0
- package/dist/lib/quality/quality-views.d.ts.map +1 -0
- package/dist/lib/quality/quality-views.js +367 -0
- package/dist/lib/quality/quality-views.js.map +1 -0
- package/dist/lib/quality/quality-views.test.d.ts +6 -0
- package/dist/lib/quality/quality-views.test.d.ts.map +1 -0
- package/dist/lib/quality/quality-views.test.js +262 -0
- package/dist/lib/quality/quality-views.test.js.map +1 -0
- package/dist/lib/quality/quality-visualization.d.ts +112 -0
- package/dist/lib/quality/quality-visualization.d.ts.map +1 -0
- package/dist/lib/quality/quality-visualization.js +136 -0
- package/dist/lib/quality/quality-visualization.js.map +1 -0
- package/dist/lib/quality/quality-visualization.test.d.ts +5 -0
- package/dist/lib/quality/quality-visualization.test.d.ts.map +1 -0
- package/dist/lib/quality/quality-visualization.test.js +189 -0
- package/dist/lib/quality/quality-visualization.test.js.map +1 -0
- package/dist/lib/resilience/cache.d.ts +56 -0
- package/dist/lib/resilience/cache.d.ts.map +1 -0
- package/dist/lib/resilience/cache.js +96 -0
- package/dist/lib/resilience/cache.js.map +1 -0
- package/dist/lib/resilience/cache.test.d.ts.map +1 -0
- package/dist/lib/resilience/cache.test.js +106 -0
- package/dist/lib/resilience/cache.test.js.map +1 -0
- package/dist/lib/resilience/circuit-breaker.d.ts +147 -0
- package/dist/lib/resilience/circuit-breaker.d.ts.map +1 -0
- package/dist/lib/resilience/circuit-breaker.js +251 -0
- package/dist/lib/resilience/circuit-breaker.js.map +1 -0
- package/dist/lib/resilience/circuit-breaker.test.d.ts.map +1 -0
- package/dist/lib/resilience/circuit-breaker.test.js +266 -0
- package/dist/lib/resilience/circuit-breaker.test.js.map +1 -0
- package/dist/lib/resilience/toon-encoder.d.ts +31 -0
- package/dist/lib/resilience/toon-encoder.d.ts.map +1 -0
- package/dist/lib/resilience/toon-encoder.js +66 -0
- package/dist/lib/resilience/toon-encoder.js.map +1 -0
- package/dist/lib/resilience/toon-encoder.test.d.ts.map +1 -0
- package/dist/lib/resilience/toon-encoder.test.js +86 -0
- package/dist/lib/resilience/toon-encoder.test.js.map +1 -0
- package/dist/lib/testing/mock-llm-builder.d.ts +139 -0
- package/dist/lib/testing/mock-llm-builder.d.ts.map +1 -0
- package/dist/lib/testing/mock-llm-builder.js +254 -0
- package/dist/lib/testing/mock-llm-builder.js.map +1 -0
- package/dist/lib/testing/mock-llm-builder.test.d.ts +5 -0
- package/dist/lib/testing/mock-llm-builder.test.d.ts.map +1 -0
- package/dist/lib/testing/mock-llm-builder.test.js +304 -0
- package/dist/lib/testing/mock-llm-builder.test.js.map +1 -0
- package/dist/lib/validation/api-schemas.d.ts +705 -0
- package/dist/lib/validation/api-schemas.d.ts.map +1 -0
- package/dist/lib/validation/api-schemas.js +351 -0
- package/dist/lib/validation/api-schemas.js.map +1 -0
- package/dist/lib/validation/api-schemas.test.d.ts +5 -0
- package/dist/lib/validation/api-schemas.test.d.ts.map +1 -0
- package/dist/lib/validation/api-schemas.test.js +427 -0
- package/dist/lib/validation/api-schemas.test.js.map +1 -0
- package/dist/lib/validation/dashboard-schemas.d.ts +203 -0
- package/dist/lib/validation/dashboard-schemas.d.ts.map +1 -0
- package/dist/lib/validation/dashboard-schemas.js +186 -0
- package/dist/lib/validation/dashboard-schemas.js.map +1 -0
- package/dist/lib/validation/dashboard-schemas.test.d.ts +5 -0
- package/dist/lib/validation/dashboard-schemas.test.d.ts.map +1 -0
- package/dist/lib/validation/dashboard-schemas.test.js +353 -0
- package/dist/lib/validation/dashboard-schemas.test.js.map +1 -0
- package/dist/server.d.ts +2 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +158 -144
- package/dist/server.js.map +1 -1
- package/dist/server.test.js +102 -95
- package/dist/server.test.js.map +1 -1
- package/dist/test-helpers/assertions.d.ts +6 -0
- package/dist/test-helpers/assertions.d.ts.map +1 -0
- package/dist/test-helpers/assertions.js +11 -0
- package/dist/test-helpers/assertions.js.map +1 -0
- package/dist/test-helpers/env-utils.d.ts +0 -64
- package/dist/test-helpers/env-utils.d.ts.map +1 -1
- package/dist/test-helpers/env-utils.js +0 -100
- package/dist/test-helpers/env-utils.js.map +1 -1
- package/dist/test-helpers/fuzz-generators.d.ts.map +1 -1
- package/dist/test-helpers/fuzz-generators.js +62 -22
- package/dist/test-helpers/fuzz-generators.js.map +1 -1
- package/dist/test-helpers/index.d.ts +3 -2
- package/dist/test-helpers/index.d.ts.map +1 -1
- package/dist/test-helpers/index.js +4 -2
- package/dist/test-helpers/index.js.map +1 -1
- package/dist/test-helpers/memfs-utils.test.js +81 -76
- package/dist/test-helpers/memfs-utils.test.js.map +1 -1
- package/dist/test-helpers/mock-backends.d.ts +19 -17
- package/dist/test-helpers/mock-backends.d.ts.map +1 -1
- package/dist/test-helpers/mock-backends.js +16 -4
- package/dist/test-helpers/mock-backends.js.map +1 -1
- package/dist/test-helpers/mock-backends.test.js +43 -112
- package/dist/test-helpers/mock-backends.test.js.map +1 -1
- package/dist/test-helpers/race-condition-helpers.d.ts.map +1 -1
- package/dist/test-helpers/race-condition-helpers.js +3 -2
- package/dist/test-helpers/race-condition-helpers.js.map +1 -1
- package/dist/test-helpers/schema-validators.d.ts +2 -2
- package/dist/test-helpers/schema-validators.d.ts.map +1 -1
- package/dist/test-helpers/schema-validators.js +35 -31
- package/dist/test-helpers/schema-validators.js.map +1 -1
- package/dist/test-helpers/test-constants.d.ts +74 -0
- package/dist/test-helpers/test-constants.d.ts.map +1 -0
- package/dist/test-helpers/test-constants.js +78 -0
- package/dist/test-helpers/test-constants.js.map +1 -0
- package/dist/test-helpers/test-data-builders.d.ts +25 -7
- package/dist/test-helpers/test-data-builders.d.ts.map +1 -1
- package/dist/test-helpers/test-data-builders.js +32 -9
- package/dist/test-helpers/test-data-builders.js.map +1 -1
- package/dist/test-helpers/test-data-builders.test.js +116 -107
- package/dist/test-helpers/test-data-builders.test.js.map +1 -1
- package/dist/test-helpers/tool-validators.d.ts +1 -1
- package/dist/test-helpers/tool-validators.d.ts.map +1 -1
- package/dist/test-helpers/tool-validators.js +10 -10
- package/dist/test-helpers/tool-validators.js.map +1 -1
- package/dist/tools/audit-trail.d.ts +170 -0
- package/dist/tools/audit-trail.d.ts.map +1 -0
- package/dist/tools/audit-trail.js +109 -0
- package/dist/tools/audit-trail.js.map +1 -0
- package/dist/tools/audit-trail.test.d.ts +5 -0
- package/dist/tools/audit-trail.test.d.ts.map +1 -0
- package/dist/tools/audit-trail.test.js +122 -0
- package/dist/tools/audit-trail.test.js.map +1 -0
- package/dist/tools/context-stats.d.ts +6 -20
- package/dist/tools/context-stats.d.ts.map +1 -1
- package/dist/tools/context-stats.js +106 -88
- package/dist/tools/context-stats.js.map +1 -1
- package/dist/tools/context-stats.test.js +109 -60
- package/dist/tools/context-stats.test.js.map +1 -1
- package/dist/tools/detect-trace-anomalies.d.ts +123 -0
- package/dist/tools/detect-trace-anomalies.d.ts.map +1 -0
- package/dist/tools/detect-trace-anomalies.js +66 -0
- package/dist/tools/detect-trace-anomalies.js.map +1 -0
- package/dist/tools/estimate-cost.d.ts +77 -0
- package/dist/tools/estimate-cost.d.ts.map +1 -0
- package/dist/tools/estimate-cost.js +104 -0
- package/dist/tools/estimate-cost.js.map +1 -0
- package/dist/tools/estimate-cost.test.d.ts +5 -0
- package/dist/tools/estimate-cost.test.d.ts.map +1 -0
- package/dist/tools/estimate-cost.test.js +343 -0
- package/dist/tools/estimate-cost.test.js.map +1 -0
- package/dist/tools/export-base.d.ts +77 -0
- package/dist/tools/export-base.d.ts.map +1 -0
- package/dist/tools/export-base.js +150 -0
- package/dist/tools/export-base.js.map +1 -0
- package/dist/tools/export-base.test.d.ts +18 -0
- package/dist/tools/export-base.test.d.ts.map +1 -0
- package/dist/tools/export-base.test.js +220 -0
- package/dist/tools/export-base.test.js.map +1 -0
- package/dist/tools/export-confident.d.ts +94 -90
- package/dist/tools/export-confident.d.ts.map +1 -1
- package/dist/tools/export-confident.js +17 -115
- package/dist/tools/export-confident.js.map +1 -1
- package/dist/tools/export-confident.test.js +79 -75
- package/dist/tools/export-confident.test.js.map +1 -1
- package/dist/tools/export-datadog.d.ts +77 -116
- package/dist/tools/export-datadog.d.ts.map +1 -1
- package/dist/tools/export-datadog.js +38 -40
- package/dist/tools/export-datadog.js.map +1 -1
- package/dist/tools/export-datadog.test.js +122 -165
- package/dist/tools/export-datadog.test.js.map +1 -1
- package/dist/tools/export-jaeger.d.ts +100 -0
- package/dist/tools/export-jaeger.d.ts.map +1 -0
- package/dist/tools/export-jaeger.js +154 -0
- package/dist/tools/export-jaeger.js.map +1 -0
- package/dist/tools/export-jaeger.test.d.ts +2 -0
- package/dist/tools/export-jaeger.test.d.ts.map +1 -0
- package/dist/tools/export-jaeger.test.js +113 -0
- package/dist/tools/export-jaeger.test.js.map +1 -0
- package/dist/tools/export-langfuse.d.ts +78 -80
- package/dist/tools/export-langfuse.d.ts.map +1 -1
- package/dist/tools/export-langfuse.js +15 -113
- package/dist/tools/export-langfuse.js.map +1 -1
- package/dist/tools/export-langfuse.test.js +70 -81
- package/dist/tools/export-langfuse.test.js.map +1 -1
- package/dist/tools/export-phoenix.d.ts +115 -90
- package/dist/tools/export-phoenix.d.ts.map +1 -1
- package/dist/tools/export-phoenix.js +29 -117
- package/dist/tools/export-phoenix.js.map +1 -1
- package/dist/tools/export-phoenix.test.js +95 -94
- package/dist/tools/export-phoenix.test.js.map +1 -1
- package/dist/tools/get-trace-url.d.ts +2 -10
- package/dist/tools/get-trace-url.d.ts.map +1 -1
- package/dist/tools/get-trace-url.js +5 -8
- package/dist/tools/get-trace-url.js.map +1 -1
- package/dist/tools/get-trace-url.test.js +81 -399
- package/dist/tools/get-trace-url.test.js.map +1 -1
- package/dist/tools/hallucination-detection.d.ts +203 -0
- package/dist/tools/hallucination-detection.d.ts.map +1 -0
- package/dist/tools/hallucination-detection.js +189 -0
- package/dist/tools/hallucination-detection.js.map +1 -0
- package/dist/tools/hallucination-detection.test.d.ts +5 -0
- package/dist/tools/hallucination-detection.test.d.ts.map +1 -0
- package/dist/tools/hallucination-detection.test.js +529 -0
- package/dist/tools/hallucination-detection.test.js.map +1 -0
- package/dist/tools/health-check.d.ts +9 -16
- package/dist/tools/health-check.d.ts.map +1 -1
- package/dist/tools/health-check.js +88 -101
- package/dist/tools/health-check.js.map +1 -1
- package/dist/tools/health-check.test.js +72 -165
- package/dist/tools/health-check.test.js.map +1 -1
- package/dist/tools/index.d.ts +13 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +13 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/ingest-constants.d.ts +8 -0
- package/dist/tools/ingest-constants.d.ts.map +1 -0
- package/dist/tools/ingest-constants.js +8 -0
- package/dist/tools/ingest-constants.js.map +1 -0
- package/dist/tools/ingest-spans.d.ts +45 -0
- package/dist/tools/ingest-spans.d.ts.map +1 -0
- package/dist/tools/ingest-spans.js +129 -0
- package/dist/tools/ingest-spans.js.map +1 -0
- package/dist/tools/ingest-spans.test.d.ts +5 -0
- package/dist/tools/ingest-spans.test.d.ts.map +1 -0
- package/dist/tools/ingest-spans.test.js +250 -0
- package/dist/tools/ingest-spans.test.js.map +1 -0
- package/dist/tools/ingest-traces.d.ts +76 -0
- package/dist/tools/ingest-traces.d.ts.map +1 -0
- package/dist/tools/ingest-traces.js +164 -0
- package/dist/tools/ingest-traces.js.map +1 -0
- package/dist/tools/ingest-traces.test.d.ts +5 -0
- package/dist/tools/ingest-traces.test.d.ts.map +1 -0
- package/dist/tools/ingest-traces.test.js +483 -0
- package/dist/tools/ingest-traces.test.js.map +1 -0
- package/dist/tools/inject-evaluations.d.ts +136 -1197
- package/dist/tools/inject-evaluations.d.ts.map +1 -1
- package/dist/tools/inject-evaluations.js +65 -53
- package/dist/tools/inject-evaluations.js.map +1 -1
- package/dist/tools/inject-evaluations.test.js +83 -71
- package/dist/tools/inject-evaluations.test.js.map +1 -1
- package/dist/tools/manage-datasets.d.ts +850 -0
- package/dist/tools/manage-datasets.d.ts.map +1 -0
- package/dist/tools/manage-datasets.js +139 -0
- package/dist/tools/manage-datasets.js.map +1 -0
- package/dist/tools/manage-datasets.test.d.ts +5 -0
- package/dist/tools/manage-datasets.test.d.ts.map +1 -0
- package/dist/tools/manage-datasets.test.js +430 -0
- package/dist/tools/manage-datasets.test.js.map +1 -0
- package/dist/tools/multi-agent-coordination.d.ts +178 -0
- package/dist/tools/multi-agent-coordination.d.ts.map +1 -0
- package/dist/tools/multi-agent-coordination.js +270 -0
- package/dist/tools/multi-agent-coordination.js.map +1 -0
- package/dist/tools/multi-agent-coordination.test.d.ts +5 -0
- package/dist/tools/multi-agent-coordination.test.d.ts.map +1 -0
- package/dist/tools/multi-agent-coordination.test.js +530 -0
- package/dist/tools/multi-agent-coordination.test.js.map +1 -0
- package/dist/tools/query-evaluations.d.ts +147 -105
- package/dist/tools/query-evaluations.d.ts.map +1 -1
- package/dist/tools/query-evaluations.js +205 -178
- package/dist/tools/query-evaluations.js.map +1 -1
- package/dist/tools/query-evaluations.test.js +386 -391
- package/dist/tools/query-evaluations.test.js.map +1 -1
- package/dist/tools/query-llm-events.d.ts +100 -75
- package/dist/tools/query-llm-events.d.ts.map +1 -1
- package/dist/tools/query-llm-events.js +106 -80
- package/dist/tools/query-llm-events.js.map +1 -1
- package/dist/tools/query-llm-events.test.js +183 -346
- package/dist/tools/query-llm-events.test.js.map +1 -1
- package/dist/tools/query-logs.d.ts +45 -58
- package/dist/tools/query-logs.d.ts.map +1 -1
- package/dist/tools/query-logs.js +54 -101
- package/dist/tools/query-logs.js.map +1 -1
- package/dist/tools/query-logs.test.js +118 -314
- package/dist/tools/query-logs.test.js.map +1 -1
- package/dist/tools/query-metric-histograms.d.ts +112 -0
- package/dist/tools/query-metric-histograms.d.ts.map +1 -0
- package/dist/tools/query-metric-histograms.js +69 -0
- package/dist/tools/query-metric-histograms.js.map +1 -0
- package/dist/tools/query-metric-histograms.test.d.ts +5 -0
- package/dist/tools/query-metric-histograms.test.d.ts.map +1 -0
- package/dist/tools/query-metric-histograms.test.js +209 -0
- package/dist/tools/query-metric-histograms.test.js.map +1 -0
- package/dist/tools/query-metrics.d.ts +159 -60
- package/dist/tools/query-metrics.d.ts.map +1 -1
- package/dist/tools/query-metrics.js +133 -111
- package/dist/tools/query-metrics.js.map +1 -1
- package/dist/tools/query-metrics.test.js +314 -389
- package/dist/tools/query-metrics.test.js.map +1 -1
- package/dist/tools/query-regressions.d.ts +76 -0
- package/dist/tools/query-regressions.d.ts.map +1 -0
- package/dist/tools/query-regressions.js +122 -0
- package/dist/tools/query-regressions.js.map +1 -0
- package/dist/tools/query-regressions.test.d.ts +8 -0
- package/dist/tools/query-regressions.test.d.ts.map +1 -0
- package/dist/tools/query-regressions.test.js +129 -0
- package/dist/tools/query-regressions.test.js.map +1 -0
- package/dist/tools/query-traces.d.ts +103 -71
- package/dist/tools/query-traces.d.ts.map +1 -1
- package/dist/tools/query-traces.js +75 -106
- package/dist/tools/query-traces.js.map +1 -1
- package/dist/tools/query-traces.test.js +140 -846
- package/dist/tools/query-traces.test.js.map +1 -1
- package/dist/tools/query-verifications.d.ts +55 -43
- package/dist/tools/query-verifications.d.ts.map +1 -1
- package/dist/tools/query-verifications.js +47 -46
- package/dist/tools/query-verifications.js.map +1 -1
- package/dist/tools/query-verifications.test.js +42 -35
- package/dist/tools/query-verifications.test.js.map +1 -1
- package/dist/tools/routing-telemetry.d.ts +168 -0
- package/dist/tools/routing-telemetry.d.ts.map +1 -0
- package/dist/tools/routing-telemetry.js +267 -0
- package/dist/tools/routing-telemetry.js.map +1 -0
- package/dist/tools/routing-telemetry.test.d.ts +5 -0
- package/dist/tools/routing-telemetry.test.d.ts.map +1 -0
- package/dist/tools/routing-telemetry.test.js +747 -0
- package/dist/tools/routing-telemetry.test.js.map +1 -0
- package/dist/tools/setup-claudeignore.d.ts +4 -32
- package/dist/tools/setup-claudeignore.d.ts.map +1 -1
- package/dist/tools/setup-claudeignore.js +18 -22
- package/dist/tools/setup-claudeignore.js.map +1 -1
- package/dist/tools/setup-claudeignore.test.js +50 -49
- package/dist/tools/setup-claudeignore.test.js.map +1 -1
- package/dist/tools/token-budget.d.ts +170 -0
- package/dist/tools/token-budget.d.ts.map +1 -0
- package/dist/tools/token-budget.js +219 -0
- package/dist/tools/token-budget.js.map +1 -0
- package/dist/tools/token-budget.test.d.ts +5 -0
- package/dist/tools/token-budget.test.d.ts.map +1 -0
- package/dist/tools/token-budget.test.js +293 -0
- package/dist/tools/token-budget.test.js.map +1 -0
- package/package.json +72 -10
- package/dist/backends/local-jsonl.test.d.ts +0 -2
- package/dist/backends/local-jsonl.test.d.ts.map +0 -1
- package/dist/backends/local-jsonl.test.js +0 -4651
- package/dist/backends/local-jsonl.test.js.map +0 -1
- package/dist/backends/signoz-api-circuit-breaker.test.d.ts +0 -6
- package/dist/backends/signoz-api-circuit-breaker.test.d.ts.map +0 -1
- package/dist/backends/signoz-api-circuit-breaker.test.js +0 -548
- package/dist/backends/signoz-api-circuit-breaker.test.js.map +0 -1
- package/dist/backends/signoz-api-rate-limiter.test.d.ts +0 -6
- package/dist/backends/signoz-api-rate-limiter.test.d.ts.map +0 -1
- package/dist/backends/signoz-api-rate-limiter.test.js +0 -390
- package/dist/backends/signoz-api-rate-limiter.test.js.map +0 -1
- package/dist/backends/signoz-api-ssrf.test.d.ts +0 -6
- package/dist/backends/signoz-api-ssrf.test.d.ts.map +0 -1
- package/dist/backends/signoz-api-ssrf.test.js +0 -216
- package/dist/backends/signoz-api-ssrf.test.js.map +0 -1
- package/dist/backends/signoz-api-test-helpers.d.ts +0 -80
- package/dist/backends/signoz-api-test-helpers.d.ts.map +0 -1
- package/dist/backends/signoz-api-test-helpers.js +0 -79
- package/dist/backends/signoz-api-test-helpers.js.map +0 -1
- package/dist/backends/signoz-api.d.ts +0 -109
- package/dist/backends/signoz-api.d.ts.map +0 -1
- package/dist/backends/signoz-api.integration.test.d.ts +0 -8
- package/dist/backends/signoz-api.integration.test.d.ts.map +0 -1
- package/dist/backends/signoz-api.integration.test.js +0 -137
- package/dist/backends/signoz-api.integration.test.js.map +0 -1
- package/dist/backends/signoz-api.js +0 -1132
- package/dist/backends/signoz-api.js.map +0 -1
- package/dist/backends/signoz-api.test.d.ts +0 -11
- package/dist/backends/signoz-api.test.d.ts.map +0 -1
- package/dist/backends/signoz-api.test.js +0 -832
- package/dist/backends/signoz-api.test.js.map +0 -1
- package/dist/lib/agent-as-judge.d.ts +0 -388
- package/dist/lib/agent-as-judge.d.ts.map +0 -1
- package/dist/lib/agent-as-judge.js +0 -740
- package/dist/lib/agent-as-judge.js.map +0 -1
- package/dist/lib/agent-as-judge.test.d.ts.map +0 -1
- package/dist/lib/agent-as-judge.test.js +0 -816
- package/dist/lib/agent-as-judge.test.js.map +0 -1
- package/dist/lib/cache.d.ts +0 -90
- package/dist/lib/cache.d.ts.map +0 -1
- package/dist/lib/cache.js +0 -133
- package/dist/lib/cache.js.map +0 -1
- package/dist/lib/cache.test.d.ts.map +0 -1
- package/dist/lib/cache.test.js +0 -105
- package/dist/lib/cache.test.js.map +0 -1
- package/dist/lib/circuit-breaker.d.ts +0 -101
- package/dist/lib/circuit-breaker.d.ts.map +0 -1
- package/dist/lib/circuit-breaker.js +0 -158
- package/dist/lib/circuit-breaker.js.map +0 -1
- package/dist/lib/circuit-breaker.test.d.ts.map +0 -1
- package/dist/lib/circuit-breaker.test.js +0 -263
- package/dist/lib/circuit-breaker.test.js.map +0 -1
- package/dist/lib/confident-export.d.ts +0 -101
- package/dist/lib/confident-export.d.ts.map +0 -1
- package/dist/lib/confident-export.js +0 -393
- package/dist/lib/confident-export.js.map +0 -1
- package/dist/lib/confident-export.test.d.ts.map +0 -1
- package/dist/lib/confident-export.test.js +0 -835
- package/dist/lib/confident-export.test.js.map +0 -1
- package/dist/lib/constants-symlink.test.d.ts.map +0 -1
- package/dist/lib/constants-symlink.test.js +0 -357
- package/dist/lib/constants-symlink.test.js.map +0 -1
- package/dist/lib/constants.d.ts +0 -183
- package/dist/lib/constants.d.ts.map +0 -1
- package/dist/lib/constants.js +0 -453
- package/dist/lib/constants.js.map +0 -1
- package/dist/lib/constants.test.d.ts.map +0 -1
- package/dist/lib/constants.test.js +0 -717
- package/dist/lib/constants.test.js.map +0 -1
- package/dist/lib/datadog-export.d.ts +0 -156
- package/dist/lib/datadog-export.d.ts.map +0 -1
- package/dist/lib/datadog-export.js +0 -464
- package/dist/lib/datadog-export.js.map +0 -1
- package/dist/lib/datadog-export.test.d.ts +0 -14
- package/dist/lib/datadog-export.test.d.ts.map +0 -1
- package/dist/lib/datadog-export.test.js +0 -890
- package/dist/lib/datadog-export.test.js.map +0 -1
- package/dist/lib/edge-cases.test.d.ts.map +0 -1
- package/dist/lib/edge-cases.test.js +0 -634
- package/dist/lib/edge-cases.test.js.map +0 -1
- package/dist/lib/error-sanitizer.d.ts +0 -57
- package/dist/lib/error-sanitizer.d.ts.map +0 -1
- package/dist/lib/error-sanitizer.js +0 -233
- package/dist/lib/error-sanitizer.js.map +0 -1
- package/dist/lib/error-sanitizer.test.d.ts.map +0 -1
- package/dist/lib/error-sanitizer.test.js +0 -528
- package/dist/lib/error-sanitizer.test.js.map +0 -1
- package/dist/lib/error-types.d.ts +0 -54
- package/dist/lib/error-types.d.ts.map +0 -1
- package/dist/lib/error-types.js +0 -154
- package/dist/lib/error-types.js.map +0 -1
- package/dist/lib/error-types.test.d.ts.map +0 -1
- package/dist/lib/error-types.test.js +0 -196
- package/dist/lib/error-types.test.js.map +0 -1
- package/dist/lib/evaluation-hooks.d.ts +0 -49
- package/dist/lib/evaluation-hooks.d.ts.map +0 -1
- package/dist/lib/evaluation-hooks.js +0 -488
- package/dist/lib/evaluation-hooks.js.map +0 -1
- package/dist/lib/evaluation-hooks.test.d.ts.map +0 -1
- package/dist/lib/evaluation-hooks.test.js +0 -624
- package/dist/lib/evaluation-hooks.test.js.map +0 -1
- package/dist/lib/export-utils.d.ts +0 -99
- package/dist/lib/export-utils.d.ts.map +0 -1
- package/dist/lib/export-utils.js +0 -238
- package/dist/lib/export-utils.js.map +0 -1
- package/dist/lib/export-utils.test.d.ts.map +0 -1
- package/dist/lib/export-utils.test.js +0 -193
- package/dist/lib/export-utils.test.js.map +0 -1
- package/dist/lib/file-utils.d.ts +0 -320
- package/dist/lib/file-utils.d.ts.map +0 -1
- package/dist/lib/file-utils.js +0 -816
- package/dist/lib/file-utils.js.map +0 -1
- package/dist/lib/file-utils.test.d.ts.map +0 -1
- package/dist/lib/file-utils.test.js +0 -1333
- package/dist/lib/file-utils.test.js.map +0 -1
- package/dist/lib/histogram.d.ts +0 -119
- package/dist/lib/histogram.d.ts.map +0 -1
- package/dist/lib/histogram.js +0 -202
- package/dist/lib/histogram.js.map +0 -1
- package/dist/lib/histogram.test.d.ts.map +0 -1
- package/dist/lib/histogram.test.js +0 -381
- package/dist/lib/histogram.test.js.map +0 -1
- package/dist/lib/indexer.d.ts +0 -96
- package/dist/lib/indexer.d.ts.map +0 -1
- package/dist/lib/indexer.js +0 -353
- package/dist/lib/indexer.js.map +0 -1
- package/dist/lib/indexer.test.d.ts.map +0 -1
- package/dist/lib/indexer.test.js +0 -696
- package/dist/lib/indexer.test.js.map +0 -1
- package/dist/lib/input-validator.d.ts +0 -115
- package/dist/lib/input-validator.d.ts.map +0 -1
- package/dist/lib/input-validator.fuzz.test.d.ts.map +0 -1
- package/dist/lib/input-validator.fuzz.test.js +0 -290
- package/dist/lib/input-validator.fuzz.test.js.map +0 -1
- package/dist/lib/input-validator.js +0 -304
- package/dist/lib/input-validator.js.map +0 -1
- package/dist/lib/input-validator.test.d.ts.map +0 -1
- package/dist/lib/input-validator.test.js +0 -415
- package/dist/lib/input-validator.test.js.map +0 -1
- package/dist/lib/instrumentation.d.ts +0 -153
- package/dist/lib/instrumentation.d.ts.map +0 -1
- package/dist/lib/instrumentation.integration.test.d.ts.map +0 -1
- package/dist/lib/instrumentation.integration.test.js +0 -589
- package/dist/lib/instrumentation.integration.test.js.map +0 -1
- package/dist/lib/instrumentation.js +0 -520
- package/dist/lib/instrumentation.js.map +0 -1
- package/dist/lib/instrumentation.test.d.ts.map +0 -1
- package/dist/lib/instrumentation.test.js +0 -821
- package/dist/lib/instrumentation.test.js.map +0 -1
- package/dist/lib/langfuse-export.d.ts +0 -125
- package/dist/lib/langfuse-export.d.ts.map +0 -1
- package/dist/lib/langfuse-export.js +0 -367
- package/dist/lib/langfuse-export.js.map +0 -1
- package/dist/lib/langfuse-export.test.d.ts.map +0 -1
- package/dist/lib/langfuse-export.test.js +0 -1007
- package/dist/lib/langfuse-export.test.js.map +0 -1
- package/dist/lib/llm-as-judge.d.ts +0 -657
- package/dist/lib/llm-as-judge.d.ts.map +0 -1
- package/dist/lib/llm-as-judge.js +0 -1397
- package/dist/lib/llm-as-judge.js.map +0 -1
- package/dist/lib/llm-as-judge.test.d.ts.map +0 -1
- package/dist/lib/llm-as-judge.test.js +0 -2409
- package/dist/lib/llm-as-judge.test.js.map +0 -1
- package/dist/lib/logger.d.ts +0 -46
- package/dist/lib/logger.d.ts.map +0 -1
- package/dist/lib/logger.js +0 -81
- package/dist/lib/logger.js.map +0 -1
- package/dist/lib/logger.test.d.ts.map +0 -1
- package/dist/lib/logger.test.js.map +0 -1
- package/dist/lib/metrics.d.ts +0 -62
- package/dist/lib/metrics.d.ts.map +0 -1
- package/dist/lib/metrics.js +0 -166
- package/dist/lib/metrics.js.map +0 -1
- package/dist/lib/metrics.test.d.ts.map +0 -1
- package/dist/lib/metrics.test.js +0 -189
- package/dist/lib/metrics.test.js.map +0 -1
- package/dist/lib/otlp-export.d.ts +0 -178
- package/dist/lib/otlp-export.d.ts.map +0 -1
- package/dist/lib/otlp-export.js +0 -382
- package/dist/lib/otlp-export.js.map +0 -1
- package/dist/lib/parse-stats.d.ts.map +0 -1
- package/dist/lib/parse-stats.js +0 -206
- package/dist/lib/parse-stats.js.map +0 -1
- package/dist/lib/parse-stats.test.d.ts.map +0 -1
- package/dist/lib/parse-stats.test.js +0 -283
- package/dist/lib/parse-stats.test.js.map +0 -1
- package/dist/lib/phoenix-export.d.ts +0 -109
- package/dist/lib/phoenix-export.d.ts.map +0 -1
- package/dist/lib/phoenix-export.js +0 -429
- package/dist/lib/phoenix-export.js.map +0 -1
- package/dist/lib/phoenix-export.test.d.ts.map +0 -1
- package/dist/lib/phoenix-export.test.js +0 -725
- package/dist/lib/phoenix-export.test.js.map +0 -1
- package/dist/lib/query-sanitizer.d.ts.map +0 -1
- package/dist/lib/query-sanitizer.js +0 -261
- package/dist/lib/query-sanitizer.js.map +0 -1
- package/dist/lib/query-sanitizer.test.d.ts.map +0 -1
- package/dist/lib/query-sanitizer.test.js +0 -400
- package/dist/lib/query-sanitizer.test.js.map +0 -1
- package/dist/lib/server-utils.d.ts +0 -93
- package/dist/lib/server-utils.d.ts.map +0 -1
- package/dist/lib/server-utils.js +0 -181
- package/dist/lib/server-utils.js.map +0 -1
- package/dist/lib/shared-schemas.d.ts +0 -87
- package/dist/lib/shared-schemas.d.ts.map +0 -1
- package/dist/lib/shared-schemas.js +0 -87
- package/dist/lib/shared-schemas.js.map +0 -1
- package/dist/lib/shared-schemas.test.d.ts.map +0 -1
- package/dist/lib/shared-schemas.test.js +0 -106
- package/dist/lib/shared-schemas.test.js.map +0 -1
- package/dist/lib/toon-encoder.d.ts +0 -26
- package/dist/lib/toon-encoder.d.ts.map +0 -1
- package/dist/lib/toon-encoder.js +0 -61
- package/dist/lib/toon-encoder.js.map +0 -1
- package/dist/lib/toon-encoder.test.d.ts.map +0 -1
- package/dist/lib/toon-encoder.test.js +0 -85
- package/dist/lib/toon-encoder.test.js.map +0 -1
- package/dist/lib/verification-events.d.ts +0 -100
- package/dist/lib/verification-events.d.ts.map +0 -1
- package/dist/lib/verification-events.js +0 -162
- package/dist/lib/verification-events.js.map +0 -1
- package/dist/lib/verification-events.test.d.ts.map +0 -1
- package/dist/lib/verification-events.test.js +0 -193
- package/dist/lib/verification-events.test.js.map +0 -1
- package/dist/tools/signoz.integration.test.d.ts +0 -8
- package/dist/tools/signoz.integration.test.d.ts.map +0 -1
- package/dist/tools/signoz.integration.test.js +0 -141
- package/dist/tools/signoz.integration.test.js.map +0 -1
- package/dist/types/evaluation-hooks.d.ts +0 -176
- package/dist/types/evaluation-hooks.d.ts.map +0 -1
- package/dist/types/evaluation-hooks.js +0 -49
- package/dist/types/evaluation-hooks.js.map +0 -1
- /package/dist/lib/{agent-as-judge.test.d.ts → agent-judge/agent-as-judge.test.d.ts} +0 -0
- /package/dist/lib/{verification-events.test.d.ts → audit/verification-events.test.d.ts} +0 -0
- /package/dist/lib/{constants-symlink.test.d.ts → core/constants-symlink.test.d.ts} +0 -0
- /package/dist/lib/{constants.test.d.ts → core/constants.test.d.ts} +0 -0
- /package/dist/lib/{edge-cases.test.d.ts → core/edge-cases.test.d.ts} +0 -0
- /package/dist/lib/{file-utils.test.d.ts → core/file-utils.test.d.ts} +0 -0
- /package/dist/lib/{input-validator.fuzz.test.d.ts → core/input-validator.fuzz.test.d.ts} +0 -0
- /package/dist/lib/{input-validator.test.d.ts → core/input-validator.test.d.ts} +0 -0
- /package/dist/lib/{logger.test.d.ts → core/logger.test.d.ts} +0 -0
- /package/dist/lib/{logger.test.js → core/logger.test.js} +0 -0
- /package/dist/lib/{shared-schemas.test.d.ts → core/shared-schemas.test.d.ts} +0 -0
- /package/dist/lib/{error-sanitizer.test.d.ts → errors/error-sanitizer.test.d.ts} +0 -0
- /package/dist/lib/{error-types.test.d.ts → errors/error-types.test.d.ts} +0 -0
- /package/dist/lib/{query-sanitizer.d.ts → errors/query-sanitizer.d.ts} +0 -0
- /package/dist/lib/{query-sanitizer.test.d.ts → errors/query-sanitizer.test.d.ts} +0 -0
- /package/dist/lib/{confident-export.test.d.ts → exports/confident-export.test.d.ts} +0 -0
- /package/dist/lib/{export-utils.test.d.ts → exports/export-utils.test.d.ts} +0 -0
- /package/dist/lib/{langfuse-export.test.d.ts → exports/langfuse-export.test.d.ts} +0 -0
- /package/dist/lib/{phoenix-export.test.d.ts → exports/phoenix-export.test.d.ts} +0 -0
- /package/dist/lib/{evaluation-hooks.test.d.ts → judge/evaluation-hooks.test.d.ts} +0 -0
- /package/dist/lib/{llm-as-judge.test.d.ts → judge/llm-as-judge.test.d.ts} +0 -0
- /package/dist/lib/{histogram.test.d.ts → observability/histogram.test.d.ts} +0 -0
- /package/dist/lib/{indexer.test.d.ts → observability/indexer.test.d.ts} +0 -0
- /package/dist/lib/{instrumentation.integration.test.d.ts → observability/instrumentation.integration.test.d.ts} +0 -0
- /package/dist/lib/{instrumentation.test.d.ts → observability/instrumentation.test.d.ts} +0 -0
- /package/dist/lib/{metrics.test.d.ts → observability/metrics.test.d.ts} +0 -0
- /package/dist/lib/{parse-stats.d.ts → observability/parse-stats.d.ts} +0 -0
- /package/dist/lib/{parse-stats.test.d.ts → observability/parse-stats.test.d.ts} +0 -0
- /package/dist/lib/{cache.test.d.ts → resilience/cache.test.d.ts} +0 -0
- /package/dist/lib/{circuit-breaker.test.d.ts → resilience/circuit-breaker.test.d.ts} +0 -0
- /package/dist/lib/{toon-encoder.test.d.ts → resilience/toon-encoder.test.d.ts} +0 -0
|
@@ -1,30 +1,58 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tests for query-evaluations tool
|
|
3
3
|
*/
|
|
4
|
-
import { describe, it, beforeEach, afterEach,
|
|
4
|
+
import { describe, it, beforeEach, afterEach, vi } from 'vitest';
|
|
5
5
|
import assert from 'node:assert';
|
|
6
|
-
import { queryEvaluations, queryEvaluationsSchema, queryEvaluationsTool, buildAggregations } from './query-evaluations.js';
|
|
6
|
+
import { queryEvaluations, queryEvaluationsSchema, queryEvaluationsTool, buildAggregations, MAX_RETURNED_EVALUATIONS, MAX_AGGREGATION_GROUPS, } from './query-evaluations.js';
|
|
7
7
|
import { LocalJsonlBackend } from '../backends/local-jsonl.js';
|
|
8
|
+
import { DEFAULT_LIMIT } from '../lib/core/input-validator.js';
|
|
8
9
|
import { validateToolDefinition } from '../test-helpers/tool-validators.js';
|
|
9
10
|
import { validateLimitSchema, validateDateRangeSchema } from '../test-helpers/schema-validators.js';
|
|
10
|
-
import { TEST_TIMESTAMP_ISO } from '../test-helpers/test-data-builders.js';
|
|
11
|
-
|
|
11
|
+
import { TEST_TIMESTAMP_ISO, FLOAT_TOLERANCE, testTraceId } from '../test-helpers/test-data-builders.js';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Test fixture score values
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
const SCORE_HIGH = 0.9;
|
|
16
|
+
const SCORE_MID = 0.8;
|
|
17
|
+
const SCORE_LOW = 0.7;
|
|
18
|
+
const SCORE_FAIL = 0.3;
|
|
19
|
+
const SCORE_HALF = 0.5;
|
|
20
|
+
const SCORE_DETAIL = 0.92;
|
|
21
|
+
const SCORE_SINGLE = 0.75;
|
|
22
|
+
const SCORE_AVG_MID_HIGH = 0.85; // (0.8 + 0.9) / 2
|
|
23
|
+
const SCORE_AVG_THREE = 0.9; // (0.8 + 0.9 + 1.0) / 3
|
|
24
|
+
// Test fixture expected percentile bounds
|
|
25
|
+
const P95_LOWER = 0.95;
|
|
26
|
+
const P95_UPPER = 0.96;
|
|
27
|
+
const P99_LOWER = 0.99;
|
|
28
|
+
const P50_INTERPOLATED = 0.25; // R-7: interpolate between 0.2 and 0.3
|
|
29
|
+
// Test fixture generation
|
|
30
|
+
const SCORE_BASE = 0.8;
|
|
31
|
+
const SCORE_INCREMENT = 0.01;
|
|
32
|
+
const PERCENTILE_SAMPLE_COUNT = 100;
|
|
33
|
+
const MANY_EVALUATIONS_COUNT = 30;
|
|
34
|
+
const UNKNOWN_UNIT_SCORE = 5;
|
|
35
|
+
const TIMESTAMP_PAD_LENGTH = 2;
|
|
36
|
+
// Expected assertion counts
|
|
37
|
+
const EXPECTED_PAIR_COUNT = 2;
|
|
38
|
+
const EXPECTED_TRIPLE_COUNT = 3;
|
|
39
|
+
void describe('queryEvaluations', () => {
|
|
12
40
|
// Use shared schema validators
|
|
13
|
-
validateLimitSchema(queryEvaluationsSchema, 'queryEvaluationsSchema',
|
|
41
|
+
validateLimitSchema(queryEvaluationsSchema, 'queryEvaluationsSchema', DEFAULT_LIMIT);
|
|
14
42
|
validateDateRangeSchema(queryEvaluationsSchema, 'queryEvaluationsSchema');
|
|
15
|
-
describe('schema validation', () => {
|
|
16
|
-
it('should accept empty input with defaults', () => {
|
|
43
|
+
void describe('schema validation', () => {
|
|
44
|
+
void it('should accept empty input with defaults', () => {
|
|
17
45
|
const result = queryEvaluationsSchema.parse({});
|
|
18
|
-
assert.strictEqual(result.limit,
|
|
46
|
+
assert.strictEqual(result.limit, DEFAULT_LIMIT);
|
|
19
47
|
});
|
|
20
|
-
it('should accept all optional parameters', () => {
|
|
48
|
+
void it('should accept all optional parameters', () => {
|
|
21
49
|
const input = {
|
|
22
50
|
evaluationName: 'Relevance',
|
|
23
|
-
scoreMin:
|
|
51
|
+
scoreMin: SCORE_HALF,
|
|
24
52
|
scoreMax: 1.0,
|
|
25
53
|
scoreLabel: 'pass',
|
|
26
54
|
responseId: 'resp-123',
|
|
27
|
-
traceId:
|
|
55
|
+
traceId: testTraceId(1),
|
|
28
56
|
sessionId: 'sess-123',
|
|
29
57
|
startDate: '2026-01-28',
|
|
30
58
|
endDate: '2026-01-28',
|
|
@@ -32,164 +60,153 @@ describe('queryEvaluations', () => {
|
|
|
32
60
|
};
|
|
33
61
|
const result = queryEvaluationsSchema.parse(input);
|
|
34
62
|
assert.strictEqual(result.evaluationName, 'Relevance');
|
|
35
|
-
assert.strictEqual(result.scoreMin,
|
|
63
|
+
assert.strictEqual(result.scoreMin, SCORE_HALF);
|
|
36
64
|
assert.strictEqual(result.scoreMax, 1.0);
|
|
37
65
|
assert.strictEqual(result.scoreLabel, 'pass');
|
|
38
66
|
});
|
|
39
|
-
it('should enforce max limit of 1000', () => {
|
|
67
|
+
void it('should enforce max limit of 1000', () => {
|
|
40
68
|
assert.throws(() => {
|
|
41
69
|
queryEvaluationsSchema.parse({ limit: 1001 });
|
|
42
70
|
});
|
|
43
71
|
});
|
|
44
72
|
});
|
|
45
|
-
describe('score range validation (P1-3)', () => {
|
|
73
|
+
void describe('score range validation (P1-3)', () => {
|
|
46
74
|
let originalQueryEvaluations;
|
|
47
75
|
beforeEach(() => {
|
|
48
76
|
originalQueryEvaluations = LocalJsonlBackend.prototype.queryEvaluations;
|
|
49
|
-
LocalJsonlBackend.prototype.queryEvaluations =
|
|
77
|
+
LocalJsonlBackend.prototype.queryEvaluations = vi.fn(async () => []);
|
|
50
78
|
});
|
|
51
79
|
afterEach(() => {
|
|
52
80
|
LocalJsonlBackend.prototype.queryEvaluations = originalQueryEvaluations;
|
|
53
81
|
});
|
|
54
|
-
it('should reject inverted score range (scoreMin > scoreMax)', async () => {
|
|
55
|
-
await assert.rejects(async () => queryEvaluations({ scoreMin: 0.9, scoreMax: 0.1 }), /
|
|
82
|
+
void it('should reject inverted score range (scoreMin > scoreMax)', async () => {
|
|
83
|
+
await assert.rejects(async () => queryEvaluations({ scoreMin: 0.9, scoreMax: 0.1 }), /scoreMin.*cannot exceed.*scoreMax/);
|
|
56
84
|
});
|
|
57
|
-
it('should accept valid score range (scoreMin < scoreMax)', async () => {
|
|
58
|
-
const result = await queryEvaluations({ scoreMin:
|
|
85
|
+
void it('should accept valid score range (scoreMin < scoreMax)', async () => {
|
|
86
|
+
const result = await queryEvaluations({ scoreMin: SCORE_FAIL, scoreMax: SCORE_MID });
|
|
59
87
|
assert.strictEqual(result.count, 0); // Empty mocked response
|
|
60
88
|
});
|
|
61
|
-
it('should accept equal scoreMin and scoreMax', async () => {
|
|
62
|
-
const result = await queryEvaluations({ scoreMin:
|
|
89
|
+
void it('should accept equal scoreMin and scoreMax', async () => {
|
|
90
|
+
const result = await queryEvaluations({ scoreMin: SCORE_HALF, scoreMax: SCORE_HALF });
|
|
63
91
|
assert.strictEqual(result.count, 0);
|
|
64
92
|
});
|
|
65
|
-
it('should accept scoreMin without scoreMax', async () => {
|
|
66
|
-
const result = await queryEvaluations({ scoreMin:
|
|
93
|
+
void it('should accept scoreMin without scoreMax', async () => {
|
|
94
|
+
const result = await queryEvaluations({ scoreMin: SCORE_HALF });
|
|
67
95
|
assert.strictEqual(result.count, 0);
|
|
68
96
|
});
|
|
69
|
-
it('should accept scoreMax without scoreMin', async () => {
|
|
70
|
-
const result = await queryEvaluations({ scoreMax:
|
|
97
|
+
void it('should accept scoreMax without scoreMin', async () => {
|
|
98
|
+
const result = await queryEvaluations({ scoreMax: SCORE_MID });
|
|
71
99
|
assert.strictEqual(result.count, 0);
|
|
72
100
|
});
|
|
73
101
|
});
|
|
74
|
-
describe('handler with mocked backend', () => {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
});
|
|
82
|
-
it('should return empty results when no evaluations found', async () => {
|
|
83
|
-
LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => []);
|
|
84
|
-
const result = await queryEvaluations({});
|
|
102
|
+
void describe('handler with mocked backend', () => {
|
|
103
|
+
function createMockBackend(queryFn) {
|
|
104
|
+
return { queryEvaluations: queryFn };
|
|
105
|
+
}
|
|
106
|
+
void it('should return empty results when no evaluations found', async () => {
|
|
107
|
+
const mockBackend = createMockBackend(vi.fn(async () => []));
|
|
108
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
85
109
|
assert.strictEqual(result.count, 0);
|
|
86
110
|
assert.deepStrictEqual(result.evaluations, []);
|
|
87
111
|
assert.strictEqual(result.summary.averageScore, undefined);
|
|
88
112
|
});
|
|
89
|
-
it('should summarize evaluations by name and label', async () => {
|
|
90
|
-
|
|
91
|
-
{ timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue:
|
|
92
|
-
{ timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue:
|
|
93
|
-
{ timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Faithfulness', scoreValue:
|
|
94
|
-
]);
|
|
95
|
-
const result = await queryEvaluations({});
|
|
96
|
-
assert.strictEqual(result.count,
|
|
97
|
-
assert.strictEqual(result.summary.byEvaluationName['Relevance'],
|
|
113
|
+
void it('should summarize evaluations by name and label', async () => {
|
|
114
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
115
|
+
{ timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue: SCORE_HIGH, scoreLabel: 'pass' },
|
|
116
|
+
{ timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue: SCORE_MID, scoreLabel: 'pass' },
|
|
117
|
+
{ timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Faithfulness', scoreValue: SCORE_LOW, scoreLabel: 'fail' },
|
|
118
|
+
]));
|
|
119
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
120
|
+
assert.strictEqual(result.count, EXPECTED_TRIPLE_COUNT);
|
|
121
|
+
assert.strictEqual(result.summary.byEvaluationName['Relevance'], EXPECTED_PAIR_COUNT);
|
|
98
122
|
assert.strictEqual(result.summary.byEvaluationName['Faithfulness'], 1);
|
|
99
|
-
assert.strictEqual(result.summary.byScoreLabel['pass'],
|
|
123
|
+
assert.strictEqual(result.summary.byScoreLabel['pass'], EXPECTED_PAIR_COUNT);
|
|
100
124
|
assert.strictEqual(result.summary.byScoreLabel['fail'], 1);
|
|
101
125
|
});
|
|
102
|
-
it('should calculate average score correctly', async () => {
|
|
103
|
-
|
|
104
|
-
{ timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue:
|
|
105
|
-
{ timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue:
|
|
126
|
+
void it('should calculate average score correctly', async () => {
|
|
127
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
128
|
+
{ timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue: SCORE_MID },
|
|
129
|
+
{ timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue: SCORE_HIGH },
|
|
106
130
|
{ timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'Relevance', scoreValue: 1.0 },
|
|
107
|
-
]);
|
|
108
|
-
const result = await queryEvaluations({});
|
|
109
|
-
assert.strictEqual(result.summary.averageScore,
|
|
131
|
+
]));
|
|
132
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
133
|
+
assert.strictEqual(result.summary.averageScore, SCORE_AVG_THREE);
|
|
110
134
|
});
|
|
111
|
-
it('should handle evaluations without scores', async () => {
|
|
112
|
-
|
|
135
|
+
void it('should handle evaluations without scores', async () => {
|
|
136
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
113
137
|
{ timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'ToolCorrectness', scoreLabel: 'pass' },
|
|
114
138
|
{ timestamp: TEST_TIMESTAMP_ISO, evaluationName: 'ToolCorrectness', scoreLabel: 'fail' },
|
|
115
|
-
]);
|
|
116
|
-
const result = await queryEvaluations({});
|
|
117
|
-
assert.strictEqual(result.count,
|
|
139
|
+
]));
|
|
140
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
141
|
+
assert.strictEqual(result.count, EXPECTED_PAIR_COUNT);
|
|
118
142
|
assert.strictEqual(result.summary.averageScore, undefined);
|
|
119
143
|
assert.strictEqual(result.summary.byScoreLabel['pass'], 1);
|
|
120
144
|
assert.strictEqual(result.summary.byScoreLabel['fail'], 1);
|
|
121
145
|
});
|
|
122
|
-
it('should include all fields in evaluation response', async () => {
|
|
123
|
-
|
|
146
|
+
void it('should include all fields in evaluation response', async () => {
|
|
147
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
124
148
|
{
|
|
125
149
|
timestamp: '2026-01-28T10:00:00Z',
|
|
126
150
|
evaluationName: 'Relevance',
|
|
127
|
-
scoreValue:
|
|
151
|
+
scoreValue: SCORE_DETAIL,
|
|
128
152
|
scoreLabel: 'relevant',
|
|
129
153
|
explanation: 'Response directly addresses the query',
|
|
130
154
|
responseId: 'resp-abc123',
|
|
131
155
|
traceId: 'trace-xyz789',
|
|
132
156
|
sessionId: 'sess-def456',
|
|
133
157
|
},
|
|
134
|
-
]);
|
|
135
|
-
const result = await queryEvaluations({});
|
|
158
|
+
]));
|
|
159
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
136
160
|
const evaluation = result.evaluations[0];
|
|
137
161
|
assert.strictEqual(evaluation.timestamp, '2026-01-28T10:00:00Z');
|
|
138
162
|
assert.strictEqual(evaluation.evaluationName, 'Relevance');
|
|
139
|
-
assert.strictEqual(evaluation.scoreValue,
|
|
163
|
+
assert.strictEqual(evaluation.scoreValue, SCORE_DETAIL);
|
|
140
164
|
assert.strictEqual(evaluation.scoreLabel, 'relevant');
|
|
141
165
|
assert.strictEqual(evaluation.explanation, 'Response directly addresses the query');
|
|
142
166
|
assert.strictEqual(evaluation.responseId, 'resp-abc123');
|
|
143
167
|
assert.strictEqual(evaluation.traceId, 'trace-xyz789');
|
|
144
168
|
assert.strictEqual(evaluation.sessionId, 'sess-def456');
|
|
145
169
|
});
|
|
146
|
-
it('should limit returned evaluations to
|
|
147
|
-
const manyEvaluations = Array.from({ length:
|
|
148
|
-
timestamp: `2026-01-28T10:${String(i).padStart(
|
|
170
|
+
void it('should limit returned evaluations to MAX_RETURNED_EVALUATIONS', async () => {
|
|
171
|
+
const manyEvaluations = Array.from({ length: MANY_EVALUATIONS_COUNT }, (_, i) => ({
|
|
172
|
+
timestamp: `2026-01-28T10:${String(i).padStart(TIMESTAMP_PAD_LENGTH, '0')}:00Z`,
|
|
149
173
|
evaluationName: 'Relevance',
|
|
150
|
-
scoreValue:
|
|
174
|
+
scoreValue: SCORE_BASE + (i * SCORE_INCREMENT),
|
|
151
175
|
}));
|
|
152
|
-
|
|
153
|
-
const result = await queryEvaluations({});
|
|
154
|
-
assert.strictEqual(result.count,
|
|
155
|
-
assert.strictEqual(result.evaluations.length,
|
|
176
|
+
const mockBackend = { queryEvaluations: vi.fn(async () => manyEvaluations) };
|
|
177
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
178
|
+
assert.strictEqual(result.count, MANY_EVALUATIONS_COUNT);
|
|
179
|
+
assert.strictEqual(result.evaluations.length, MAX_RETURNED_EVALUATIONS);
|
|
156
180
|
});
|
|
157
181
|
});
|
|
158
|
-
describe('OTel GenAI compliance', () => {
|
|
159
|
-
|
|
160
|
-
beforeEach(() => {
|
|
161
|
-
originalQueryEvaluations = LocalJsonlBackend.prototype.queryEvaluations;
|
|
162
|
-
});
|
|
163
|
-
afterEach(() => {
|
|
164
|
-
LocalJsonlBackend.prototype.queryEvaluations = originalQueryEvaluations;
|
|
165
|
-
});
|
|
166
|
-
it('should accept evaluationName filter', () => {
|
|
182
|
+
void describe('OTel GenAI compliance', () => {
|
|
183
|
+
void it('should accept evaluationName filter', () => {
|
|
167
184
|
const input = { evaluationName: 'Relevance' };
|
|
168
185
|
const result = queryEvaluationsSchema.parse(input);
|
|
169
186
|
assert.strictEqual(result.evaluationName, 'Relevance');
|
|
170
187
|
});
|
|
171
|
-
it('should accept score range filters', () => {
|
|
172
|
-
const input = { scoreMin:
|
|
188
|
+
void it('should accept score range filters', () => {
|
|
189
|
+
const input = { scoreMin: SCORE_HALF, scoreMax: SCORE_HIGH };
|
|
173
190
|
const result = queryEvaluationsSchema.parse(input);
|
|
174
|
-
assert.strictEqual(result.scoreMin,
|
|
175
|
-
assert.strictEqual(result.scoreMax,
|
|
191
|
+
assert.strictEqual(result.scoreMin, SCORE_HALF);
|
|
192
|
+
assert.strictEqual(result.scoreMax, SCORE_HIGH);
|
|
176
193
|
});
|
|
177
|
-
it('should accept scoreLabel filter', () => {
|
|
194
|
+
void it('should accept scoreLabel filter', () => {
|
|
178
195
|
const input = { scoreLabel: 'pass' };
|
|
179
196
|
const result = queryEvaluationsSchema.parse(input);
|
|
180
197
|
assert.strictEqual(result.scoreLabel, 'pass');
|
|
181
198
|
});
|
|
182
|
-
it('should accept responseId filter for correlation', () => {
|
|
199
|
+
void it('should accept responseId filter for correlation', () => {
|
|
183
200
|
const input = { responseId: 'resp-12345' };
|
|
184
201
|
const result = queryEvaluationsSchema.parse(input);
|
|
185
202
|
assert.strictEqual(result.responseId, 'resp-12345');
|
|
186
203
|
});
|
|
187
|
-
it('should accept traceId filter for trace correlation', () => {
|
|
188
|
-
const input = { traceId:
|
|
204
|
+
void it('should accept traceId filter for trace correlation', () => {
|
|
205
|
+
const input = { traceId: testTraceId(2) };
|
|
189
206
|
const result = queryEvaluationsSchema.parse(input);
|
|
190
|
-
assert.strictEqual(result.traceId,
|
|
207
|
+
assert.strictEqual(result.traceId, testTraceId(2));
|
|
191
208
|
});
|
|
192
|
-
it('should accept sessionId filter for session-scoped queries', () => {
|
|
209
|
+
void it('should accept sessionId filter for session-scoped queries', () => {
|
|
193
210
|
const input = { sessionId: 'session-12345' };
|
|
194
211
|
const result = queryEvaluationsSchema.parse(input);
|
|
195
212
|
assert.strictEqual(result.sessionId, 'session-12345');
|
|
@@ -197,539 +214,517 @@ describe('queryEvaluations', () => {
|
|
|
197
214
|
});
|
|
198
215
|
// Use shared tool definition validator
|
|
199
216
|
validateToolDefinition(queryEvaluationsTool, 'obs_query_evaluations', queryEvaluationsSchema, queryEvaluations, ['gen_ai.evaluation.result', 'aggregations']);
|
|
200
|
-
describe('aggregation schema', () => {
|
|
201
|
-
it('should accept aggregation parameter', () => {
|
|
217
|
+
void describe('aggregation schema', () => {
|
|
218
|
+
void it('should accept aggregation parameter', () => {
|
|
202
219
|
const input = { aggregation: 'avg' };
|
|
203
220
|
const result = queryEvaluationsSchema.parse(input);
|
|
204
221
|
assert.strictEqual(result.aggregation, 'avg');
|
|
205
222
|
});
|
|
206
|
-
it('should accept all aggregation types', () => {
|
|
223
|
+
void it('should accept all aggregation types', () => {
|
|
207
224
|
const types = ['avg', 'min', 'max', 'count', 'p50', 'p95', 'p99'];
|
|
208
225
|
for (const type of types) {
|
|
209
226
|
const result = queryEvaluationsSchema.parse({ aggregation: type });
|
|
210
227
|
assert.strictEqual(result.aggregation, type);
|
|
211
228
|
}
|
|
212
229
|
});
|
|
213
|
-
it('should reject invalid aggregation type', () => {
|
|
230
|
+
void it('should reject invalid aggregation type', () => {
|
|
214
231
|
assert.throws(() => {
|
|
215
232
|
queryEvaluationsSchema.parse({ aggregation: 'invalid' });
|
|
216
233
|
});
|
|
217
234
|
});
|
|
218
|
-
it('should accept groupBy parameter', () => {
|
|
235
|
+
void it('should accept groupBy parameter', () => {
|
|
219
236
|
const input = { groupBy: ['evaluationName'] };
|
|
220
237
|
const result = queryEvaluationsSchema.parse(input);
|
|
221
238
|
assert.deepStrictEqual(result.groupBy, ['evaluationName']);
|
|
222
239
|
});
|
|
223
|
-
it('should accept multiple groupBy fields', () => {
|
|
240
|
+
void it('should accept multiple groupBy fields', () => {
|
|
224
241
|
const input = { groupBy: ['evaluationName', 'scoreLabel'] };
|
|
225
242
|
const result = queryEvaluationsSchema.parse(input);
|
|
226
243
|
assert.deepStrictEqual(result.groupBy, ['evaluationName', 'scoreLabel']);
|
|
227
244
|
});
|
|
228
|
-
it('should reject invalid groupBy field', () => {
|
|
245
|
+
void it('should reject invalid groupBy field', () => {
|
|
229
246
|
assert.throws(() => {
|
|
230
247
|
queryEvaluationsSchema.parse({ groupBy: ['invalidField'] });
|
|
231
248
|
});
|
|
232
249
|
});
|
|
233
250
|
});
|
|
234
|
-
describe('aggregation handler', () => {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
it('should calculate avg aggregation', async () => {
|
|
243
|
-
LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
|
|
244
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.8 },
|
|
245
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.9 },
|
|
251
|
+
void describe('aggregation handler', () => {
|
|
252
|
+
function createMockBackend(queryFn) {
|
|
253
|
+
return { queryEvaluations: queryFn };
|
|
254
|
+
}
|
|
255
|
+
void it('should calculate avg aggregation', async () => {
|
|
256
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
257
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID },
|
|
258
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH },
|
|
246
259
|
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: 1.0 },
|
|
247
|
-
]);
|
|
248
|
-
const result = await queryEvaluations({ aggregation: 'avg' });
|
|
260
|
+
]));
|
|
261
|
+
const result = await queryEvaluations({ aggregation: 'avg' }, { localBackend: mockBackend });
|
|
249
262
|
assert.ok(result.summary.aggregations);
|
|
250
263
|
assert.strictEqual(result.summary.aggregations.length, 1);
|
|
251
|
-
assert.strictEqual(result.summary.aggregations[0].value,
|
|
252
|
-
assert.strictEqual(result.summary.aggregations[0].count,
|
|
253
|
-
});
|
|
254
|
-
it('should calculate min aggregation', async () => {
|
|
255
|
-
|
|
256
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
257
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue:
|
|
258
|
-
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue:
|
|
259
|
-
]);
|
|
260
|
-
const result = await queryEvaluations({ aggregation: 'min' });
|
|
264
|
+
assert.strictEqual(result.summary.aggregations[0].value, SCORE_AVG_THREE);
|
|
265
|
+
assert.strictEqual(result.summary.aggregations[0].count, EXPECTED_TRIPLE_COUNT);
|
|
266
|
+
});
|
|
267
|
+
void it('should calculate min aggregation', async () => {
|
|
268
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
269
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID },
|
|
270
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HALF },
|
|
271
|
+
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH },
|
|
272
|
+
]));
|
|
273
|
+
const result = await queryEvaluations({ aggregation: 'min' }, { localBackend: mockBackend });
|
|
261
274
|
assert.ok(result.summary.aggregations);
|
|
262
|
-
assert.strictEqual(result.summary.aggregations[0].value,
|
|
263
|
-
});
|
|
264
|
-
it('should calculate max aggregation', async () => {
|
|
265
|
-
|
|
266
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
267
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue:
|
|
268
|
-
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue:
|
|
269
|
-
]);
|
|
270
|
-
const result = await queryEvaluations({ aggregation: 'max' });
|
|
275
|
+
assert.strictEqual(result.summary.aggregations[0].value, SCORE_HALF);
|
|
276
|
+
});
|
|
277
|
+
void it('should calculate max aggregation', async () => {
|
|
278
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
279
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID },
|
|
280
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HALF },
|
|
281
|
+
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH },
|
|
282
|
+
]));
|
|
283
|
+
const result = await queryEvaluations({ aggregation: 'max' }, { localBackend: mockBackend });
|
|
271
284
|
assert.ok(result.summary.aggregations);
|
|
272
|
-
assert.strictEqual(result.summary.aggregations[0].value,
|
|
285
|
+
assert.strictEqual(result.summary.aggregations[0].value, SCORE_HIGH);
|
|
273
286
|
});
|
|
274
|
-
it('should calculate count aggregation', async () => {
|
|
275
|
-
|
|
276
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
277
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue:
|
|
287
|
+
void it('should calculate count aggregation', async () => {
|
|
288
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
289
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID },
|
|
290
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HALF },
|
|
278
291
|
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Faithfulness', scoreLabel: 'pass' },
|
|
279
|
-
]);
|
|
280
|
-
const result = await queryEvaluations({ aggregation: 'count' });
|
|
292
|
+
]));
|
|
293
|
+
const result = await queryEvaluations({ aggregation: 'count' }, { localBackend: mockBackend });
|
|
281
294
|
assert.ok(result.summary.aggregations);
|
|
282
|
-
assert.strictEqual(result.summary.aggregations[0].count,
|
|
283
|
-
assert.strictEqual(result.summary.aggregations[0].value,
|
|
295
|
+
assert.strictEqual(result.summary.aggregations[0].count, EXPECTED_TRIPLE_COUNT);
|
|
296
|
+
assert.strictEqual(result.summary.aggregations[0].value, EXPECTED_TRIPLE_COUNT);
|
|
284
297
|
});
|
|
285
|
-
it('should calculate p50 percentile', async () => {
|
|
286
|
-
|
|
298
|
+
void it('should calculate p50 percentile', async () => {
|
|
299
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
287
300
|
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.1 },
|
|
288
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue:
|
|
289
|
-
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue:
|
|
290
|
-
]);
|
|
291
|
-
const result = await queryEvaluations({ aggregation: 'p50' });
|
|
301
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HALF },
|
|
302
|
+
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH },
|
|
303
|
+
]));
|
|
304
|
+
const result = await queryEvaluations({ aggregation: 'p50' }, { localBackend: mockBackend });
|
|
292
305
|
assert.ok(result.summary.aggregations);
|
|
293
|
-
assert.strictEqual(result.summary.aggregations[0].value,
|
|
306
|
+
assert.strictEqual(result.summary.aggregations[0].value, SCORE_HALF);
|
|
294
307
|
});
|
|
295
|
-
it('should calculate p95 percentile with linear interpolation', async () => {
|
|
296
|
-
const values = Array.from({ length:
|
|
308
|
+
void it('should calculate p95 percentile with linear interpolation', async () => {
|
|
309
|
+
const values = Array.from({ length: PERCENTILE_SAMPLE_COUNT }, (_, i) => ({
|
|
297
310
|
timestamp: '2026-01-28T10:00:00Z',
|
|
298
311
|
evaluationName: 'Relevance',
|
|
299
|
-
scoreValue: (i + 1) /
|
|
312
|
+
scoreValue: (i + 1) / PERCENTILE_SAMPLE_COUNT,
|
|
300
313
|
}));
|
|
301
|
-
|
|
302
|
-
const result = await queryEvaluations({ aggregation: 'p95', limit: 1000 });
|
|
314
|
+
const mockBackend = createMockBackend(vi.fn(async () => values));
|
|
315
|
+
const result = await queryEvaluations({ aggregation: 'p95', limit: 1000 }, { localBackend: mockBackend });
|
|
303
316
|
assert.ok(result.summary.aggregations);
|
|
304
317
|
// R-7 linear interpolation: rank = 0.95 * 99 = 94.05
|
|
305
318
|
// Interpolate between index 94 (0.95) and index 95 (0.96)
|
|
306
319
|
const value = result.summary.aggregations[0].value;
|
|
307
|
-
assert.ok(value
|
|
320
|
+
assert.ok(value !== undefined);
|
|
321
|
+
assert.ok(value >= P95_LOWER && value <= P95_UPPER, `Expected p95 between 0.95-0.96, got ${value}`);
|
|
308
322
|
});
|
|
309
|
-
it('should calculate p99 percentile with linear interpolation', async () => {
|
|
310
|
-
const values = Array.from({ length:
|
|
323
|
+
void it('should calculate p99 percentile with linear interpolation', async () => {
|
|
324
|
+
const values = Array.from({ length: PERCENTILE_SAMPLE_COUNT }, (_, i) => ({
|
|
311
325
|
timestamp: '2026-01-28T10:00:00Z',
|
|
312
326
|
evaluationName: 'Relevance',
|
|
313
|
-
scoreValue: (i + 1) /
|
|
327
|
+
scoreValue: (i + 1) / PERCENTILE_SAMPLE_COUNT,
|
|
314
328
|
}));
|
|
315
|
-
|
|
316
|
-
const result = await queryEvaluations({ aggregation: 'p99', limit: 1000 });
|
|
329
|
+
const mockBackend = createMockBackend(vi.fn(async () => values));
|
|
330
|
+
const result = await queryEvaluations({ aggregation: 'p99', limit: 1000 }, { localBackend: mockBackend });
|
|
317
331
|
assert.ok(result.summary.aggregations);
|
|
318
332
|
// R-7 linear interpolation: rank = 0.99 * 99 = 98.01
|
|
319
333
|
// Interpolate between index 98 (0.99) and index 99 (1.00)
|
|
320
334
|
const value = result.summary.aggregations[0].value;
|
|
321
|
-
assert.ok(value
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
{ timestamp: '2026-01-28T10:
|
|
327
|
-
{ timestamp: '2026-01-28T10:
|
|
328
|
-
|
|
329
|
-
|
|
335
|
+
assert.ok(value !== undefined);
|
|
336
|
+
assert.ok(value >= P99_LOWER && value <= 1.0, `Expected p99 between 0.99-1.0, got ${value}`);
|
|
337
|
+
});
|
|
338
|
+
void it('should group by evaluationName', async () => {
|
|
339
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
340
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID },
|
|
341
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH },
|
|
342
|
+
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Faithfulness', scoreValue: SCORE_LOW },
|
|
343
|
+
]));
|
|
344
|
+
const result = await queryEvaluations({ aggregation: 'avg', groupBy: ['evaluationName'] }, { localBackend: mockBackend });
|
|
330
345
|
assert.ok(result.summary.aggregations);
|
|
331
|
-
assert.strictEqual(result.summary.aggregations.length,
|
|
346
|
+
assert.strictEqual(result.summary.aggregations.length, EXPECTED_PAIR_COUNT);
|
|
332
347
|
const relevance = result.summary.aggregations.find(a => a.evaluationName === 'Relevance');
|
|
333
348
|
const faithfulness = result.summary.aggregations.find(a => a.evaluationName === 'Faithfulness');
|
|
334
349
|
assert.ok(relevance);
|
|
335
|
-
assert.ok(Math.abs((relevance.value ?? 0) -
|
|
336
|
-
assert.strictEqual(relevance.count,
|
|
350
|
+
assert.ok(Math.abs((relevance.value ?? 0) - SCORE_AVG_MID_HIGH) < FLOAT_TOLERANCE, `Expected ~0.85, got ${relevance.value}`);
|
|
351
|
+
assert.strictEqual(relevance.count, EXPECTED_PAIR_COUNT);
|
|
337
352
|
assert.ok(faithfulness);
|
|
338
|
-
assert.strictEqual(faithfulness.value,
|
|
353
|
+
assert.strictEqual(faithfulness.value, SCORE_LOW);
|
|
339
354
|
assert.strictEqual(faithfulness.count, 1);
|
|
340
355
|
});
|
|
341
|
-
it('should group by scoreLabel', async () => {
|
|
342
|
-
|
|
343
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
344
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue:
|
|
345
|
-
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue:
|
|
346
|
-
]);
|
|
347
|
-
const result = await queryEvaluations({ aggregation: 'avg', groupBy: ['scoreLabel'] });
|
|
356
|
+
void it('should group by scoreLabel', async () => {
|
|
357
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
358
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, scoreLabel: 'pass' },
|
|
359
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID, scoreLabel: 'pass' },
|
|
360
|
+
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_FAIL, scoreLabel: 'fail' },
|
|
361
|
+
]));
|
|
362
|
+
const result = await queryEvaluations({ aggregation: 'avg', groupBy: ['scoreLabel'] }, { localBackend: mockBackend });
|
|
348
363
|
assert.ok(result.summary.aggregations);
|
|
349
|
-
assert.strictEqual(result.summary.aggregations.length,
|
|
364
|
+
assert.strictEqual(result.summary.aggregations.length, EXPECTED_PAIR_COUNT);
|
|
350
365
|
const pass = result.summary.aggregations.find(a => a.scoreLabel === 'pass');
|
|
351
366
|
const fail = result.summary.aggregations.find(a => a.scoreLabel === 'fail');
|
|
352
367
|
assert.ok(pass);
|
|
353
|
-
assert.ok(Math.abs((pass.value ?? 0) -
|
|
368
|
+
assert.ok(Math.abs((pass.value ?? 0) - SCORE_AVG_MID_HIGH) < FLOAT_TOLERANCE, `Expected ~0.85, got ${pass.value}`);
|
|
354
369
|
assert.ok(fail);
|
|
355
|
-
assert.strictEqual(fail.value,
|
|
356
|
-
});
|
|
357
|
-
it('should group by multiple fields', async () => {
|
|
358
|
-
|
|
359
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
360
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue:
|
|
361
|
-
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Faithfulness', scoreValue:
|
|
362
|
-
]);
|
|
363
|
-
const result = await queryEvaluations({ aggregation: 'count', groupBy: ['evaluationName', 'scoreLabel'] });
|
|
370
|
+
assert.strictEqual(fail.value, SCORE_FAIL);
|
|
371
|
+
});
|
|
372
|
+
void it('should group by multiple fields', async () => {
|
|
373
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
374
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, scoreLabel: 'pass' },
|
|
375
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_FAIL, scoreLabel: 'fail' },
|
|
376
|
+
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Faithfulness', scoreValue: SCORE_MID, scoreLabel: 'pass' },
|
|
377
|
+
]));
|
|
378
|
+
const result = await queryEvaluations({ aggregation: 'count', groupBy: ['evaluationName', 'scoreLabel'] }, { localBackend: mockBackend });
|
|
364
379
|
assert.ok(result.summary.aggregations);
|
|
365
|
-
assert.strictEqual(result.summary.aggregations.length,
|
|
380
|
+
assert.strictEqual(result.summary.aggregations.length, EXPECTED_TRIPLE_COUNT);
|
|
366
381
|
});
|
|
367
|
-
it('should handle empty results with aggregation', async () => {
|
|
368
|
-
|
|
369
|
-
const result = await queryEvaluations({ aggregation: 'avg' });
|
|
382
|
+
void it('should handle empty results with aggregation', async () => {
|
|
383
|
+
const mockBackend = createMockBackend(vi.fn(async () => []));
|
|
384
|
+
const result = await queryEvaluations({ aggregation: 'avg' }, { localBackend: mockBackend });
|
|
370
385
|
assert.ok(result.summary.aggregations);
|
|
371
386
|
assert.strictEqual(result.summary.aggregations.length, 0);
|
|
372
387
|
});
|
|
373
|
-
it('should handle evaluations without scores in aggregation', async () => {
|
|
374
|
-
|
|
388
|
+
void it('should handle evaluations without scores in aggregation', async () => {
|
|
389
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
375
390
|
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'ToolCorrectness', scoreLabel: 'pass' },
|
|
376
391
|
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'ToolCorrectness', scoreLabel: 'fail' },
|
|
377
|
-
]);
|
|
378
|
-
const result = await queryEvaluations({ aggregation: 'avg' });
|
|
392
|
+
]));
|
|
393
|
+
const result = await queryEvaluations({ aggregation: 'avg' }, { localBackend: mockBackend });
|
|
379
394
|
assert.ok(result.summary.aggregations);
|
|
380
|
-
assert.strictEqual(result.summary.aggregations[0].count,
|
|
395
|
+
assert.strictEqual(result.summary.aggregations[0].count, EXPECTED_PAIR_COUNT);
|
|
381
396
|
assert.strictEqual(result.summary.aggregations[0].value, undefined);
|
|
382
397
|
});
|
|
383
|
-
it('should not include aggregations when aggregation not requested', async () => {
|
|
384
|
-
|
|
385
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
386
|
-
]);
|
|
387
|
-
const result = await queryEvaluations({});
|
|
398
|
+
void it('should not include aggregations when aggregation not requested', async () => {
|
|
399
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
400
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID },
|
|
401
|
+
]));
|
|
402
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
388
403
|
assert.strictEqual(result.summary.aggregations, undefined);
|
|
389
404
|
});
|
|
390
405
|
// P1-2: min/max should return undefined, not Infinity, when no scores
|
|
391
|
-
it('should return undefined for min aggregation when no scores (P1-2)', async () => {
|
|
392
|
-
|
|
406
|
+
void it('should return undefined for min aggregation when no scores (P1-2)', async () => {
|
|
407
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
393
408
|
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'ToolCorrectness', scoreLabel: 'pass' },
|
|
394
409
|
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'ToolCorrectness', scoreLabel: 'fail' },
|
|
395
|
-
]);
|
|
396
|
-
const result = await queryEvaluations({ aggregation: 'min' });
|
|
410
|
+
]));
|
|
411
|
+
const result = await queryEvaluations({ aggregation: 'min' }, { localBackend: mockBackend });
|
|
397
412
|
assert.ok(result.summary.aggregations);
|
|
398
|
-
assert.strictEqual(result.summary.aggregations[0].count,
|
|
413
|
+
assert.strictEqual(result.summary.aggregations[0].count, EXPECTED_PAIR_COUNT);
|
|
399
414
|
assert.strictEqual(result.summary.aggregations[0].value, undefined);
|
|
400
415
|
});
|
|
401
|
-
it('should return undefined for max aggregation when no scores (P1-2)', async () => {
|
|
402
|
-
|
|
416
|
+
void it('should return undefined for max aggregation when no scores (P1-2)', async () => {
|
|
417
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
403
418
|
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'ToolCorrectness', scoreLabel: 'pass' },
|
|
404
|
-
]);
|
|
405
|
-
const result = await queryEvaluations({ aggregation: 'max' });
|
|
419
|
+
]));
|
|
420
|
+
const result = await queryEvaluations({ aggregation: 'max' }, { localBackend: mockBackend });
|
|
406
421
|
assert.ok(result.summary.aggregations);
|
|
407
422
|
assert.strictEqual(result.summary.aggregations[0].value, undefined);
|
|
408
423
|
});
|
|
409
424
|
// P1-1: Linear interpolation percentile tests
|
|
410
|
-
it('should calculate p50 with linear interpolation for even-length array (P1-1)', async () => {
|
|
411
|
-
|
|
425
|
+
void it('should calculate p50 with linear interpolation for even-length array (P1-1)', async () => {
|
|
426
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
412
427
|
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 0.1 },
|
|
413
428
|
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 0.2 },
|
|
414
429
|
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: 0.3 },
|
|
415
430
|
{ timestamp: '2026-01-28T10:03:00Z', evaluationName: 'Relevance', scoreValue: 0.4 },
|
|
416
|
-
]);
|
|
417
|
-
const result = await queryEvaluations({ aggregation: 'p50' });
|
|
431
|
+
]));
|
|
432
|
+
const result = await queryEvaluations({ aggregation: 'p50' }, { localBackend: mockBackend });
|
|
418
433
|
assert.ok(result.summary.aggregations);
|
|
419
434
|
// R-7 method: rank = 0.5 * (4-1) = 1.5, interpolate between index 1 (0.2) and 2 (0.3)
|
|
420
435
|
// value = 0.2 * 0.5 + 0.3 * 0.5 = 0.25
|
|
421
|
-
assert.strictEqual(result.summary.aggregations[0].value,
|
|
436
|
+
assert.strictEqual(result.summary.aggregations[0].value, P50_INTERPOLATED);
|
|
422
437
|
});
|
|
423
|
-
it('should handle single value for percentile (P1-1)', async () => {
|
|
424
|
-
|
|
425
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
426
|
-
]);
|
|
427
|
-
const result = await queryEvaluations({ aggregation: 'p95' });
|
|
438
|
+
void it('should handle single value for percentile (P1-1)', async () => {
|
|
439
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
440
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_SINGLE },
|
|
441
|
+
]));
|
|
442
|
+
const result = await queryEvaluations({ aggregation: 'p95' }, { localBackend: mockBackend });
|
|
428
443
|
assert.ok(result.summary.aggregations);
|
|
429
|
-
assert.strictEqual(result.summary.aggregations[0].value,
|
|
444
|
+
assert.strictEqual(result.summary.aggregations[0].value, SCORE_SINGLE);
|
|
430
445
|
});
|
|
431
446
|
// P1-3: Empty string scoreLabel normalization tests
|
|
432
|
-
it('should treat empty string scoreLabel as missing (P1-3)', async () => {
|
|
433
|
-
|
|
434
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
435
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue:
|
|
436
|
-
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue:
|
|
437
|
-
]);
|
|
438
|
-
const result = await queryEvaluations({});
|
|
447
|
+
void it('should treat empty string scoreLabel as missing (P1-3)', async () => {
|
|
448
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
449
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID, scoreLabel: '' },
|
|
450
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, scoreLabel: ' ' },
|
|
451
|
+
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_LOW, scoreLabel: 'pass' },
|
|
452
|
+
]));
|
|
453
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
439
454
|
// Empty and whitespace-only labels should not be counted
|
|
440
455
|
assert.strictEqual(result.summary.byScoreLabel['pass'], 1);
|
|
441
456
|
assert.strictEqual(result.summary.byScoreLabel[''], undefined);
|
|
442
457
|
assert.strictEqual(result.summary.byScoreLabel[' '], undefined);
|
|
443
458
|
});
|
|
444
|
-
it('should group empty scoreLabels together (P1-3)', async () => {
|
|
445
|
-
|
|
446
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
447
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue:
|
|
448
|
-
]);
|
|
449
|
-
const result = await queryEvaluations({ aggregation: 'count', groupBy: ['scoreLabel'] });
|
|
459
|
+
void it('should group empty scoreLabels together (P1-3)', async () => {
|
|
460
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
461
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID, scoreLabel: '' },
|
|
462
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH },
|
|
463
|
+
]));
|
|
464
|
+
const result = await queryEvaluations({ aggregation: 'count', groupBy: ['scoreLabel'] }, { localBackend: mockBackend });
|
|
450
465
|
assert.ok(result.summary.aggregations);
|
|
451
466
|
// Both should be grouped together as missing label
|
|
452
467
|
assert.strictEqual(result.summary.aggregations.length, 1);
|
|
453
|
-
assert.strictEqual(result.summary.aggregations[0].count,
|
|
468
|
+
assert.strictEqual(result.summary.aggregations[0].count, EXPECTED_PAIR_COUNT);
|
|
454
469
|
});
|
|
455
470
|
});
|
|
456
|
-
describe('score range validation (P2-2)', () => {
|
|
457
|
-
|
|
458
|
-
beforeEach(() => {
|
|
459
|
-
originalQueryEvaluations = LocalJsonlBackend.prototype.queryEvaluations;
|
|
460
|
-
LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => []);
|
|
461
|
-
});
|
|
462
|
-
afterEach(() => {
|
|
463
|
-
LocalJsonlBackend.prototype.queryEvaluations = originalQueryEvaluations;
|
|
464
|
-
});
|
|
465
|
-
it('should reject NaN scoreMin (via Zod)', async () => {
|
|
471
|
+
void describe('score range validation (P2-2)', () => {
|
|
472
|
+
void it('should reject NaN scoreMin (via Zod)', async () => {
|
|
466
473
|
await assert.rejects(async () => queryEvaluations({ scoreMin: NaN }), /received.*nan/i);
|
|
467
474
|
});
|
|
468
|
-
it('should reject NaN scoreMax (via Zod)', async () => {
|
|
475
|
+
void it('should reject NaN scoreMax (via Zod)', async () => {
|
|
469
476
|
await assert.rejects(async () => queryEvaluations({ scoreMax: NaN }), /received.*nan/i);
|
|
470
477
|
});
|
|
471
|
-
it('should reject Infinity scoreMin', async () => {
|
|
472
|
-
await assert.rejects(async () => queryEvaluations({ scoreMin: Infinity }), /
|
|
478
|
+
void it('should reject Infinity scoreMin', async () => {
|
|
479
|
+
await assert.rejects(async () => queryEvaluations({ scoreMin: Infinity }), /received.*infinity/i);
|
|
473
480
|
});
|
|
474
|
-
it('should reject -Infinity scoreMax', async () => {
|
|
475
|
-
await assert.rejects(async () => queryEvaluations({ scoreMax: -Infinity }), /
|
|
481
|
+
void it('should reject -Infinity scoreMax', async () => {
|
|
482
|
+
await assert.rejects(async () => queryEvaluations({ scoreMax: -Infinity }), /received.*infinity/i);
|
|
476
483
|
});
|
|
477
|
-
it('should accept negative score ranges', async () => {
|
|
478
|
-
const result = await queryEvaluations({ scoreMin: -
|
|
484
|
+
void it('should accept negative score ranges', async () => {
|
|
485
|
+
const result = await queryEvaluations({ scoreMin: -2.0, scoreMax: -1.5 });
|
|
479
486
|
assert.strictEqual(result.count, 0);
|
|
480
487
|
});
|
|
481
488
|
});
|
|
482
|
-
describe('evaluator field (Phase 3)', () => {
|
|
483
|
-
describe('schema validation', () => {
|
|
484
|
-
it('should accept evaluator filter', () => {
|
|
489
|
+
void describe('evaluator field (Phase 3)', () => {
|
|
490
|
+
void describe('schema validation', () => {
|
|
491
|
+
void it('should accept evaluator filter', () => {
|
|
485
492
|
const input = { evaluator: 'gpt-4-as-judge' };
|
|
486
493
|
const result = queryEvaluationsSchema.parse(input);
|
|
487
494
|
assert.strictEqual(result.evaluator, 'gpt-4-as-judge');
|
|
488
495
|
});
|
|
489
|
-
it('should accept evaluatorType filter', () => {
|
|
496
|
+
void it('should accept evaluatorType filter', () => {
|
|
490
497
|
const input = { evaluatorType: 'llm' };
|
|
491
498
|
const result = queryEvaluationsSchema.parse(input);
|
|
492
499
|
assert.strictEqual(result.evaluatorType, 'llm');
|
|
493
500
|
});
|
|
494
|
-
it('should accept all valid evaluatorType values', () => {
|
|
501
|
+
void it('should accept all valid evaluatorType values', () => {
|
|
495
502
|
const types = ['llm', 'human', 'rule', 'classifier'];
|
|
496
503
|
for (const type of types) {
|
|
497
504
|
const result = queryEvaluationsSchema.parse({ evaluatorType: type });
|
|
498
505
|
assert.strictEqual(result.evaluatorType, type);
|
|
499
506
|
}
|
|
500
507
|
});
|
|
501
|
-
it('should reject invalid evaluatorType', () => {
|
|
508
|
+
void it('should reject invalid evaluatorType', () => {
|
|
502
509
|
assert.throws(() => {
|
|
503
510
|
queryEvaluationsSchema.parse({ evaluatorType: 'invalid' });
|
|
504
511
|
});
|
|
505
512
|
});
|
|
506
|
-
it('should accept evaluator in groupBy', () => {
|
|
513
|
+
void it('should accept evaluator in groupBy', () => {
|
|
507
514
|
const input = { groupBy: ['evaluator'] };
|
|
508
515
|
const result = queryEvaluationsSchema.parse(input);
|
|
509
516
|
assert.deepStrictEqual(result.groupBy, ['evaluator']);
|
|
510
517
|
});
|
|
511
|
-
it('should accept evaluator with other groupBy fields', () => {
|
|
518
|
+
void it('should accept evaluator with other groupBy fields', () => {
|
|
512
519
|
const input = { groupBy: ['evaluationName', 'evaluator'] };
|
|
513
520
|
const result = queryEvaluationsSchema.parse(input);
|
|
514
521
|
assert.deepStrictEqual(result.groupBy, ['evaluationName', 'evaluator']);
|
|
515
522
|
});
|
|
516
523
|
});
|
|
517
|
-
describe('handler with mocked backend', () => {
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
LocalJsonlBackend.prototype.queryEvaluations = originalQueryEvaluations;
|
|
524
|
-
});
|
|
525
|
-
it('should include evaluator and evaluatorType in response', async () => {
|
|
526
|
-
LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
|
|
524
|
+
void describe('handler with mocked backend', () => {
|
|
525
|
+
function createMockBackend(queryFn) {
|
|
526
|
+
return { queryEvaluations: queryFn };
|
|
527
|
+
}
|
|
528
|
+
void it('should include evaluator and evaluatorType in response', async () => {
|
|
529
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
527
530
|
{
|
|
528
531
|
timestamp: '2026-01-28T10:00:00Z',
|
|
529
532
|
evaluationName: 'Relevance',
|
|
530
|
-
scoreValue:
|
|
533
|
+
scoreValue: SCORE_DETAIL,
|
|
531
534
|
evaluator: 'gpt-4-as-judge',
|
|
532
535
|
evaluatorType: 'llm',
|
|
533
536
|
},
|
|
534
|
-
]);
|
|
535
|
-
const result = await queryEvaluations({});
|
|
537
|
+
]));
|
|
538
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
536
539
|
const evaluation = result.evaluations[0];
|
|
537
540
|
assert.strictEqual(evaluation.evaluator, 'gpt-4-as-judge');
|
|
538
541
|
assert.strictEqual(evaluation.evaluatorType, 'llm');
|
|
539
542
|
});
|
|
540
|
-
it('should summarize evaluations by evaluator', async () => {
|
|
541
|
-
|
|
542
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
543
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue:
|
|
544
|
-
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue:
|
|
545
|
-
]);
|
|
546
|
-
const result = await queryEvaluations({});
|
|
547
|
-
assert.strictEqual(result.summary.byEvaluator['gpt-4-as-judge'],
|
|
543
|
+
void it('should summarize evaluations by evaluator', async () => {
|
|
544
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
545
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, evaluator: 'gpt-4-as-judge' },
|
|
546
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID, evaluator: 'gpt-4-as-judge' },
|
|
547
|
+
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_AVG_MID_HIGH, evaluator: 'human-reviewer' },
|
|
548
|
+
]));
|
|
549
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
550
|
+
assert.strictEqual(result.summary.byEvaluator['gpt-4-as-judge'], EXPECTED_PAIR_COUNT);
|
|
548
551
|
assert.strictEqual(result.summary.byEvaluator['human-reviewer'], 1);
|
|
549
552
|
});
|
|
550
|
-
it('should not count evaluations without evaluator in byEvaluator', async () => {
|
|
551
|
-
|
|
552
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
553
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue:
|
|
554
|
-
]);
|
|
555
|
-
const result = await queryEvaluations({});
|
|
553
|
+
void it('should not count evaluations without evaluator in byEvaluator', async () => {
|
|
554
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
555
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, evaluator: 'gpt-4-as-judge' },
|
|
556
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID }, // no evaluator
|
|
557
|
+
]));
|
|
558
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
556
559
|
assert.strictEqual(result.summary.byEvaluator['gpt-4-as-judge'], 1);
|
|
557
560
|
assert.strictEqual(Object.keys(result.summary.byEvaluator).length, 1);
|
|
558
561
|
});
|
|
559
|
-
it('should group by evaluator', async () => {
|
|
560
|
-
|
|
561
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
562
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue:
|
|
563
|
-
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue:
|
|
564
|
-
]);
|
|
565
|
-
const result = await queryEvaluations({ aggregation: 'avg', groupBy: ['evaluator'] });
|
|
562
|
+
void it('should group by evaluator', async () => {
|
|
563
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
564
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, evaluator: 'gpt-4-as-judge' },
|
|
565
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID, evaluator: 'gpt-4-as-judge' },
|
|
566
|
+
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_LOW, evaluator: 'human-reviewer' },
|
|
567
|
+
]));
|
|
568
|
+
const result = await queryEvaluations({ aggregation: 'avg', groupBy: ['evaluator'] }, { localBackend: mockBackend });
|
|
566
569
|
assert.ok(result.summary.aggregations);
|
|
567
|
-
assert.strictEqual(result.summary.aggregations.length,
|
|
570
|
+
assert.strictEqual(result.summary.aggregations.length, EXPECTED_PAIR_COUNT);
|
|
568
571
|
const gpt4 = result.summary.aggregations.find(a => a.evaluator === 'gpt-4-as-judge');
|
|
569
572
|
const human = result.summary.aggregations.find(a => a.evaluator === 'human-reviewer');
|
|
570
573
|
assert.ok(gpt4);
|
|
571
|
-
assert.ok(Math.abs((gpt4.value ?? 0) -
|
|
572
|
-
assert.strictEqual(gpt4.count,
|
|
574
|
+
assert.ok(Math.abs((gpt4.value ?? 0) - SCORE_AVG_MID_HIGH) < FLOAT_TOLERANCE, `Expected ~0.85, got ${gpt4.value}`);
|
|
575
|
+
assert.strictEqual(gpt4.count, EXPECTED_PAIR_COUNT);
|
|
573
576
|
assert.ok(human);
|
|
574
|
-
assert.strictEqual(human.value,
|
|
577
|
+
assert.strictEqual(human.value, SCORE_LOW);
|
|
575
578
|
assert.strictEqual(human.count, 1);
|
|
576
579
|
});
|
|
577
|
-
it('should group by evaluationName and evaluator', async () => {
|
|
578
|
-
|
|
579
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
580
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Faithfulness', scoreValue:
|
|
581
|
-
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue:
|
|
582
|
-
]);
|
|
583
|
-
const result = await queryEvaluations({ aggregation: 'count', groupBy: ['evaluationName', 'evaluator'] });
|
|
580
|
+
void it('should group by evaluationName and evaluator', async () => {
|
|
581
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
582
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, evaluator: 'gpt-4-as-judge' },
|
|
583
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Faithfulness', scoreValue: SCORE_MID, evaluator: 'gpt-4-as-judge' },
|
|
584
|
+
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_LOW, evaluator: 'human-reviewer' },
|
|
585
|
+
]));
|
|
586
|
+
const result = await queryEvaluations({ aggregation: 'count', groupBy: ['evaluationName', 'evaluator'] }, { localBackend: mockBackend });
|
|
584
587
|
assert.ok(result.summary.aggregations);
|
|
585
|
-
assert.strictEqual(result.summary.aggregations.length,
|
|
588
|
+
assert.strictEqual(result.summary.aggregations.length, EXPECTED_TRIPLE_COUNT);
|
|
586
589
|
});
|
|
587
|
-
it('should handle evaluations without evaluator in groupBy', async () => {
|
|
588
|
-
|
|
589
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
590
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue:
|
|
591
|
-
]);
|
|
592
|
-
const result = await queryEvaluations({ aggregation: 'count', groupBy: ['evaluator'] });
|
|
590
|
+
void it('should handle evaluations without evaluator in groupBy', async () => {
|
|
591
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
592
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, evaluator: 'gpt-4-as-judge' },
|
|
593
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID }, // no evaluator
|
|
594
|
+
]));
|
|
595
|
+
const result = await queryEvaluations({ aggregation: 'count', groupBy: ['evaluator'] }, { localBackend: mockBackend });
|
|
593
596
|
assert.ok(result.summary.aggregations);
|
|
594
597
|
// Should have two groups: one with evaluator, one without
|
|
595
|
-
assert.strictEqual(result.summary.aggregations.length,
|
|
598
|
+
assert.strictEqual(result.summary.aggregations.length, EXPECTED_PAIR_COUNT);
|
|
596
599
|
});
|
|
597
|
-
it('should include all evaluatorType values in response', async () => {
|
|
598
|
-
|
|
600
|
+
void it('should include all evaluatorType values in response', async () => {
|
|
601
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
599
602
|
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', evaluatorType: 'llm' },
|
|
600
603
|
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'ToolUse', evaluatorType: 'rule' },
|
|
601
604
|
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'UserSatisfaction', evaluatorType: 'human' },
|
|
602
605
|
{ timestamp: '2026-01-28T10:03:00Z', evaluationName: 'Intent', evaluatorType: 'classifier' },
|
|
603
|
-
]);
|
|
604
|
-
const result = await queryEvaluations({});
|
|
606
|
+
]));
|
|
607
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
605
608
|
// Results are sorted by timestamp DESC, so order is reversed
|
|
606
609
|
const types = result.evaluations.map(e => e.evaluatorType).sort();
|
|
607
610
|
assert.deepStrictEqual(types, ['classifier', 'human', 'llm', 'rule']);
|
|
608
611
|
});
|
|
609
612
|
});
|
|
610
613
|
});
|
|
611
|
-
describe('scoreUnit field (Phase 1)', () => {
|
|
612
|
-
describe('handler with mocked backend', () => {
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
LocalJsonlBackend.prototype.queryEvaluations = originalQueryEvaluations;
|
|
619
|
-
});
|
|
620
|
-
it('should include scoreUnit in response', async () => {
|
|
621
|
-
LocalJsonlBackend.prototype.queryEvaluations = mock.fn(async () => [
|
|
614
|
+
void describe('scoreUnit field (Phase 1)', () => {
|
|
615
|
+
void describe('handler with mocked backend', () => {
|
|
616
|
+
function createMockBackend(queryFn) {
|
|
617
|
+
return { queryEvaluations: queryFn };
|
|
618
|
+
}
|
|
619
|
+
void it('should include scoreUnit in response', async () => {
|
|
620
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
622
621
|
{
|
|
623
622
|
timestamp: '2026-01-28T10:00:00Z',
|
|
624
623
|
evaluationName: 'Relevance',
|
|
625
624
|
scoreValue: 85,
|
|
626
625
|
scoreUnit: 'percentage',
|
|
627
626
|
},
|
|
628
|
-
]);
|
|
629
|
-
const result = await queryEvaluations({});
|
|
627
|
+
]));
|
|
628
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
630
629
|
assert.strictEqual(result.evaluations[0].scoreUnit, 'percentage');
|
|
631
630
|
});
|
|
632
|
-
it('should normalize percentage scores for averageScore', async () => {
|
|
633
|
-
|
|
631
|
+
void it('should normalize percentage scores for averageScore', async () => {
|
|
632
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
634
633
|
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 80, scoreUnit: 'percentage' },
|
|
635
634
|
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 90, scoreUnit: 'percentage' },
|
|
636
|
-
]);
|
|
637
|
-
const result = await queryEvaluations({});
|
|
635
|
+
]));
|
|
636
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
638
637
|
// (80/100 + 90/100) / 2 = 0.85
|
|
639
|
-
assert.ok(Math.abs((result.summary.averageScore ?? 0) -
|
|
638
|
+
assert.ok(Math.abs((result.summary.averageScore ?? 0) - SCORE_AVG_MID_HIGH) < FLOAT_TOLERANCE, `Expected ~0.85, got ${result.summary.averageScore}`);
|
|
640
639
|
});
|
|
641
|
-
it('should not change ratio_0_1 scores for averageScore', async () => {
|
|
642
|
-
|
|
643
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
644
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue:
|
|
645
|
-
]);
|
|
646
|
-
const result = await queryEvaluations({});
|
|
640
|
+
void it('should not change ratio_0_1 scores for averageScore', async () => {
|
|
641
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
642
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID, scoreUnit: 'ratio_0_1' },
|
|
643
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, scoreUnit: 'ratio_0_1' },
|
|
644
|
+
]));
|
|
645
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
647
646
|
// (0.8 + 0.9) / 2 = 0.85
|
|
648
|
-
assert.ok(Math.abs((result.summary.averageScore ?? 0) -
|
|
647
|
+
assert.ok(Math.abs((result.summary.averageScore ?? 0) - SCORE_AVG_MID_HIGH) < FLOAT_TOLERANCE, `Expected ~0.85, got ${result.summary.averageScore}`);
|
|
649
648
|
});
|
|
650
|
-
it('should not change scores without unit for averageScore', async () => {
|
|
651
|
-
|
|
652
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
653
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue:
|
|
654
|
-
]);
|
|
655
|
-
const result = await queryEvaluations({});
|
|
649
|
+
void it('should not change scores without unit for averageScore', async () => {
|
|
650
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
651
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: SCORE_MID },
|
|
652
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH },
|
|
653
|
+
]));
|
|
654
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
656
655
|
// (0.8 + 0.9) / 2 = 0.85
|
|
657
|
-
assert.ok(Math.abs((result.summary.averageScore ?? 0) -
|
|
656
|
+
assert.ok(Math.abs((result.summary.averageScore ?? 0) - SCORE_AVG_MID_HIGH) < FLOAT_TOLERANCE, `Expected ~0.85, got ${result.summary.averageScore}`);
|
|
658
657
|
});
|
|
659
|
-
it('should handle mixed units for averageScore', async () => {
|
|
660
|
-
|
|
658
|
+
void it('should handle mixed units for averageScore', async () => {
|
|
659
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
661
660
|
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 80, scoreUnit: 'percentage' },
|
|
662
|
-
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue:
|
|
663
|
-
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue:
|
|
664
|
-
]);
|
|
665
|
-
const result = await queryEvaluations({});
|
|
661
|
+
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: SCORE_HIGH, scoreUnit: 'ratio_0_1' },
|
|
662
|
+
{ timestamp: '2026-01-28T10:02:00Z', evaluationName: 'Relevance', scoreValue: SCORE_AVG_MID_HIGH }, // no unit, defaults to ratio
|
|
663
|
+
]));
|
|
664
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
666
665
|
// (0.8 + 0.9 + 0.85) / 3 = 0.85
|
|
667
|
-
assert.ok(Math.abs((result.summary.averageScore ?? 0) -
|
|
666
|
+
assert.ok(Math.abs((result.summary.averageScore ?? 0) - SCORE_AVG_MID_HIGH) < FLOAT_TOLERANCE, `Expected ~0.85, got ${result.summary.averageScore}`);
|
|
668
667
|
});
|
|
669
|
-
it('should handle percent as alias for percentage', async () => {
|
|
670
|
-
|
|
668
|
+
void it('should handle percent as alias for percentage', async () => {
|
|
669
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
671
670
|
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 100, scoreUnit: 'percent' },
|
|
672
|
-
]);
|
|
673
|
-
const result = await queryEvaluations({});
|
|
671
|
+
]));
|
|
672
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
674
673
|
// 100/100 = 1.0
|
|
675
674
|
assert.strictEqual(result.summary.averageScore, 1.0);
|
|
676
675
|
});
|
|
677
|
-
it('should handle case-insensitive unit names', async () => {
|
|
678
|
-
|
|
676
|
+
void it('should handle case-insensitive unit names', async () => {
|
|
677
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
679
678
|
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: 50, scoreUnit: 'PERCENTAGE' },
|
|
680
679
|
{ timestamp: '2026-01-28T10:01:00Z', evaluationName: 'Relevance', scoreValue: 50, scoreUnit: 'Percentage' },
|
|
681
|
-
]);
|
|
682
|
-
const result = await queryEvaluations({});
|
|
680
|
+
]));
|
|
681
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
683
682
|
// (50/100 + 50/100) / 2 = 0.5
|
|
684
|
-
assert.strictEqual(result.summary.averageScore,
|
|
683
|
+
assert.strictEqual(result.summary.averageScore, SCORE_HALF);
|
|
685
684
|
});
|
|
686
|
-
it('should not normalize unknown units', async () => {
|
|
687
|
-
|
|
688
|
-
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue:
|
|
689
|
-
]);
|
|
690
|
-
const result = await queryEvaluations({});
|
|
685
|
+
void it('should not normalize unknown units', async () => {
|
|
686
|
+
const mockBackend = createMockBackend(vi.fn(async () => [
|
|
687
|
+
{ timestamp: '2026-01-28T10:00:00Z', evaluationName: 'Relevance', scoreValue: UNKNOWN_UNIT_SCORE, scoreUnit: 'stars_1_5' },
|
|
688
|
+
]));
|
|
689
|
+
const result = await queryEvaluations({}, { localBackend: mockBackend });
|
|
691
690
|
// Unknown unit, keep as-is
|
|
692
|
-
assert.strictEqual(result.summary.averageScore,
|
|
691
|
+
assert.strictEqual(result.summary.averageScore, UNKNOWN_UNIT_SCORE);
|
|
693
692
|
});
|
|
694
693
|
});
|
|
695
694
|
});
|
|
696
|
-
describe('aggregation group limit (M5)', () => {
|
|
697
|
-
describe('buildAggregations', () => {
|
|
698
|
-
it('should throw when exceeding MAX_AGGREGATION_GROUPS', () => {
|
|
699
|
-
// Generate evaluations that would create > 10000 groups
|
|
695
|
+
void describe('aggregation group limit (M5)', () => {
|
|
696
|
+
void describe('buildAggregations', () => {
|
|
697
|
+
void it('should throw when exceeding MAX_AGGREGATION_GROUPS', () => {
|
|
700
698
|
const evaluations = [];
|
|
701
|
-
// Create
|
|
702
|
-
for (let i = 0; i <=
|
|
699
|
+
// Create MAX_AGGREGATION_GROUPS + 1 unique evaluation names
|
|
700
|
+
for (let i = 0; i <= MAX_AGGREGATION_GROUPS; i++) {
|
|
703
701
|
evaluations.push({
|
|
704
702
|
timestamp: '2026-01-28T10:00:00Z',
|
|
705
703
|
evaluationName: `Eval-${i}`,
|
|
706
|
-
scoreValue:
|
|
704
|
+
scoreValue: SCORE_HALF,
|
|
707
705
|
});
|
|
708
706
|
}
|
|
709
|
-
|
|
710
|
-
assert.throws(() => buildAggregations(evaluations, 'avg', ['evaluationName']), /Aggregation group limit exceeded: 10000 max groups/);
|
|
707
|
+
assert.throws(() => buildAggregations(evaluations, 'avg', ['evaluationName']), /Aggregation group limit exceeded/);
|
|
711
708
|
});
|
|
712
|
-
it('should allow up to MAX_AGGREGATION_GROUPS groups', () => {
|
|
713
|
-
// Generate evaluations that create exactly 10000 groups (the limit)
|
|
709
|
+
void it('should allow up to MAX_AGGREGATION_GROUPS groups', () => {
|
|
714
710
|
const evaluations = [];
|
|
715
|
-
for (let i = 0; i <
|
|
711
|
+
for (let i = 0; i < MAX_AGGREGATION_GROUPS; i++) {
|
|
716
712
|
evaluations.push({
|
|
717
713
|
timestamp: '2026-01-28T10:00:00Z',
|
|
718
714
|
evaluationName: `Eval-${i}`,
|
|
719
|
-
scoreValue:
|
|
715
|
+
scoreValue: SCORE_HALF,
|
|
720
716
|
});
|
|
721
717
|
}
|
|
722
|
-
// This should succeed with exactly 10000 groups
|
|
723
718
|
const result = buildAggregations(evaluations, 'count', ['evaluationName']);
|
|
724
|
-
assert.strictEqual(result.length,
|
|
719
|
+
assert.strictEqual(result.length, MAX_AGGREGATION_GROUPS);
|
|
725
720
|
});
|
|
726
|
-
it('should include helpful error message when limit exceeded', () => {
|
|
721
|
+
void it('should include helpful error message when limit exceeded', () => {
|
|
727
722
|
const evaluations = [];
|
|
728
|
-
for (let i = 0; i <=
|
|
723
|
+
for (let i = 0; i <= MAX_AGGREGATION_GROUPS; i++) {
|
|
729
724
|
evaluations.push({
|
|
730
725
|
timestamp: '2026-01-28T10:00:00Z',
|
|
731
726
|
evaluationName: `Eval-${i}`,
|
|
732
|
-
scoreValue:
|
|
727
|
+
scoreValue: SCORE_HALF,
|
|
733
728
|
});
|
|
734
729
|
}
|
|
735
730
|
assert.throws(() => buildAggregations(evaluations, 'avg', ['evaluationName']), /Reduce groupBy cardinality or add filters/);
|