@opensearch-project/agent-health 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -5
- package/cli/dist/index.js +8292 -2938
- package/deployment/cloudformation/agent-health-observability.yaml +223 -32
- package/dist/assets/index-BfxtxmKc.css +1 -0
- package/dist/assets/index-CrjAfDHu.js +243 -0
- package/dist/index.html +2 -2
- package/docs/ARCHITECTURE.md +450 -0
- package/docs/BACKEND_JOB_QUEUE.md +405 -0
- package/docs/CLAUDE_CODE_TELEMETRY.md +283 -0
- package/docs/CLI.md +474 -0
- package/docs/CODING_AGENT_ANALYTICS.md +298 -0
- package/docs/CONFIGURATION.md +388 -0
- package/docs/CONNECTORS.md +536 -0
- package/docs/INSTRUMENT_WITH_OTEL.md +397 -0
- package/docs/ML-COMMONS-SETUP.md +289 -0
- package/docs/NPX_PACKAGING.md +195 -0
- package/docs/PERFORMANCE-MONITORING.md +200 -0
- package/docs/PERFORMANCE.md +390 -0
- package/docs/PI_PROFILING.md +169 -0
- package/docs/PLAN-non-agui-agent-support.md +525 -0
- package/docs/SDK.md +626 -0
- package/docs/SKILLS.md +264 -0
- package/docs/STORAGE_INDEX_FIELD_LIMITS.md +216 -0
- package/docs/blogs/2026-02-28-opensearch-agent-health.md +200 -0
- package/docs/blogs/getting-started-blog.md +608 -0
- package/docs/diagrams/Agent-health.excalidraw +5656 -0
- package/docs/diagrams/architecture.png +0 -0
- package/docs/plans/field-redesign.md +468 -0
- package/docs/rfcs/001-coding-agent-analytics.md +374 -0
- package/docs/rfcs/002-enterprise-leaderboard.md +267 -0
- package/docs/rfcs/003-remote-aggregation.md +146 -0
- package/docs/rfcs/004-test-sdk-v2.md +599 -0
- package/docs/skills/AGENT_HEALTH.md +652 -0
- package/docs/skills/AGENT_PROFILE.md +191 -0
- package/docs/skills/add-connector/SKILL.md +68 -0
- package/docs/skills/agent-health-profile/SKILL.md +40 -0
- package/docs/skills/config-auth/SKILL.md +194 -0
- package/docs/skills/config-auth/evals/evals.json +35 -0
- package/docs/skills/create-pr/SKILL.md +73 -0
- package/docs/skills/instrument-otel/SKILL.md +84 -0
- package/docs/skills/write-test/SKILL.md +124 -0
- package/docs/ui prd.md +376 -0
- package/examples/README.md +53 -0
- package/examples/config/agent-health.config.example.ts +155 -0
- package/examples/connectors/echo-connector.ts +131 -0
- package/examples/eval-files/demo.eval.js +128 -0
- package/examples/eval-files/ops-rca-classification.eval.js +71 -0
- package/examples/eval-files/ops-rca-evaluator.json +15 -0
- package/examples/eval-files/sdk-demo.eval.js +72 -0
- package/examples/eval-files/sdk-describe-demo.eval.js +50 -0
- package/examples/eval-files/sdk-hooks-demo.eval.js +99 -0
- package/examples/pi-profiling/README.md +77 -0
- package/examples/pi-profiling/agent-health-profile.ts +417 -0
- package/lib/dist/lib/agentUtils.d.ts +29 -0
- package/lib/dist/lib/agentUtils.d.ts.map +1 -0
- package/lib/dist/lib/agentUtils.js +43 -0
- package/lib/dist/lib/agentUtils.js.map +1 -0
- package/lib/dist/lib/bedrockCompat.d.ts +27 -0
- package/lib/dist/lib/bedrockCompat.d.ts.map +1 -0
- package/lib/dist/lib/bedrockCompat.js +83 -0
- package/lib/dist/lib/bedrockCompat.js.map +1 -0
- package/lib/dist/lib/benchmarkExport.d.ts +14 -0
- package/lib/dist/lib/benchmarkExport.d.ts.map +1 -0
- package/lib/dist/lib/benchmarkExport.js +41 -0
- package/lib/dist/lib/benchmarkExport.js.map +1 -0
- package/lib/dist/lib/benchmarkImage.d.ts +52 -0
- package/lib/dist/lib/benchmarkImage.d.ts.map +1 -0
- package/lib/dist/lib/benchmarkImage.js +113 -0
- package/lib/dist/lib/benchmarkImage.js.map +1 -0
- package/lib/dist/lib/benchmarkVersionUtils.d.ts +50 -0
- package/lib/dist/lib/benchmarkVersionUtils.d.ts.map +1 -0
- package/lib/dist/lib/benchmarkVersionUtils.js +89 -0
- package/lib/dist/lib/benchmarkVersionUtils.js.map +1 -0
- package/lib/dist/lib/chunkedFetch.d.ts +18 -0
- package/lib/dist/lib/chunkedFetch.d.ts.map +1 -0
- package/lib/dist/lib/chunkedFetch.js +40 -0
- package/lib/dist/lib/chunkedFetch.js.map +1 -0
- package/lib/dist/lib/comparisonInsights.d.ts +104 -0
- package/lib/dist/lib/comparisonInsights.d.ts.map +1 -0
- package/lib/dist/lib/comparisonInsights.js +212 -0
- package/lib/dist/lib/comparisonInsights.js.map +1 -0
- package/lib/dist/lib/config/defineConfig.d.ts +27 -0
- package/lib/dist/lib/config/defineConfig.d.ts.map +1 -0
- package/lib/dist/lib/config/defineConfig.js +28 -0
- package/lib/dist/lib/config/defineConfig.js.map +1 -0
- package/lib/dist/lib/config/index.d.ts +9 -0
- package/lib/dist/lib/config/index.d.ts.map +1 -0
- package/lib/dist/lib/config/index.js +8 -0
- package/lib/dist/lib/config/index.js.map +1 -0
- package/lib/dist/lib/config/loader.d.ts +39 -0
- package/lib/dist/lib/config/loader.d.ts.map +1 -0
- package/lib/dist/lib/config/loader.js +263 -0
- package/lib/dist/lib/config/loader.js.map +1 -0
- package/lib/dist/lib/config/statePaths.d.ts +61 -0
- package/lib/dist/lib/config/statePaths.d.ts.map +1 -0
- package/lib/dist/lib/config/statePaths.js +188 -0
- package/lib/dist/lib/config/statePaths.js.map +1 -0
- package/lib/dist/lib/config/types.d.ts +245 -0
- package/lib/dist/lib/config/types.d.ts.map +1 -0
- package/lib/dist/lib/config/types.js +6 -0
- package/lib/dist/lib/config/types.js.map +1 -0
- package/lib/dist/lib/config.d.ts +39 -0
- package/lib/dist/lib/config.d.ts.map +1 -0
- package/lib/dist/lib/config.js +118 -0
- package/lib/dist/lib/config.js.map +1 -0
- package/lib/dist/lib/constants.d.ts +81 -0
- package/lib/dist/lib/constants.d.ts.map +1 -0
- package/lib/dist/lib/constants.js +374 -0
- package/lib/dist/lib/constants.js.map +1 -0
- package/lib/dist/lib/contextFormat.d.ts +26 -0
- package/lib/dist/lib/contextFormat.d.ts.map +1 -0
- package/lib/dist/lib/contextFormat.js +28 -0
- package/lib/dist/lib/contextFormat.js.map +1 -0
- package/lib/dist/lib/contextUtilization.d.ts +23 -0
- package/lib/dist/lib/contextUtilization.d.ts.map +1 -0
- package/lib/dist/lib/contextUtilization.js +72 -0
- package/lib/dist/lib/contextUtilization.js.map +1 -0
- package/lib/dist/lib/dashboardMetrics.d.ts +87 -0
- package/lib/dist/lib/dashboardMetrics.d.ts.map +1 -0
- package/lib/dist/lib/dashboardMetrics.js +242 -0
- package/lib/dist/lib/dashboardMetrics.js.map +1 -0
- package/lib/dist/lib/dataSourceConfig.d.ts +108 -0
- package/lib/dist/lib/dataSourceConfig.d.ts.map +1 -0
- package/lib/dist/lib/dataSourceConfig.js +166 -0
- package/lib/dist/lib/dataSourceConfig.js.map +1 -0
- package/lib/dist/lib/debug.d.ts +26 -0
- package/lib/dist/lib/debug.d.ts.map +1 -0
- package/lib/dist/lib/debug.js +132 -0
- package/lib/dist/lib/debug.js.map +1 -0
- package/lib/dist/lib/diagnostics.d.ts +28 -0
- package/lib/dist/lib/diagnostics.d.ts.map +1 -0
- package/lib/dist/lib/diagnostics.js +65 -0
- package/lib/dist/lib/diagnostics.js.map +1 -0
- package/lib/dist/lib/envCompat.d.ts +27 -0
- package/lib/dist/lib/envCompat.d.ts.map +1 -0
- package/lib/dist/lib/envCompat.js +82 -0
- package/lib/dist/lib/envCompat.js.map +1 -0
- package/lib/dist/lib/evaluationRerun.d.ts +63 -0
- package/lib/dist/lib/evaluationRerun.d.ts.map +1 -0
- package/lib/dist/lib/evaluationRerun.js +85 -0
- package/lib/dist/lib/evaluationRerun.js.map +1 -0
- package/lib/dist/lib/findPackageRoot.d.ts +7 -0
- package/lib/dist/lib/findPackageRoot.d.ts.map +1 -0
- package/lib/dist/lib/findPackageRoot.js +57 -0
- package/lib/dist/lib/findPackageRoot.js.map +1 -0
- package/lib/dist/lib/hooks.d.ts +36 -0
- package/lib/dist/lib/hooks.d.ts.map +1 -0
- package/lib/dist/lib/hooks.js +112 -0
- package/lib/dist/lib/hooks.js.map +1 -0
- package/lib/dist/lib/index.d.ts +47 -0
- package/lib/dist/lib/index.d.ts.map +1 -0
- package/lib/dist/lib/index.js +62 -0
- package/lib/dist/lib/index.js.map +1 -0
- package/lib/dist/lib/labels.d.ts +90 -0
- package/lib/dist/lib/labels.d.ts.map +1 -0
- package/lib/dist/lib/labels.js +158 -0
- package/lib/dist/lib/labels.js.map +1 -0
- package/lib/dist/lib/markdown.d.ts +16 -0
- package/lib/dist/lib/markdown.d.ts.map +1 -0
- package/lib/dist/lib/markdown.js +42 -0
- package/lib/dist/lib/markdown.js.map +1 -0
- package/lib/dist/lib/matchers/expect.d.ts +3 -0
- package/lib/dist/lib/matchers/expect.d.ts.map +1 -0
- package/lib/dist/lib/matchers/expect.js +225 -0
- package/lib/dist/lib/matchers/expect.js.map +1 -0
- package/lib/dist/lib/matchers/index.d.ts +8 -0
- package/lib/dist/lib/matchers/index.d.ts.map +1 -0
- package/lib/dist/lib/matchers/index.js +9 -0
- package/lib/dist/lib/matchers/index.js.map +1 -0
- package/lib/dist/lib/matchers/judgeAccessor.d.ts +113 -0
- package/lib/dist/lib/matchers/judgeAccessor.d.ts.map +1 -0
- package/lib/dist/lib/matchers/judgeAccessor.js +183 -0
- package/lib/dist/lib/matchers/judgeAccessor.js.map +1 -0
- package/lib/dist/lib/matchers/session.d.ts +39 -0
- package/lib/dist/lib/matchers/session.d.ts.map +1 -0
- package/lib/dist/lib/matchers/session.js +116 -0
- package/lib/dist/lib/matchers/session.js.map +1 -0
- package/lib/dist/lib/matchers/traces.d.ts +70 -0
- package/lib/dist/lib/matchers/traces.d.ts.map +1 -0
- package/lib/dist/lib/matchers/traces.js +236 -0
- package/lib/dist/lib/matchers/traces.js.map +1 -0
- package/lib/dist/lib/matchers/tracesPricing.d.ts +38 -0
- package/lib/dist/lib/matchers/tracesPricing.d.ts.map +1 -0
- package/lib/dist/lib/matchers/tracesPricing.js +64 -0
- package/lib/dist/lib/matchers/tracesPricing.js.map +1 -0
- package/lib/dist/lib/matchers/types.d.ts +75 -0
- package/lib/dist/lib/matchers/types.d.ts.map +1 -0
- package/lib/dist/lib/matchers/types.js +6 -0
- package/lib/dist/lib/matchers/types.js.map +1 -0
- package/lib/dist/lib/packagePaths.d.ts +29 -0
- package/lib/dist/lib/packagePaths.d.ts.map +1 -0
- package/lib/dist/lib/packagePaths.js +63 -0
- package/lib/dist/lib/packagePaths.js.map +1 -0
- package/lib/dist/lib/performance.d.ts +51 -0
- package/lib/dist/lib/performance.d.ts.map +1 -0
- package/lib/dist/lib/performance.js +159 -0
- package/lib/dist/lib/performance.js.map +1 -0
- package/lib/dist/lib/portConfig.d.ts +29 -0
- package/lib/dist/lib/portConfig.d.ts.map +1 -0
- package/lib/dist/lib/portConfig.js +64 -0
- package/lib/dist/lib/portConfig.js.map +1 -0
- package/lib/dist/lib/preferences.d.ts +63 -0
- package/lib/dist/lib/preferences.d.ts.map +1 -0
- package/lib/dist/lib/preferences.js +117 -0
- package/lib/dist/lib/preferences.js.map +1 -0
- package/lib/dist/lib/resolveAgentModel.d.ts +22 -0
- package/lib/dist/lib/resolveAgentModel.d.ts.map +1 -0
- package/lib/dist/lib/resolveAgentModel.js +37 -0
- package/lib/dist/lib/resolveAgentModel.js.map +1 -0
- package/lib/dist/lib/runStats.d.ts +116 -0
- package/lib/dist/lib/runStats.d.ts.map +1 -0
- package/lib/dist/lib/runStats.js +192 -0
- package/lib/dist/lib/runStats.js.map +1 -0
- package/lib/dist/lib/telemetry/constants.d.ts +60 -0
- package/lib/dist/lib/telemetry/constants.d.ts.map +1 -0
- package/lib/dist/lib/telemetry/constants.js +87 -0
- package/lib/dist/lib/telemetry/constants.js.map +1 -0
- package/lib/dist/lib/telemetry/evalSpans.d.ts +61 -0
- package/lib/dist/lib/telemetry/evalSpans.d.ts.map +1 -0
- package/lib/dist/lib/telemetry/evalSpans.js +254 -0
- package/lib/dist/lib/telemetry/evalSpans.js.map +1 -0
- package/lib/dist/lib/telemetry/index.d.ts +11 -0
- package/lib/dist/lib/telemetry/index.d.ts.map +1 -0
- package/lib/dist/lib/telemetry/index.js +15 -0
- package/lib/dist/lib/telemetry/index.js.map +1 -0
- package/lib/dist/lib/telemetry/opensearchExporter.d.ts +43 -0
- package/lib/dist/lib/telemetry/opensearchExporter.d.ts.map +1 -0
- package/lib/dist/lib/telemetry/opensearchExporter.js +217 -0
- package/lib/dist/lib/telemetry/opensearchExporter.js.map +1 -0
- package/lib/dist/lib/telemetry/provider.d.ts +55 -0
- package/lib/dist/lib/telemetry/provider.d.ts.map +1 -0
- package/lib/dist/lib/telemetry/provider.js +140 -0
- package/lib/dist/lib/telemetry/provider.js.map +1 -0
- package/lib/dist/lib/testCaseLabels.d.ts +34 -0
- package/lib/dist/lib/testCaseLabels.d.ts.map +1 -0
- package/lib/dist/lib/testCaseLabels.js +88 -0
- package/lib/dist/lib/testCaseLabels.js.map +1 -0
- package/lib/dist/lib/testCaseValidation.d.ts +140 -0
- package/lib/dist/lib/testCaseValidation.d.ts.map +1 -0
- package/lib/dist/lib/testCaseValidation.js +162 -0
- package/lib/dist/lib/testCaseValidation.js.map +1 -0
- package/lib/dist/lib/testCases/agentFixture.d.ts +80 -0
- package/lib/dist/lib/testCases/agentFixture.d.ts.map +1 -0
- package/lib/dist/lib/testCases/agentFixture.js +43 -0
- package/lib/dist/lib/testCases/agentFixture.js.map +1 -0
- package/lib/dist/lib/testCases/authoringSurface.d.ts +10 -0
- package/lib/dist/lib/testCases/authoringSurface.d.ts.map +1 -0
- package/lib/dist/lib/testCases/authoringSurface.js +54 -0
- package/lib/dist/lib/testCases/authoringSurface.js.map +1 -0
- package/lib/dist/lib/testCases/codemod.d.ts +13 -0
- package/lib/dist/lib/testCases/codemod.d.ts.map +1 -0
- package/lib/dist/lib/testCases/codemod.js +169 -0
- package/lib/dist/lib/testCases/codemod.js.map +1 -0
- package/lib/dist/lib/testCases/define.d.ts +114 -0
- package/lib/dist/lib/testCases/define.d.ts.map +1 -0
- package/lib/dist/lib/testCases/define.js +253 -0
- package/lib/dist/lib/testCases/define.js.map +1 -0
- package/lib/dist/lib/testCases/evaluators.d.ts +80 -0
- package/lib/dist/lib/testCases/evaluators.d.ts.map +1 -0
- package/lib/dist/lib/testCases/evaluators.js +105 -0
- package/lib/dist/lib/testCases/evaluators.js.map +1 -0
- package/lib/dist/lib/testCases/index.d.ts +14 -0
- package/lib/dist/lib/testCases/index.d.ts.map +1 -0
- package/lib/dist/lib/testCases/index.js +12 -0
- package/lib/dist/lib/testCases/index.js.map +1 -0
- package/lib/dist/lib/testCases/judge.d.ts +165 -0
- package/lib/dist/lib/testCases/judge.d.ts.map +1 -0
- package/lib/dist/lib/testCases/judge.js +359 -0
- package/lib/dist/lib/testCases/judge.js.map +1 -0
- package/lib/dist/lib/testCases/loader.d.ts +36 -0
- package/lib/dist/lib/testCases/loader.d.ts.map +1 -0
- package/lib/dist/lib/testCases/loader.js +179 -0
- package/lib/dist/lib/testCases/loader.js.map +1 -0
- package/lib/dist/lib/testCases/types.d.ts +242 -0
- package/lib/dist/lib/testCases/types.d.ts.map +1 -0
- package/lib/dist/lib/testCases/types.js +6 -0
- package/lib/dist/lib/testCases/types.js.map +1 -0
- package/lib/dist/lib/theme.d.ts +6 -0
- package/lib/dist/lib/theme.d.ts.map +1 -0
- package/lib/dist/lib/theme.js +36 -0
- package/lib/dist/lib/theme.js.map +1 -0
- package/lib/dist/lib/uiTelemetry.d.ts +7 -0
- package/lib/dist/lib/uiTelemetry.d.ts.map +1 -0
- package/lib/dist/lib/uiTelemetry.js +25 -0
- package/lib/dist/lib/uiTelemetry.js.map +1 -0
- package/lib/dist/lib/utils.d.ts +111 -0
- package/lib/dist/lib/utils.d.ts.map +1 -0
- package/lib/dist/lib/utils.js +254 -0
- package/lib/dist/lib/utils.js.map +1 -0
- package/lib/dist/lib/workflow/consolidate.d.ts +12 -0
- package/lib/dist/lib/workflow/consolidate.d.ts.map +1 -0
- package/lib/dist/lib/workflow/consolidate.js +33 -0
- package/lib/dist/lib/workflow/consolidate.js.map +1 -0
- package/lib/dist/lib/workflow/index.d.ts +13 -0
- package/lib/dist/lib/workflow/index.d.ts.map +1 -0
- package/lib/dist/lib/workflow/index.js +12 -0
- package/lib/dist/lib/workflow/index.js.map +1 -0
- package/lib/dist/lib/workflow/ledger.d.ts +30 -0
- package/lib/dist/lib/workflow/ledger.d.ts.map +1 -0
- package/lib/dist/lib/workflow/ledger.js +41 -0
- package/lib/dist/lib/workflow/ledger.js.map +1 -0
- package/lib/dist/lib/workflow/pool.d.ts +13 -0
- package/lib/dist/lib/workflow/pool.d.ts.map +1 -0
- package/lib/dist/lib/workflow/pool.js +44 -0
- package/lib/dist/lib/workflow/pool.js.map +1 -0
- package/lib/dist/lib/workflow/source.d.ts +22 -0
- package/lib/dist/lib/workflow/source.d.ts.map +1 -0
- package/lib/dist/lib/workflow/source.js +29 -0
- package/lib/dist/lib/workflow/source.js.map +1 -0
- package/lib/dist/lib/workflow/stepB.d.ts +71 -0
- package/lib/dist/lib/workflow/stepB.d.ts.map +1 -0
- package/lib/dist/lib/workflow/stepB.js +99 -0
- package/lib/dist/lib/workflow/stepB.js.map +1 -0
- package/lib/dist/lib/workflow/types.d.ts +86 -0
- package/lib/dist/lib/workflow/types.d.ts.map +1 -0
- package/lib/dist/lib/workflow/types.js +6 -0
- package/lib/dist/lib/workflow/types.js.map +1 -0
- package/lib/dist/lib/workflow/workflow.d.ts +119 -0
- package/lib/dist/lib/workflow/workflow.d.ts.map +1 -0
- package/lib/dist/lib/workflow/workflow.js +195 -0
- package/lib/dist/lib/workflow/workflow.js.map +1 -0
- package/lib/dist/services/agent/aguiConverter.d.ts +50 -0
- package/lib/dist/services/agent/aguiConverter.d.ts.map +1 -0
- package/lib/dist/services/agent/aguiConverter.js +449 -0
- package/lib/dist/services/agent/aguiConverter.js.map +1 -0
- package/lib/dist/services/agent/index.d.ts +10 -0
- package/lib/dist/services/agent/index.d.ts.map +1 -0
- package/lib/dist/services/agent/index.js +12 -0
- package/lib/dist/services/agent/index.js.map +1 -0
- package/lib/dist/services/agent/payloadBuilder.d.ts +33 -0
- package/lib/dist/services/agent/payloadBuilder.d.ts.map +1 -0
- package/lib/dist/services/agent/payloadBuilder.js +75 -0
- package/lib/dist/services/agent/payloadBuilder.js.map +1 -0
- package/lib/dist/services/agent/sseStream.d.ts +43 -0
- package/lib/dist/services/agent/sseStream.d.ts.map +1 -0
- package/lib/dist/services/agent/sseStream.js +223 -0
- package/lib/dist/services/agent/sseStream.js.map +1 -0
- package/lib/dist/services/connectors/agui/AGUIStreamingConnector.d.ts +44 -0
- package/lib/dist/services/connectors/agui/AGUIStreamingConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/agui/AGUIStreamingConnector.js +95 -0
- package/lib/dist/services/connectors/agui/AGUIStreamingConnector.js.map +1 -0
- package/lib/dist/services/connectors/base/BaseConnector.d.ts +81 -0
- package/lib/dist/services/connectors/base/BaseConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/base/BaseConnector.js +170 -0
- package/lib/dist/services/connectors/base/BaseConnector.js.map +1 -0
- package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.d.ts +126 -0
- package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.js +417 -0
- package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.js.map +1 -0
- package/lib/dist/services/connectors/index.d.ts +13 -0
- package/lib/dist/services/connectors/index.d.ts.map +1 -0
- package/lib/dist/services/connectors/index.js +32 -0
- package/lib/dist/services/connectors/index.js.map +1 -0
- package/lib/dist/services/connectors/kiro/KiroConnector.d.ts +48 -0
- package/lib/dist/services/connectors/kiro/KiroConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/kiro/KiroConnector.js +158 -0
- package/lib/dist/services/connectors/kiro/KiroConnector.js.map +1 -0
- package/lib/dist/services/connectors/langgraph/LangGraphConnector.d.ts +36 -0
- package/lib/dist/services/connectors/langgraph/LangGraphConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/langgraph/LangGraphConnector.js +175 -0
- package/lib/dist/services/connectors/langgraph/LangGraphConnector.js.map +1 -0
- package/lib/dist/services/connectors/mock/MockConnector.d.ts +37 -0
- package/lib/dist/services/connectors/mock/MockConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/mock/MockConnector.js +120 -0
- package/lib/dist/services/connectors/mock/MockConnector.js.map +1 -0
- package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.d.ts +42 -0
- package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.js +133 -0
- package/lib/dist/services/connectors/openai-compatible/OpenAICompatibleConnector.js.map +1 -0
- package/lib/dist/services/connectors/pi/PiConnector.d.ts +87 -0
- package/lib/dist/services/connectors/pi/PiConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/pi/PiConnector.js +274 -0
- package/lib/dist/services/connectors/pi/PiConnector.js.map +1 -0
- package/lib/dist/services/connectors/registry.d.ts +57 -0
- package/lib/dist/services/connectors/registry.d.ts.map +1 -0
- package/lib/dist/services/connectors/registry.js +106 -0
- package/lib/dist/services/connectors/registry.js.map +1 -0
- package/lib/dist/services/connectors/rest/RESTConnector.d.ts +38 -0
- package/lib/dist/services/connectors/rest/RESTConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/rest/RESTConnector.js +117 -0
- package/lib/dist/services/connectors/rest/RESTConnector.js.map +1 -0
- package/lib/dist/services/connectors/server.d.ts +13 -0
- package/lib/dist/services/connectors/server.d.ts.map +1 -0
- package/lib/dist/services/connectors/server.js +34 -0
- package/lib/dist/services/connectors/server.js.map +1 -0
- package/lib/dist/services/connectors/strands/StrandsConnector.d.ts +48 -0
- package/lib/dist/services/connectors/strands/StrandsConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/strands/StrandsConnector.js +221 -0
- package/lib/dist/services/connectors/strands/StrandsConnector.js.map +1 -0
- package/lib/dist/services/connectors/subprocess/SubprocessConnector.d.ts +88 -0
- package/lib/dist/services/connectors/subprocess/SubprocessConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/subprocess/SubprocessConnector.js +426 -0
- package/lib/dist/services/connectors/subprocess/SubprocessConnector.js.map +1 -0
- package/lib/dist/services/connectors/types.d.ts +213 -0
- package/lib/dist/services/connectors/types.d.ts.map +1 -0
- package/lib/dist/services/connectors/types.js +6 -0
- package/lib/dist/services/connectors/types.js.map +1 -0
- package/lib/dist/services/evaluation/bedrockJudge.d.ts +71 -0
- package/lib/dist/services/evaluation/bedrockJudge.d.ts.map +1 -0
- package/lib/dist/services/evaluation/bedrockJudge.js +169 -0
- package/lib/dist/services/evaluation/bedrockJudge.js.map +1 -0
- package/lib/dist/services/evaluation/evaluatorError.d.ts +56 -0
- package/lib/dist/services/evaluation/evaluatorError.d.ts.map +1 -0
- package/lib/dist/services/evaluation/evaluatorError.js +56 -0
- package/lib/dist/services/evaluation/evaluatorError.js.map +1 -0
- package/lib/dist/services/evaluation/index.d.ts +106 -0
- package/lib/dist/services/evaluation/index.d.ts.map +1 -0
- package/lib/dist/services/evaluation/index.js +684 -0
- package/lib/dist/services/evaluation/index.js.map +1 -0
- package/lib/dist/services/evaluation/mockTrajectory.d.ts +3 -0
- package/lib/dist/services/evaluation/mockTrajectory.d.ts.map +1 -0
- package/lib/dist/services/evaluation/mockTrajectory.js +72 -0
- package/lib/dist/services/evaluation/mockTrajectory.js.map +1 -0
- package/lib/dist/services/opensearch/client.d.ts +26 -0
- package/lib/dist/services/opensearch/client.d.ts.map +1 -0
- package/lib/dist/services/opensearch/client.js +131 -0
- package/lib/dist/services/opensearch/client.js.map +1 -0
- package/lib/dist/services/opensearch/index.d.ts +16 -0
- package/lib/dist/services/opensearch/index.d.ts.map +1 -0
- package/lib/dist/services/opensearch/index.js +25 -0
- package/lib/dist/services/opensearch/index.js.map +1 -0
- package/lib/dist/services/storage/asyncBenchmarkStorage.d.ts +123 -0
- package/lib/dist/services/storage/asyncBenchmarkStorage.d.ts.map +1 -0
- package/lib/dist/services/storage/asyncBenchmarkStorage.js +440 -0
- package/lib/dist/services/storage/asyncBenchmarkStorage.js.map +1 -0
- package/lib/dist/services/storage/asyncRunStorage.d.ts +135 -0
- package/lib/dist/services/storage/asyncRunStorage.d.ts.map +1 -0
- package/lib/dist/services/storage/asyncRunStorage.js +524 -0
- package/lib/dist/services/storage/asyncRunStorage.js.map +1 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.d.ts +170 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.d.ts.map +1 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.js +301 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.js.map +1 -0
- package/lib/dist/services/storage/index.d.ts +17 -0
- package/lib/dist/services/storage/index.d.ts.map +1 -0
- package/lib/dist/services/storage/index.js +20 -0
- package/lib/dist/services/storage/index.js.map +1 -0
- package/lib/dist/services/storage/migration.d.ts +54 -0
- package/lib/dist/services/storage/migration.d.ts.map +1 -0
- package/lib/dist/services/storage/migration.js +296 -0
- package/lib/dist/services/storage/migration.js.map +1 -0
- package/lib/dist/services/storage/opensearchClient.d.ts +947 -0
- package/lib/dist/services/storage/opensearchClient.d.ts.map +1 -0
- package/lib/dist/services/storage/opensearchClient.js +442 -0
- package/lib/dist/services/storage/opensearchClient.js.map +1 -0
- package/lib/dist/services/traces/browserRecovery.d.ts +37 -0
- package/lib/dist/services/traces/browserRecovery.d.ts.map +1 -0
- package/lib/dist/services/traces/browserRecovery.js +108 -0
- package/lib/dist/services/traces/browserRecovery.js.map +1 -0
- package/lib/dist/services/traces/categoryStyles.d.ts +21 -0
- package/lib/dist/services/traces/categoryStyles.d.ts.map +1 -0
- package/lib/dist/services/traces/categoryStyles.js +56 -0
- package/lib/dist/services/traces/categoryStyles.js.map +1 -0
- package/lib/dist/services/traces/executionOrderTransform.d.ts +35 -0
- package/lib/dist/services/traces/executionOrderTransform.d.ts.map +1 -0
- package/lib/dist/services/traces/executionOrderTransform.js +313 -0
- package/lib/dist/services/traces/executionOrderTransform.js.map +1 -0
- package/lib/dist/services/traces/fetchSpansForRun.d.ts +86 -0
- package/lib/dist/services/traces/fetchSpansForRun.d.ts.map +1 -0
- package/lib/dist/services/traces/fetchSpansForRun.js +69 -0
- package/lib/dist/services/traces/fetchSpansForRun.js.map +1 -0
- package/lib/dist/services/traces/flowTransform.d.ts +24 -0
- package/lib/dist/services/traces/flowTransform.d.ts.map +1 -0
- package/lib/dist/services/traces/flowTransform.js +228 -0
- package/lib/dist/services/traces/flowTransform.js.map +1 -0
- package/lib/dist/services/traces/index.d.ts +121 -0
- package/lib/dist/services/traces/index.d.ts.map +1 -0
- package/lib/dist/services/traces/index.js +255 -0
- package/lib/dist/services/traces/index.js.map +1 -0
- package/lib/dist/services/traces/intentTransform.d.ts +20 -0
- package/lib/dist/services/traces/intentTransform.d.ts.map +1 -0
- package/lib/dist/services/traces/intentTransform.js +131 -0
- package/lib/dist/services/traces/intentTransform.js.map +1 -0
- package/lib/dist/services/traces/judgeAgentsHints.d.ts +63 -0
- package/lib/dist/services/traces/judgeAgentsHints.d.ts.map +1 -0
- package/lib/dist/services/traces/judgeAgentsHints.js +89 -0
- package/lib/dist/services/traces/judgeAgentsHints.js.map +1 -0
- package/lib/dist/services/traces/messageExtraction.d.ts +15 -0
- package/lib/dist/services/traces/messageExtraction.d.ts.map +1 -0
- package/lib/dist/services/traces/messageExtraction.js +313 -0
- package/lib/dist/services/traces/messageExtraction.js.map +1 -0
- package/lib/dist/services/traces/spanCategorization.d.ts +63 -0
- package/lib/dist/services/traces/spanCategorization.d.ts.map +1 -0
- package/lib/dist/services/traces/spanCategorization.js +276 -0
- package/lib/dist/services/traces/spanCategorization.js.map +1 -0
- package/lib/dist/services/traces/spanPreprocessing.d.ts +37 -0
- package/lib/dist/services/traces/spanPreprocessing.d.ts.map +1 -0
- package/lib/dist/services/traces/spanPreprocessing.js +102 -0
- package/lib/dist/services/traces/spanPreprocessing.js.map +1 -0
- package/lib/dist/services/traces/spansToTrajectory.d.ts +36 -0
- package/lib/dist/services/traces/spansToTrajectory.d.ts.map +1 -0
- package/lib/dist/services/traces/spansToTrajectory.js +425 -0
- package/lib/dist/services/traces/spansToTrajectory.js.map +1 -0
- package/lib/dist/services/traces/toolSimilarity.d.ts +35 -0
- package/lib/dist/services/traces/toolSimilarity.d.ts.map +1 -0
- package/lib/dist/services/traces/toolSimilarity.js +203 -0
- package/lib/dist/services/traces/toolSimilarity.js.map +1 -0
- package/lib/dist/services/traces/traceComparison.d.ts +31 -0
- package/lib/dist/services/traces/traceComparison.d.ts.map +1 -0
- package/lib/dist/services/traces/traceComparison.js +318 -0
- package/lib/dist/services/traces/traceComparison.js.map +1 -0
- package/lib/dist/services/traces/traceGrouping.d.ts +19 -0
- package/lib/dist/services/traces/traceGrouping.d.ts.map +1 -0
- package/lib/dist/services/traces/traceGrouping.js +107 -0
- package/lib/dist/services/traces/traceGrouping.js.map +1 -0
- package/lib/dist/services/traces/tracePoller.d.ts +108 -0
- package/lib/dist/services/traces/tracePoller.d.ts.map +1 -0
- package/lib/dist/services/traces/tracePoller.js +475 -0
- package/lib/dist/services/traces/tracePoller.js.map +1 -0
- package/lib/dist/services/traces/traceStats.d.ts +45 -0
- package/lib/dist/services/traces/traceStats.d.ts.map +1 -0
- package/lib/dist/services/traces/traceStats.js +114 -0
- package/lib/dist/services/traces/traceStats.js.map +1 -0
- package/lib/dist/services/traces/traceSummary.d.ts +47 -0
- package/lib/dist/services/traces/traceSummary.d.ts.map +1 -0
- package/lib/dist/services/traces/traceSummary.js +68 -0
- package/lib/dist/services/traces/traceSummary.js.map +1 -0
- package/lib/dist/services/traces/utils.d.ts +33 -0
- package/lib/dist/services/traces/utils.d.ts.map +1 -0
- package/lib/dist/services/traces/utils.js +114 -0
- package/lib/dist/services/traces/utils.js.map +1 -0
- package/lib/dist/types/agui.d.ts +13 -0
- package/lib/dist/types/agui.d.ts.map +1 -0
- package/lib/dist/types/agui.js +16 -0
- package/lib/dist/types/agui.js.map +1 -0
- package/lib/dist/types/index.d.ts +1229 -0
- package/lib/dist/types/index.d.ts.map +1 -0
- package/lib/dist/types/index.js +12 -0
- package/lib/dist/types/index.js.map +1 -0
- package/lib/dist/types/skills.d.ts +146 -0
- package/lib/dist/types/skills.d.ts.map +1 -0
- package/lib/dist/types/skills.js +6 -0
- package/lib/dist/types/skills.js.map +1 -0
- package/observio-sample-agent/pi-package/README.md +112 -0
- package/observio-sample-agent/pi-package/extensions/agent-health.ts +373 -0
- package/observio-sample-agent/pi-package/package.json +17 -0
- package/observio-sample-agent/pi-package/prompts/agent-health.md +37 -0
- package/observio-sample-agent/pi-package/skills/create-pr/SKILL.md +88 -0
- package/observio-sample-agent/pi-package/skills/fix-bug/SKILL.md +71 -0
- package/observio-sample-agent/pi-package/skills/implement-feature/SKILL.md +156 -0
- package/observio-sample-agent/pi-package/skills/instrument-otel/SKILL.md +208 -0
- package/observio-sample-agent/pi-package/skills/setup-collector/SKILL.md +146 -0
- package/observio-sample-agent/pi-package/skills/write-test/SKILL.md +115 -0
- package/package.json +45 -9
- package/server/dist/app.js +34031 -18731
- package/server/dist/index.js +30737 -15338
- package/tsconfig.lib.json +71 -0
- package/dist/assets/index-BOIP5L7h.js +0 -246
- package/dist/assets/index-CU9YKpAL.css +0 -1
- package/lib/dist/config/index.js +0 -452
- package/lib/dist/index.js +0 -1725
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Matcher session — collects MatcherResult[] for the currently-executing
|
|
7
|
+
* test body. Matchers (expect/judge/traces) record into the active session
|
|
8
|
+
* via `recordVerdict`.
|
|
9
|
+
*
|
|
10
|
+
* Concurrency model (RFC 004, "kills the global session"):
|
|
11
|
+
*
|
|
12
|
+
* The session is held in an AsyncLocalStorage so that bodies running
|
|
13
|
+
* concurrently (the runners dispatch up to `concurrency` tests at once,
|
|
14
|
+
* interleaving at every `await`) each record into their OWN session.
|
|
15
|
+
* Before this, a single module-level `activeSession` was shared by all
|
|
16
|
+
* in-flight bodies, so verdicts cross-contaminated between tests.
|
|
17
|
+
*
|
|
18
|
+
* `runInSession(fn)` is the concurrency-safe entry point and is what the
|
|
19
|
+
* runners use: it establishes a fresh session for the duration of `fn`
|
|
20
|
+
* (and everything it `await`s) and returns the collected results.
|
|
21
|
+
*
|
|
22
|
+
* The legacy `startSession()` / `endSession()` pair is retained for
|
|
23
|
+
* synchronous, non-interleaved callers (unit tests, simple scripts). It
|
|
24
|
+
* uses a module-global fallback session. When an AsyncLocalStorage scope
|
|
25
|
+
* is active (i.e. we're inside `runInSession`), the ALS session always
|
|
26
|
+
* takes precedence over the global, so the two never collide.
|
|
27
|
+
*/
|
|
28
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
|
29
|
+
/** Per-async-context session. Set for the duration of `runInSession(fn)`. */
|
|
30
|
+
const sessionStore = new AsyncLocalStorage();
|
|
31
|
+
/** Legacy module-global session for direct startSession()/endSession() callers. */
|
|
32
|
+
let legacySession = null;
|
|
33
|
+
function newSession() {
|
|
34
|
+
return { results: [], startedAt: Date.now() };
|
|
35
|
+
}
|
|
36
|
+
/** The session verdicts should be recorded into right now, if any. */
|
|
37
|
+
function currentSession() {
|
|
38
|
+
return sessionStore.getStore() ?? legacySession;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Run `fn` with a fresh, isolated matcher session and return the verdicts
|
|
42
|
+
* recorded during it. Concurrency-safe: each call gets its own session via
|
|
43
|
+
* AsyncLocalStorage, so interleaved bodies never share verdicts.
|
|
44
|
+
*
|
|
45
|
+
* Results are returned even when `fn` throws — the caller can inspect both
|
|
46
|
+
* the partial results and the error (cleanup hooks that record after a body
|
|
47
|
+
* failure therefore still surface in the breakdown).
|
|
48
|
+
*/
|
|
49
|
+
export async function runInSession(fn) {
|
|
50
|
+
const session = newSession();
|
|
51
|
+
try {
|
|
52
|
+
const value = await sessionStore.run(session, fn);
|
|
53
|
+
return { results: session.results, value };
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
return { results: session.results, error };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Begin a fresh global session and make it active (legacy API).
|
|
61
|
+
*
|
|
62
|
+
* Prefer {@link runInSession} for anything that may run concurrently. This
|
|
63
|
+
* remains for synchronous, single-threaded callers.
|
|
64
|
+
*/
|
|
65
|
+
export function startSession() {
|
|
66
|
+
legacySession = newSession();
|
|
67
|
+
return legacySession;
|
|
68
|
+
}
|
|
69
|
+
/** Stop the current global session and return its results (legacy API). */
|
|
70
|
+
export function endSession() {
|
|
71
|
+
if (!legacySession)
|
|
72
|
+
return [];
|
|
73
|
+
const out = legacySession.results;
|
|
74
|
+
legacySession = null;
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
/** True when a session is active (ALS scope or legacy global). */
|
|
78
|
+
export function isSessionActive() {
|
|
79
|
+
return currentSession() !== null;
|
|
80
|
+
}
|
|
81
|
+
/** Record a single matcher verdict on the active session. No-op when none. */
|
|
82
|
+
export function recordVerdict(result) {
|
|
83
|
+
const session = currentSession();
|
|
84
|
+
if (!session)
|
|
85
|
+
return;
|
|
86
|
+
session.results.push(result);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Record a verdict computed from a try/catch around the matcher body.
|
|
90
|
+
* Convenience wrapper used by judge() and traces helpers; chai matchers go
|
|
91
|
+
* through the chai plugin in `./expect.ts`.
|
|
92
|
+
*/
|
|
93
|
+
export async function recordWithTiming(description, method, fn) {
|
|
94
|
+
const start = Date.now();
|
|
95
|
+
try {
|
|
96
|
+
const value = await fn();
|
|
97
|
+
recordVerdict({
|
|
98
|
+
description,
|
|
99
|
+
pass: true,
|
|
100
|
+
method,
|
|
101
|
+
durationMs: Date.now() - start,
|
|
102
|
+
});
|
|
103
|
+
return value;
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
recordVerdict({
|
|
107
|
+
description,
|
|
108
|
+
pass: false,
|
|
109
|
+
method,
|
|
110
|
+
durationMs: Date.now() - start,
|
|
111
|
+
errorMessage: err?.message || String(err),
|
|
112
|
+
});
|
|
113
|
+
throw err;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../matchers/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAQhD,6EAA6E;AAC7E,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAkB,CAAC;AAE7D,mFAAmF;AACnF,IAAI,aAAa,GAA0B,IAAI,CAAC;AAEhD,SAAS,UAAU;IACjB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AAChD,CAAC;AAED,sEAAsE;AACtE,SAAS,cAAc;IACrB,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,aAAa,CAAC;AAClD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAAwB;IAExB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAClD,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAC7C,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY;IAC1B,aAAa,GAAG,UAAU,EAAE,CAAC;IAC7B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC;IAClC,aAAa,GAAG,IAAI,CAAC;IACrB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,eAAe;IAC7B,OAAO,cAAc,EAAE,KAAK,IAAI,CAAC;AACnC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,aAAa,CAAC,MAAqB;IACjD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,MAAqB,EACrB,EAAwB;IAExB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,EAAE,CAAC;QACzB,aAAa,CAAC;YACZ,WAAW;YACX,IAAI,EAAE,IAAI;YACV,MAAM;YACN,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC/B,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,aAAa,CAAC;YACZ,WAAW;YACX,IAAI,EAAE,KAAK;YACX,MAAM;YACN,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;YAC9B,YAAY,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;SAC1C,CAAC,CAAC;QACH,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `traces` fixture — read-only access to the OTel traces emitted by the
|
|
3
|
+
* agent during this run. Pre-loaded by the runner before the test body
|
|
4
|
+
* starts; sync access from inside the body.
|
|
5
|
+
*
|
|
6
|
+
* Three construction modes (the runner picks one):
|
|
7
|
+
* - `buildTracesAccessor(spans)` — real spans available, real numbers.
|
|
8
|
+
* - `emptyTracesAccessor()` — agent opted out (`useTraces=false`).
|
|
9
|
+
* Every accessor returns 0/[] so user matchers don't blow up.
|
|
10
|
+
* - `unavailableTracesAccessor(reason)` — agent opted in (`useTraces=true`)
|
|
11
|
+
* but spans were not fetchable (no runId, fetch failed, or polling
|
|
12
|
+
* timed out). Every accessor *throws* so silent false-passes like
|
|
13
|
+
* `expect(traces.totalTokens).to.be.lessThan(10_000)` against an
|
|
14
|
+
* empty fixture become loud failures (see issue #230).
|
|
15
|
+
*
|
|
16
|
+
* Built on top of `services/traces/index.ts:fetchTracesByRunIds` —
|
|
17
|
+
* the runner is responsible for invoking that and constructing the
|
|
18
|
+
* accessor.
|
|
19
|
+
*/
|
|
20
|
+
import type { Span } from '../../types/index.js';
|
|
21
|
+
/**
|
|
22
|
+
* Where `totalCost` came from:
|
|
23
|
+
* - `'reported'` — every dollar came from a real cost attribute on a span.
|
|
24
|
+
* - `'computed'` — no span carried a cost attribute; the whole total was
|
|
25
|
+
* derived from token counts via the fallback pricing table.
|
|
26
|
+
* - `'mixed'` — some spans reported cost, others were computed.
|
|
27
|
+
* - `'none'` — no LLM spans, or no cost could be determined at all.
|
|
28
|
+
*/
|
|
29
|
+
export type CostSource = 'reported' | 'computed' | 'mixed' | 'none';
|
|
30
|
+
export interface TracesAccessor {
|
|
31
|
+
/** Sum of all prompt/completion/cache token-usage attrs across LLM spans. */
|
|
32
|
+
totalTokens: number;
|
|
33
|
+
/**
|
|
34
|
+
* Sum of all reported cost attrs, falling back to a computed estimate
|
|
35
|
+
* (from token counts + the model pricing table) when no span reports
|
|
36
|
+
* cost directly. See `costSource` to tell which happened.
|
|
37
|
+
*/
|
|
38
|
+
totalCost: number;
|
|
39
|
+
/** Whether `totalCost` was reported by spans, computed, both, or neither. */
|
|
40
|
+
costSource: CostSource;
|
|
41
|
+
/** Tool invocation summary derived from spans. */
|
|
42
|
+
toolCalls: ReadonlyArray<{
|
|
43
|
+
name: string;
|
|
44
|
+
durationMs: number;
|
|
45
|
+
}>;
|
|
46
|
+
/** Duration of the first span matching the given name, or 0 when not found. */
|
|
47
|
+
spanDuration(name: string): number;
|
|
48
|
+
/** All spans (read-only). */
|
|
49
|
+
spans: ReadonlyArray<Span>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Empty accessor — silent zeros. Used when the agent opted out of traces
|
|
53
|
+
* (`useTraces: false`). Reading any accessor returns `0` / `[]` so user
|
|
54
|
+
* matchers in opt-out scenarios don't throw.
|
|
55
|
+
*/
|
|
56
|
+
export declare function emptyTracesAccessor(): TracesAccessor;
|
|
57
|
+
/**
|
|
58
|
+
* Loud-failure accessor — every read throws. Used when the agent opted
|
|
59
|
+
* in to traces (`useTraces: true`) but spans were not retrievable. This
|
|
60
|
+
* turns the silent false-pass described in issue #230 into an actionable
|
|
61
|
+
* error, e.g.:
|
|
62
|
+
*
|
|
63
|
+
* Error: traces fixture unavailable: no spans found for runId=…
|
|
64
|
+
*
|
|
65
|
+
* Construction never throws — only attribute / method access does.
|
|
66
|
+
*/
|
|
67
|
+
export declare function unavailableTracesAccessor(reason: string): TracesAccessor;
|
|
68
|
+
/** Build a TracesAccessor from a flat list of spans. */
|
|
69
|
+
export declare function buildTracesAccessor(spans: Span[]): TracesAccessor;
|
|
70
|
+
//# sourceMappingURL=traces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traces.d.ts","sourceRoot":"","sources":["../../../matchers/traces.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAGjD;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpE,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,UAAU,EAAE,UAAU,CAAC;IACvB,kDAAkD;IAClD,SAAS,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,+EAA+E;IAC/E,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACnC,6BAA6B;IAC7B,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,cAAc,CASpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAYxE;AAgCD,wDAAwD;AACxD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,cAAc,CA+IjE"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { lookupModelRates, computeCost } from './tracesPricing.js';
|
|
6
|
+
/**
|
|
7
|
+
* Empty accessor — silent zeros. Used when the agent opted out of traces
|
|
8
|
+
* (`useTraces: false`). Reading any accessor returns `0` / `[]` so user
|
|
9
|
+
* matchers in opt-out scenarios don't throw.
|
|
10
|
+
*/
|
|
11
|
+
export function emptyTracesAccessor() {
|
|
12
|
+
return {
|
|
13
|
+
totalTokens: 0,
|
|
14
|
+
totalCost: 0,
|
|
15
|
+
costSource: 'none',
|
|
16
|
+
toolCalls: [],
|
|
17
|
+
spanDuration: () => 0,
|
|
18
|
+
spans: [],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Loud-failure accessor — every read throws. Used when the agent opted
|
|
23
|
+
* in to traces (`useTraces: true`) but spans were not retrievable. This
|
|
24
|
+
* turns the silent false-pass described in issue #230 into an actionable
|
|
25
|
+
* error, e.g.:
|
|
26
|
+
*
|
|
27
|
+
* Error: traces fixture unavailable: no spans found for runId=…
|
|
28
|
+
*
|
|
29
|
+
* Construction never throws — only attribute / method access does.
|
|
30
|
+
*/
|
|
31
|
+
export function unavailableTracesAccessor(reason) {
|
|
32
|
+
const fail = () => {
|
|
33
|
+
throw new Error(`traces fixture unavailable: ${reason}`);
|
|
34
|
+
};
|
|
35
|
+
return {
|
|
36
|
+
get totalTokens() { return fail(); },
|
|
37
|
+
get totalCost() { return fail(); },
|
|
38
|
+
get costSource() { return fail(); },
|
|
39
|
+
get toolCalls() { return fail(); },
|
|
40
|
+
get spans() { return fail(); },
|
|
41
|
+
spanDuration(_name) { return fail(); },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const PROMPT_TOKEN_KEYS = [
|
|
45
|
+
'gen_ai.usage.prompt_tokens',
|
|
46
|
+
'gen_ai.usage.input_tokens',
|
|
47
|
+
'llm.usage.prompt_tokens',
|
|
48
|
+
'input_tokens',
|
|
49
|
+
];
|
|
50
|
+
const COMPLETION_TOKEN_KEYS = [
|
|
51
|
+
'gen_ai.usage.completion_tokens',
|
|
52
|
+
'gen_ai.usage.output_tokens',
|
|
53
|
+
'llm.usage.completion_tokens',
|
|
54
|
+
'output_tokens',
|
|
55
|
+
];
|
|
56
|
+
const CACHE_READ_TOKEN_KEYS = [
|
|
57
|
+
'gen_ai.usage.cache_read_input_tokens',
|
|
58
|
+
'gen_ai.usage.cache_read_tokens',
|
|
59
|
+
'cache_read_tokens',
|
|
60
|
+
];
|
|
61
|
+
const CACHE_CREATION_TOKEN_KEYS = [
|
|
62
|
+
'gen_ai.usage.cache_creation_input_tokens',
|
|
63
|
+
'gen_ai.usage.cache_creation_tokens',
|
|
64
|
+
'cache_creation_tokens',
|
|
65
|
+
];
|
|
66
|
+
const MODEL_ID_KEYS = ['gen_ai.request.model', 'gen_ai.response.model', 'model'];
|
|
67
|
+
const ALL_TOKEN_KEYS = [
|
|
68
|
+
...PROMPT_TOKEN_KEYS,
|
|
69
|
+
...COMPLETION_TOKEN_KEYS,
|
|
70
|
+
...CACHE_READ_TOKEN_KEYS,
|
|
71
|
+
...CACHE_CREATION_TOKEN_KEYS,
|
|
72
|
+
];
|
|
73
|
+
/** Build a TracesAccessor from a flat list of spans. */
|
|
74
|
+
export function buildTracesAccessor(spans) {
|
|
75
|
+
let totalTokens = 0;
|
|
76
|
+
let reportedCost = 0;
|
|
77
|
+
let computedCost = 0;
|
|
78
|
+
let hadReportedCost = false;
|
|
79
|
+
let hadComputedCost = false;
|
|
80
|
+
let tokenBearingSpanCount = 0;
|
|
81
|
+
// codex_review (PR #440): a span can have recognized tokens yet resolve
|
|
82
|
+
// NEITHER a reported cost NOR a computed one (unpriced/unresolved model) —
|
|
83
|
+
// this counter drives `costUnknowable` below so totalCost refuses to
|
|
84
|
+
// silently under-report just because *some other* span in the same trace
|
|
85
|
+
// happened to be priceable.
|
|
86
|
+
let unresolvedCostSpanCount = 0;
|
|
87
|
+
const toolCalls = [];
|
|
88
|
+
for (const span of spans) {
|
|
89
|
+
const attrs = span.attributes ?? {};
|
|
90
|
+
const promptTokens = pickNumber(attrs, PROMPT_TOKEN_KEYS);
|
|
91
|
+
const completionTokens = pickNumber(attrs, COMPLETION_TOKEN_KEYS);
|
|
92
|
+
const cacheReadTokens = pickNumber(attrs, CACHE_READ_TOKEN_KEYS);
|
|
93
|
+
const cacheCreationTokens = pickNumber(attrs, CACHE_CREATION_TOKEN_KEYS);
|
|
94
|
+
const hasTokenAttr = promptTokens !== undefined ||
|
|
95
|
+
completionTokens !== undefined ||
|
|
96
|
+
cacheReadTokens !== undefined ||
|
|
97
|
+
cacheCreationTokens !== undefined;
|
|
98
|
+
if (hasTokenAttr)
|
|
99
|
+
tokenBearingSpanCount += 1;
|
|
100
|
+
if (promptTokens)
|
|
101
|
+
totalTokens += promptTokens;
|
|
102
|
+
if (completionTokens)
|
|
103
|
+
totalTokens += completionTokens;
|
|
104
|
+
if (cacheReadTokens)
|
|
105
|
+
totalTokens += cacheReadTokens;
|
|
106
|
+
if (cacheCreationTokens)
|
|
107
|
+
totalTokens += cacheCreationTokens;
|
|
108
|
+
const reported = pickNumber(attrs, [
|
|
109
|
+
'gen_ai.usage.cost_usd',
|
|
110
|
+
'gen_ai.usage.cost',
|
|
111
|
+
'llm.usage.cost_usd',
|
|
112
|
+
]);
|
|
113
|
+
if (reported !== undefined) {
|
|
114
|
+
hadReportedCost = true;
|
|
115
|
+
reportedCost += reported;
|
|
116
|
+
}
|
|
117
|
+
else if (hasTokenAttr) {
|
|
118
|
+
// No reported cost attribute on this span — fall back to a computed
|
|
119
|
+
// estimate from token counts, if we know pricing for the model.
|
|
120
|
+
const modelId = pickString(attrs, MODEL_ID_KEYS);
|
|
121
|
+
const rates = lookupModelRates(modelId);
|
|
122
|
+
if (rates) {
|
|
123
|
+
hadComputedCost = true;
|
|
124
|
+
computedCost += computeCost({
|
|
125
|
+
input: promptTokens ?? 0,
|
|
126
|
+
output: completionTokens ?? 0,
|
|
127
|
+
cacheRead: cacheReadTokens ?? 0,
|
|
128
|
+
cacheCreation: cacheCreationTokens ?? 0,
|
|
129
|
+
}, rates);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// This span's tokens contribute to totalTokens but NOT to totalCost —
|
|
133
|
+
// without this counter that would be a silent, plausible-looking
|
|
134
|
+
// undercount rather than the loud failure #230 asks for.
|
|
135
|
+
unresolvedCostSpanCount += 1;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Tool spans
|
|
139
|
+
const toolName = pickString(attrs, ['gen_ai.tool.name', 'llm.tool.name']);
|
|
140
|
+
if (toolName) {
|
|
141
|
+
toolCalls.push({ name: toolName, durationMs: spanDurationMs(span) });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const totalCostValue = reportedCost + computedCost;
|
|
145
|
+
const costSource = hadReportedCost && hadComputedCost
|
|
146
|
+
? 'mixed'
|
|
147
|
+
: hadReportedCost
|
|
148
|
+
? 'reported'
|
|
149
|
+
: hadComputedCost
|
|
150
|
+
? 'computed'
|
|
151
|
+
: 'none';
|
|
152
|
+
// Issue class: spans exist, but none of them carry any token-usage
|
|
153
|
+
// attribute we recognize. Reading totalTokens/totalCost would silently
|
|
154
|
+
// return 0, letting matchers like `expect(traces.totalCost).lessThan(2)`
|
|
155
|
+
// pass vacuously (mirrors the #230 fail-loud philosophy). A trace that
|
|
156
|
+
// genuinely has recognized-but-zero-valued attributes is fine and must
|
|
157
|
+
// NOT throw — only the "we found nothing we understand" case throws.
|
|
158
|
+
const noRecognizedTokenAttrs = spans.length > 0 && tokenBearingSpanCount === 0;
|
|
159
|
+
// Issue class: tokens were found, but AT LEAST ONE token-bearing span
|
|
160
|
+
// resolved neither a reported cost nor a computed one (unpriced model,
|
|
161
|
+
// no cost attribute). Pre-codex_review this only threw when EVERY span
|
|
162
|
+
// was unresolved — a trace with 9 priced spans and 1 unpriced span
|
|
163
|
+
// silently under-reported totalCost by exactly the unpriced span's real
|
|
164
|
+
// spend while still returning a plausible-looking number (PR #440 review
|
|
165
|
+
// finding, blocker). Throw only when reading totalCost (tokens themselves
|
|
166
|
+
// are legitimately known in this case) — any unresolved span makes the
|
|
167
|
+
// total untrustworthy, not just a total absence of resolved spans.
|
|
168
|
+
const costUnknowable = totalTokens > 0 && unresolvedCostSpanCount > 0;
|
|
169
|
+
return {
|
|
170
|
+
get totalTokens() {
|
|
171
|
+
if (noRecognizedTokenAttrs) {
|
|
172
|
+
throw new Error(`traces fixture: ${spans.length} span(s) present but none carried a recognized ` +
|
|
173
|
+
`token-usage attribute (checked ${ALL_TOKEN_KEYS.join(', ')}). Reading totalTokens ` +
|
|
174
|
+
`would silently return 0 — either this agent's spans use an unsupported attribute ` +
|
|
175
|
+
`shape (extend buildTracesAccessor() in lib/matchers/traces.ts), or this test case ` +
|
|
176
|
+
`has no LLM spans and should use traces.spans / traces.toolCalls instead of totalTokens.`);
|
|
177
|
+
}
|
|
178
|
+
return totalTokens;
|
|
179
|
+
},
|
|
180
|
+
get totalCost() {
|
|
181
|
+
if (noRecognizedTokenAttrs && !hadReportedCost) {
|
|
182
|
+
throw new Error(`traces fixture: ${spans.length} span(s) present but none carried a recognized ` +
|
|
183
|
+
`token-usage attribute or a cost attribute, so totalCost cannot be determined. ` +
|
|
184
|
+
`Reading totalCost would silently return 0.`);
|
|
185
|
+
}
|
|
186
|
+
if (costUnknowable) {
|
|
187
|
+
throw new Error(`traces fixture: ${unresolvedCostSpanCount} of ${tokenBearingSpanCount} span(s) with token usage ` +
|
|
188
|
+
`carried neither a cost attribute nor a model id matching the fallback pricing table (see ` +
|
|
189
|
+
`lib/matchers/tracesPricing.ts). Reading totalCost would silently UNDER-report real spend by ` +
|
|
190
|
+
`omitting those spans rather than reflect it -- add the model(s) to the pricing table or stamp a ` +
|
|
191
|
+
`cost attribute on the span(s), or use traces.spans to inspect per-span usage directly.`);
|
|
192
|
+
}
|
|
193
|
+
return totalCostValue;
|
|
194
|
+
},
|
|
195
|
+
get costSource() {
|
|
196
|
+
return costSource;
|
|
197
|
+
},
|
|
198
|
+
toolCalls,
|
|
199
|
+
spanDuration(name) {
|
|
200
|
+
const hit = spans.find(s => s.name === name);
|
|
201
|
+
return hit ? spanDurationMs(hit) : 0;
|
|
202
|
+
},
|
|
203
|
+
spans,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
function spanDurationMs(span) {
|
|
207
|
+
const start = span.startTimeUnixNano ?? span.startTime;
|
|
208
|
+
const end = span.endTimeUnixNano ?? span.endTime;
|
|
209
|
+
if (typeof start === 'number' && typeof end === 'number') {
|
|
210
|
+
// Heuristic: nanosecond timestamps when 13+ digits, else ms
|
|
211
|
+
const factor = Math.abs(start) > 1e15 ? 1e6 : 1;
|
|
212
|
+
return Math.max(0, Math.round((end - start) / factor));
|
|
213
|
+
}
|
|
214
|
+
if (typeof span.durationMs === 'number')
|
|
215
|
+
return span.durationMs;
|
|
216
|
+
return 0;
|
|
217
|
+
}
|
|
218
|
+
function pickNumber(attrs, keys) {
|
|
219
|
+
for (const k of keys) {
|
|
220
|
+
const v = attrs[k];
|
|
221
|
+
if (typeof v === 'number' && Number.isFinite(v))
|
|
222
|
+
return v;
|
|
223
|
+
if (typeof v === 'string' && v.trim() !== '' && Number.isFinite(Number(v)))
|
|
224
|
+
return Number(v);
|
|
225
|
+
}
|
|
226
|
+
return undefined;
|
|
227
|
+
}
|
|
228
|
+
function pickString(attrs, keys) {
|
|
229
|
+
for (const k of keys) {
|
|
230
|
+
const v = attrs[k];
|
|
231
|
+
if (typeof v === 'string' && v.length > 0)
|
|
232
|
+
return v;
|
|
233
|
+
}
|
|
234
|
+
return undefined;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=traces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traces.js","sourceRoot":"","sources":["../../../matchers/traces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA+BnE;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,MAAM;QAClB,SAAS,EAAE,EAAE;QACb,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;QACrB,KAAK,EAAE,EAAE;KACV,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAc;IACtD,MAAM,IAAI,GAAG,GAAU,EAAE;QACvB,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC;IACF,OAAO;QACL,IAAI,WAAW,KAAa,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5C,IAAI,SAAS,KAAa,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1C,IAAI,UAAU,KAAiB,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,SAAS,KAA0D,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QACvF,IAAI,KAAK,KAA0B,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QACnD,YAAY,CAAC,KAAa,IAAY,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;KACrC,CAAC;AACtB,CAAC;AAED,MAAM,iBAAiB,GAAG;IACxB,4BAA4B;IAC5B,2BAA2B;IAC3B,yBAAyB;IACzB,cAAc;CACf,CAAC;AACF,MAAM,qBAAqB,GAAG;IAC5B,gCAAgC;IAChC,4BAA4B;IAC5B,6BAA6B;IAC7B,eAAe;CAChB,CAAC;AACF,MAAM,qBAAqB,GAAG;IAC5B,sCAAsC;IACtC,gCAAgC;IAChC,mBAAmB;CACpB,CAAC;AACF,MAAM,yBAAyB,GAAG;IAChC,0CAA0C;IAC1C,oCAAoC;IACpC,uBAAuB;CACxB,CAAC;AACF,MAAM,aAAa,GAAG,CAAC,sBAAsB,EAAE,uBAAuB,EAAE,OAAO,CAAC,CAAC;AACjF,MAAM,cAAc,GAAG;IACrB,GAAG,iBAAiB;IACpB,GAAG,qBAAqB;IACxB,GAAG,qBAAqB;IACxB,GAAG,yBAAyB;CAC7B,CAAC;AAEF,wDAAwD;AACxD,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,qBAAqB,GAAG,CAAC,CAAC;IAC9B,wEAAwE;IACxE,2EAA2E;IAC3E,qEAAqE;IACrE,yEAAyE;IACzE,4BAA4B;IAC5B,IAAI,uBAAuB,GAAG,CAAC,CAAC;IAChC,MAAM,SAAS,GAA2C,EAAE,CAAC;IAE7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAC1D,MAAM,gBAAgB,GAAG,UAAU,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;QAClE,MAAM,eAAe,GAAG,UAAU,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;QACjE,MAAM,mBAAmB,GAAG,UAAU,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QAEzE,MAAM,YAAY,GAChB,YAAY,KAAK,SAAS;YAC1B,gBAAgB,KAAK,SAAS;YAC9B,eAAe,KAAK,SAAS;YAC7B,mBAAmB,KAAK,SAAS,CAAC;QAEpC,IAAI,YAAY;YAAE,qBAAqB,IAAI,CAAC,CAAC;QAC7C,IAAI,YAAY;YAAE,WAAW,IAAI,YAAY,CAAC;QAC9C,IAAI,gBAAgB;YAAE,WAAW,IAAI,gBAAgB,CAAC;QACtD,IAAI,eAAe;YAAE,WAAW,IAAI,eAAe,CAAC;QACpD,IAAI,mBAAmB;YAAE,WAAW,IAAI,mBAAmB,CAAC;QAE5D,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE;YACjC,uBAAuB;YACvB,mBAAmB;YACnB,oBAAoB;SACrB,CAAC,CAAC;QACH,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,eAAe,GAAG,IAAI,CAAC;YACvB,YAAY,IAAI,QAAQ,CAAC;QAC3B,CAAC;aAAM,IAAI,YAAY,EAAE,CAAC;YACxB,oEAAoE;YACpE,gEAAgE;YAChE,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACV,eAAe,GAAG,IAAI,CAAC;gBACvB,YAAY,IAAI,WAAW,CACzB;oBACE,KAAK,EAAE,YAAY,IAAI,CAAC;oBACxB,MAAM,EAAE,gBAAgB,IAAI,CAAC;oBAC7B,SAAS,EAAE,eAAe,IAAI,CAAC;oBAC/B,aAAa,EAAE,mBAAmB,IAAI,CAAC;iBACxC,EACD,KAAK,CACN,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,sEAAsE;gBACtE,iEAAiE;gBACjE,yDAAyD;gBACzD,uBAAuB,IAAI,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,aAAa;QACb,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC,CAAC;QAC1E,IAAI,QAAQ,EAAE,CAAC;YACb,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,YAAY,GAAG,YAAY,CAAC;IACnD,MAAM,UAAU,GAAe,eAAe,IAAI,eAAe;QAC/D,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,eAAe;YACf,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,eAAe;gBACf,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,MAAM,CAAC;IAEf,mEAAmE;IACnE,uEAAuE;IACvE,yEAAyE;IACzE,uEAAuE;IACvE,uEAAuE;IACvE,qEAAqE;IACrE,MAAM,sBAAsB,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,qBAAqB,KAAK,CAAC,CAAC;IAE/E,sEAAsE;IACtE,uEAAuE;IACvE,uEAAuE;IACvE,mEAAmE;IACnE,wEAAwE;IACxE,yEAAyE;IACzE,0EAA0E;IAC1E,uEAAuE;IACvE,mEAAmE;IACnE,MAAM,cAAc,GAAG,WAAW,GAAG,CAAC,IAAI,uBAAuB,GAAG,CAAC,CAAC;IAEtE,OAAO;QACL,IAAI,WAAW;YACb,IAAI,sBAAsB,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CACb,mBAAmB,KAAK,CAAC,MAAM,iDAAiD;oBAChF,kCAAkC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB;oBACpF,mFAAmF;oBACnF,oFAAoF;oBACpF,yFAAyF,CAC1F,CAAC;YACJ,CAAC;YACD,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,IAAI,SAAS;YACX,IAAI,sBAAsB,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC/C,MAAM,IAAI,KAAK,CACb,mBAAmB,KAAK,CAAC,MAAM,iDAAiD;oBAChF,gFAAgF;oBAChF,4CAA4C,CAC7C,CAAC;YACJ,CAAC;YACD,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CACb,mBAAmB,uBAAuB,OAAO,qBAAqB,4BAA4B;oBAClG,2FAA2F;oBAC3F,8FAA8F;oBAC9F,kGAAkG;oBAClG,wFAAwF,CACzF,CAAC;YACJ,CAAC;YACD,OAAO,cAAc,CAAC;QACxB,CAAC;QACD,IAAI,UAAU;YACZ,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,SAAS;QACT,YAAY,CAAC,IAAY;YACvB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAC7C,OAAO,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QACD,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAU;IAChC,MAAM,KAAK,GAAI,IAAY,CAAC,iBAAiB,IAAK,IAAY,CAAC,SAAS,CAAC;IACzE,MAAM,GAAG,GAAI,IAAY,CAAC,eAAe,IAAK,IAAY,CAAC,OAAO,CAAC;IACnE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACzD,4DAA4D;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,OAAQ,IAAY,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAQ,IAAY,CAAC,UAAU,CAAC;IAClF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,UAAU,CAAC,KAA8B,EAAE,IAAc;IAChE,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,KAA8B,EAAE,IAAc;IAChE,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fallback pricing table used by `buildTracesAccessor()` (see
|
|
3
|
+
* `lib/matchers/traces.ts`) to *compute* `totalCost` when spans carry
|
|
4
|
+
* token-usage attributes but no cost attribute (this is the common case —
|
|
5
|
+
* most OTel exporters, including Claude Code's, emit raw token counts and
|
|
6
|
+
* leave cost calculation to the consumer).
|
|
7
|
+
*
|
|
8
|
+
* Rates are USD per **million tokens** (MTok), converted to per-token below.
|
|
9
|
+
* These are point-in-time *estimates* maintained by hand — update them when
|
|
10
|
+
* pricing changes. They are intentionally separate from
|
|
11
|
+
* `server/services/codingAgents/pricing.ts` (used by the coding-agent
|
|
12
|
+
* analytics/leaderboard feature): that table silently falls back to Sonnet
|
|
13
|
+
* pricing for unknown models, which is the wrong behavior here — an eval
|
|
14
|
+
* reading `traces.totalCost` for an unpriced model must know the number is
|
|
15
|
+
* incomplete (see `buildTracesAccessor`'s fail-loud handling), not get a
|
|
16
|
+
* silently-substituted estimate.
|
|
17
|
+
*/
|
|
18
|
+
export interface ModelRates {
|
|
19
|
+
/** USD per input (prompt) token. */
|
|
20
|
+
input: number;
|
|
21
|
+
/** USD per output (completion) token. */
|
|
22
|
+
output: number;
|
|
23
|
+
/** USD per cache-read token (cheaper than a fresh input token). */
|
|
24
|
+
cacheRead: number;
|
|
25
|
+
/** USD per cache-creation/write token (pricier than a fresh input token). */
|
|
26
|
+
cacheCreation: number;
|
|
27
|
+
}
|
|
28
|
+
/** Look up rates for a model id. Returns `undefined` when no rule matches. */
|
|
29
|
+
export declare function lookupModelRates(modelId: string | undefined): ModelRates | undefined;
|
|
30
|
+
export interface UsageTokens {
|
|
31
|
+
input: number;
|
|
32
|
+
output: number;
|
|
33
|
+
cacheRead: number;
|
|
34
|
+
cacheCreation: number;
|
|
35
|
+
}
|
|
36
|
+
/** Compute USD cost for a set of token counts against a model's rates. */
|
|
37
|
+
export declare function computeCost(tokens: UsageTokens, rates: ModelRates): number;
|
|
38
|
+
//# sourceMappingURL=tracesPricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracesPricing.d.ts","sourceRoot":"","sources":["../../../matchers/tracesPricing.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,UAAU;IACzB,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,aAAa,EAAE,MAAM,CAAC;CACvB;AA8CD,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAMpF;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAO1E"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
const PER_MTOK = 1_000_000;
|
|
6
|
+
/**
|
|
7
|
+
* Estimated Bedrock/Anthropic Claude rates, USD per MTok:
|
|
8
|
+
* Sonnet class: $3 in / $15 out / $0.30 cache-read / $3.75 cache-write
|
|
9
|
+
* Opus class: $15 in / $75 out / $1.50 cache-read / $18.75 cache-write
|
|
10
|
+
* Haiku class: $0.80 in / $4 out / $0.08 cache-read / $1.00 cache-write
|
|
11
|
+
* Keyed by substrings matched case-insensitively against the span's model
|
|
12
|
+
* id (see `resolveModelId`), so both raw Anthropic ids
|
|
13
|
+
* (`claude-sonnet-4-6-...`) and Bedrock ids
|
|
14
|
+
* (`us.anthropic.claude-sonnet-4-6-...`) match.
|
|
15
|
+
*/
|
|
16
|
+
const RATE_TABLE = [
|
|
17
|
+
{
|
|
18
|
+
match: /opus/i,
|
|
19
|
+
rates: {
|
|
20
|
+
input: 15 / PER_MTOK,
|
|
21
|
+
output: 75 / PER_MTOK,
|
|
22
|
+
cacheRead: 1.5 / PER_MTOK,
|
|
23
|
+
cacheCreation: 18.75 / PER_MTOK,
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
match: /haiku/i,
|
|
28
|
+
rates: {
|
|
29
|
+
input: 0.8 / PER_MTOK,
|
|
30
|
+
output: 4 / PER_MTOK,
|
|
31
|
+
cacheRead: 0.08 / PER_MTOK,
|
|
32
|
+
cacheCreation: 1.0 / PER_MTOK,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
// Sonnet is the default Claude class; matched last so opus/haiku take
|
|
37
|
+
// priority, but also serves as the generic "claude" match.
|
|
38
|
+
match: /sonnet|claude/i,
|
|
39
|
+
rates: {
|
|
40
|
+
input: 3 / PER_MTOK,
|
|
41
|
+
output: 15 / PER_MTOK,
|
|
42
|
+
cacheRead: 0.3 / PER_MTOK,
|
|
43
|
+
cacheCreation: 3.75 / PER_MTOK,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
/** Look up rates for a model id. Returns `undefined` when no rule matches. */
|
|
48
|
+
export function lookupModelRates(modelId) {
|
|
49
|
+
if (!modelId)
|
|
50
|
+
return undefined;
|
|
51
|
+
for (const { match, rates } of RATE_TABLE) {
|
|
52
|
+
if (match.test(modelId))
|
|
53
|
+
return rates;
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
/** Compute USD cost for a set of token counts against a model's rates. */
|
|
58
|
+
export function computeCost(tokens, rates) {
|
|
59
|
+
return (tokens.input * rates.input +
|
|
60
|
+
tokens.output * rates.output +
|
|
61
|
+
tokens.cacheRead * rates.cacheRead +
|
|
62
|
+
tokens.cacheCreation * rates.cacheCreation);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=tracesPricing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracesPricing.js","sourceRoot":"","sources":["../../../matchers/tracesPricing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA+BH,MAAM,QAAQ,GAAG,SAAS,CAAC;AAE3B;;;;;;;;;GASG;AACH,MAAM,UAAU,GAAgD;IAC9D;QACE,KAAK,EAAE,OAAO;QACd,KAAK,EAAE;YACL,KAAK,EAAE,EAAE,GAAG,QAAQ;YACpB,MAAM,EAAE,EAAE,GAAG,QAAQ;YACrB,SAAS,EAAE,GAAG,GAAG,QAAQ;YACzB,aAAa,EAAE,KAAK,GAAG,QAAQ;SAChC;KACF;IACD;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE;YACL,KAAK,EAAE,GAAG,GAAG,QAAQ;YACrB,MAAM,EAAE,CAAC,GAAG,QAAQ;YACpB,SAAS,EAAE,IAAI,GAAG,QAAQ;YAC1B,aAAa,EAAE,GAAG,GAAG,QAAQ;SAC9B;KACF;IACD;QACE,sEAAsE;QACtE,2DAA2D;QAC3D,KAAK,EAAE,gBAAgB;QACvB,KAAK,EAAE;YACL,KAAK,EAAE,CAAC,GAAG,QAAQ;YACnB,MAAM,EAAE,EAAE,GAAG,QAAQ;YACrB,SAAS,EAAE,GAAG,GAAG,QAAQ;YACzB,aAAa,EAAE,IAAI,GAAG,QAAQ;SAC/B;KACF;CACF,CAAC;AAEF,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAAC,OAA2B;IAC1D,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,UAAU,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;IACxC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AASD,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAC,MAAmB,EAAE,KAAiB;IAChE,OAAO,CACL,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;QAC1B,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QAC5B,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;QAClC,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAC3C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-matcher result types.
|
|
3
|
+
*
|
|
4
|
+
* Each call into `expect(...).to.X(...)`, `judge(...)`, or a traces helper
|
|
5
|
+
* produces one MatcherResult. The runner collects them per test case and
|
|
6
|
+
* persists them on TestCaseRun so the UI can show a breakdown like
|
|
7
|
+
*
|
|
8
|
+
* ✅ to contain 'root cause' [code-assertion]
|
|
9
|
+
* ❌ to be lessThan 30000 [code-assertion] actual: 47320
|
|
10
|
+
* ✅ identifies failing dependency [llm-judge] score: 0.85
|
|
11
|
+
* ✅ traces.totalTokens < 10000 [traces]
|
|
12
|
+
*/
|
|
13
|
+
export type MatcherMethod = 'code-assertion' | 'llm-judge' | 'traces' | 'evaluator';
|
|
14
|
+
export interface MatcherResult {
|
|
15
|
+
/** Human-readable description, e.g. "to contain 'root cause'". */
|
|
16
|
+
description: string;
|
|
17
|
+
/** Whether this matcher passed. */
|
|
18
|
+
pass: boolean;
|
|
19
|
+
/** Family the matcher belongs to. */
|
|
20
|
+
method: MatcherMethod;
|
|
21
|
+
/**
|
|
22
|
+
* Whether this signal gates the test verdict. `gate` (default) means a
|
|
23
|
+
* failing result fails the test; `observe` means the result is recorded
|
|
24
|
+
* for score/insights only and never fails the test (RFC 004 §4.8).
|
|
25
|
+
* `code-assertion` and `traces` matchers are always gates; `llm-judge`
|
|
26
|
+
* entries are `gate` for `judge()` and `observe` for `judge.observe()`.
|
|
27
|
+
*/
|
|
28
|
+
role?: 'gate' | 'observe';
|
|
29
|
+
/**
|
|
30
|
+
* True when the matcher could not be evaluated at all (e.g. the judge
|
|
31
|
+
* endpoint errored) — distinct from a clean `pass: false`. Errored
|
|
32
|
+
* signals are excluded from pass-rate aggregation (status `errored`).
|
|
33
|
+
*/
|
|
34
|
+
errored?: boolean;
|
|
35
|
+
/** Wall-clock time spent evaluating this matcher (ms). */
|
|
36
|
+
durationMs?: number;
|
|
37
|
+
/** The actual value as seen by the matcher (best-effort). */
|
|
38
|
+
actual?: unknown;
|
|
39
|
+
/** The expected value as configured by the user (best-effort). */
|
|
40
|
+
expected?: unknown;
|
|
41
|
+
/** Failure message from the chai assertion when pass is false. */
|
|
42
|
+
errorMessage?: string;
|
|
43
|
+
/** Confidence score on the [0, 1] interval, when available. */
|
|
44
|
+
score?: number;
|
|
45
|
+
/** Free-form judge reasoning, when available. */
|
|
46
|
+
reasoning?: string;
|
|
47
|
+
/** Model used by the judge for this matcher. */
|
|
48
|
+
model?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Actionable suggestions produced by the judge when the verdict is
|
|
51
|
+
* `pass: false` (or, for the auto-judge path, when accuracy < 100).
|
|
52
|
+
* Same shape as the report-level field; carried per-call here so
|
|
53
|
+
* SDK multi-judge runs preserve per-claim feedback.
|
|
54
|
+
*/
|
|
55
|
+
improvementStrategies?: Array<{
|
|
56
|
+
category: string;
|
|
57
|
+
issue: string;
|
|
58
|
+
recommendation: string;
|
|
59
|
+
priority: 'high' | 'medium' | 'low';
|
|
60
|
+
}>;
|
|
61
|
+
/**
|
|
62
|
+
* Full judge metric breakdown when the judge produces multiple
|
|
63
|
+
* dimensions. `score` (above) is the headline value (typically
|
|
64
|
+
* `accuracy / 100`); this object exposes the rest. All keys are
|
|
65
|
+
* optional because the judge only emits them when applicable.
|
|
66
|
+
*/
|
|
67
|
+
judgeMetrics?: {
|
|
68
|
+
accuracy?: number;
|
|
69
|
+
faithfulness?: number;
|
|
70
|
+
latency_score?: number;
|
|
71
|
+
trajectory_alignment_score?: number;
|
|
72
|
+
[k: string]: number | undefined;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../matchers/types.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,aAAa,GACrB,gBAAgB,GAChB,WAAW,GACX,QAAQ,GACR,WAAW,CAAC;AAEhB,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,qCAAqC;IACrC,MAAM,EAAE,aAAa,CAAC;IACtB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IASf;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,KAAK,CAAC;QAC5B,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;KACrC,CAAC,CAAC;IAEH;;;;;OAKG;IACH,YAAY,CAAC,EAAE;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,0BAA0B,CAAC,EAAE,MAAM,CAAC;QACpC,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACjC,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../matchers/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|