@opensearch-project/agent-health 0.3.0 → 0.5.2
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 +77 -6
- package/cli/dist/index.js +10072 -4502
- package/deployment/cloudformation/agent-health-observability.yaml +762 -0
- package/dist/assets/index-CCQRDlO0.js +243 -0
- package/dist/assets/index-CNHQVbcj.css +1 -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 +431 -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 +390 -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 +577 -0
- package/docs/SKILLS.md +264 -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 +598 -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/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/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/benchmarkVersionUtils.d.ts +37 -0
- package/lib/dist/lib/benchmarkVersionUtils.d.ts.map +1 -0
- package/lib/dist/lib/benchmarkVersionUtils.js +68 -0
- package/lib/dist/lib/benchmarkVersionUtils.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 +258 -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 +231 -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 +70 -0
- package/lib/dist/lib/constants.d.ts.map +1 -0
- package/lib/dist/lib/constants.js +365 -0
- package/lib/dist/lib/constants.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 +73 -0
- package/lib/dist/lib/envCompat.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 +55 -0
- package/lib/dist/lib/matchers/traces.d.ts.map +1 -0
- package/lib/dist/lib/matchers/traces.js +116 -0
- package/lib/dist/lib/matchers/traces.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 +92 -0
- package/lib/dist/lib/runStats.d.ts.map +1 -0
- package/lib/dist/lib/runStats.js +160 -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 +26 -0
- package/lib/dist/lib/testCases/loader.d.ts.map +1 -0
- package/lib/dist/lib/testCases/loader.js +149 -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 +96 -0
- package/lib/dist/lib/utils.d.ts.map +1 -0
- package/lib/dist/lib/utils.js +232 -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 +116 -0
- package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.d.ts.map +1 -0
- package/lib/dist/services/connectors/claude-code/ClaudeCodeConnector.js +403 -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 +418 -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 +64 -0
- package/lib/dist/services/evaluation/bedrockJudge.d.ts.map +1 -0
- package/lib/dist/services/evaluation/bedrockJudge.js +167 -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 +429 -0
- package/lib/dist/services/storage/asyncBenchmarkStorage.js.map +1 -0
- package/lib/dist/services/storage/asyncRunStorage.d.ts +127 -0
- package/lib/dist/services/storage/asyncRunStorage.d.ts.map +1 -0
- package/lib/dist/services/storage/asyncRunStorage.js +448 -0
- package/lib/dist/services/storage/asyncRunStorage.js.map +1 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.d.ts +156 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.d.ts.map +1 -0
- package/lib/dist/services/storage/asyncTestCaseStorage.js +285 -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 +924 -0
- package/lib/dist/services/storage/opensearchClient.d.ts.map +1 -0
- package/lib/dist/services/storage/opensearchClient.js +435 -0
- package/lib/dist/services/storage/opensearchClient.js.map +1 -0
- package/lib/dist/services/traces/browserRecovery.d.ts +26 -0
- package/lib/dist/services/traces/browserRecovery.d.ts.map +1 -0
- package/lib/dist/services/traces/browserRecovery.js +81 -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 +251 -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 +387 -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 +84 -0
- package/lib/dist/services/traces/tracePoller.d.ts.map +1 -0
- package/lib/dist/services/traces/tracePoller.js +309 -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 +1175 -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 +64 -13
- package/server/dist/app.js +32651 -17637
- package/server/dist/index.js +29875 -14638
- package/tsconfig.lib.json +71 -0
- package/dist/assets/index-EvPLSTAS.js +0 -267
- package/dist/assets/index-RXasQKUs.css +0 -1
- package/lib/dist/config/index.js +0 -404
- package/lib/dist/index.js +0 -1665
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { recordVerdict } from '../matchers/session.js';
|
|
6
|
+
import { readEnv } from '../envCompat.js';
|
|
7
|
+
import { getBackendUrl, isBackendPortExplicit, DEFAULT_BACKEND_PORT } from '../portConfig.js';
|
|
8
|
+
// Warn at most once per process when judge() falls back to the default
|
|
9
|
+
// backend port. Defaulting to 4001 is dangerous when a *foreign* agent-health
|
|
10
|
+
// server (a live demo, another checkout) is listening there — the judge call
|
|
11
|
+
// would hit it instead of the run's own server. We warn rather than throw so
|
|
12
|
+
// existing zero-config local usage (server actually on 4001) keeps working.
|
|
13
|
+
let warnedDefaultJudgePort = false;
|
|
14
|
+
function resolveJudgeServerUrl(explicit) {
|
|
15
|
+
if (explicit)
|
|
16
|
+
return explicit;
|
|
17
|
+
if (!isBackendPortExplicit() && !warnedDefaultJudgePort) {
|
|
18
|
+
warnedDefaultJudgePort = true;
|
|
19
|
+
// eslint-disable-next-line no-console
|
|
20
|
+
console.warn(`[agent-health] judge(): AH_PORT is not set and no options.serverUrl was ` +
|
|
21
|
+
`provided — defaulting to http://localhost:${DEFAULT_BACKEND_PORT}. If a ` +
|
|
22
|
+
`different agent-health server is on that port, judging will hit it. Set ` +
|
|
23
|
+
`AH_PORT or pass options.serverUrl to target the right server.`);
|
|
24
|
+
}
|
|
25
|
+
return getBackendUrl();
|
|
26
|
+
}
|
|
27
|
+
/** Test-only: reset the warn-once latch so unit tests can assert it fires. */
|
|
28
|
+
export function __resetJudgePortWarning() {
|
|
29
|
+
warnedDefaultJudgePort = false;
|
|
30
|
+
}
|
|
31
|
+
const verdictCache = new Map();
|
|
32
|
+
/** Clear the in-process judge verdict cache (test isolation / new run). */
|
|
33
|
+
export function clearJudgeCache() {
|
|
34
|
+
verdictCache.clear();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Stable, collision-resistant cache key over the judging inputs. Uses
|
|
38
|
+
* `sha256` when Node's crypto is available, falling back to a fast JS hash
|
|
39
|
+
* so the SDK stays bundler-safe.
|
|
40
|
+
*/
|
|
41
|
+
function judgeCacheKey(input) {
|
|
42
|
+
const canonical = JSON.stringify({
|
|
43
|
+
evaluatorId: input.evaluatorId ?? '',
|
|
44
|
+
model: input.model ?? '',
|
|
45
|
+
claims: input.claims,
|
|
46
|
+
trajectory: input.trajectory,
|
|
47
|
+
});
|
|
48
|
+
try {
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
50
|
+
const { createHash } = require('crypto');
|
|
51
|
+
return createHash('sha256').update(canonical).digest('hex');
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// FNV-1a fallback — non-cryptographic but fine for cache addressing.
|
|
55
|
+
let h = 0x811c9dc5;
|
|
56
|
+
for (let i = 0; i < canonical.length; i++) {
|
|
57
|
+
h ^= canonical.charCodeAt(i);
|
|
58
|
+
h = Math.imul(h, 0x01000193);
|
|
59
|
+
}
|
|
60
|
+
return (h >>> 0).toString(16);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Whether judging is globally skipped via env (CLI `--no-judge`). */
|
|
64
|
+
function judgeSkippedByEnv() {
|
|
65
|
+
const v = readEnv('AH_SKIP_JUDGE', 'AGENT_HEALTH_SKIP_JUDGE');
|
|
66
|
+
return v === '1' || v === 'true' || v === 'yes';
|
|
67
|
+
}
|
|
68
|
+
let judgeCalledInCurrentEval = false;
|
|
69
|
+
export function wasJudgeCalled() {
|
|
70
|
+
return judgeCalledInCurrentEval;
|
|
71
|
+
}
|
|
72
|
+
export function resetJudgeFlag() {
|
|
73
|
+
judgeCalledInCurrentEval = false;
|
|
74
|
+
}
|
|
75
|
+
function isTrajectory(x) {
|
|
76
|
+
return Array.isArray(x);
|
|
77
|
+
}
|
|
78
|
+
function isResultLike(x) {
|
|
79
|
+
return typeof x === 'object' && x !== null && 'trajectory' in x;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Build a {@link Verdict} object with the `orThrow()` escape hatch attached.
|
|
83
|
+
*/
|
|
84
|
+
function makeVerdict(v) {
|
|
85
|
+
const verdict = {
|
|
86
|
+
...v,
|
|
87
|
+
pass: v.passFailStatus === 'passed',
|
|
88
|
+
score: v.score ?? (typeof v.accuracy === 'number' ? v.accuracy / 100 : 0),
|
|
89
|
+
orThrow() {
|
|
90
|
+
// Passing or skipped verdicts never throw. Failed/errored ones do.
|
|
91
|
+
if (this.pass || this.skipped)
|
|
92
|
+
return this;
|
|
93
|
+
const label = this.errored ? 'errored' : 'FAILED';
|
|
94
|
+
throw new Error(`LLM Judge: ${label} (accuracy: ${this.accuracy})\n${this.errorMessage ?? this.reasoning}`);
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
return verdict;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Core judge implementation. Records exactly one MatcherResult (carrying
|
|
101
|
+
* `role`) and returns a non-throwing {@link Verdict}.
|
|
102
|
+
*/
|
|
103
|
+
async function runJudge(resultOrTrajectory, claimOrClaims, options, role) {
|
|
104
|
+
judgeCalledInCurrentEval = true;
|
|
105
|
+
const trajectory = isTrajectory(resultOrTrajectory)
|
|
106
|
+
? resultOrTrajectory
|
|
107
|
+
: (isResultLike(resultOrTrajectory) ? resultOrTrajectory.trajectory ?? [] : []);
|
|
108
|
+
// Agent run id for trace/log correlation — lets the agentic trace judge
|
|
109
|
+
// scope its read-only tools to this single run. Only present when the
|
|
110
|
+
// caller passed a RunResult (not a bare trajectory array).
|
|
111
|
+
const runId = !isTrajectory(resultOrTrajectory) && isResultLike(resultOrTrajectory)
|
|
112
|
+
? resultOrTrajectory.runId
|
|
113
|
+
: undefined;
|
|
114
|
+
// Strategy-C trace-correlation hints the runner attached to the result
|
|
115
|
+
// (service-name + window). Forwarding them as `agents` lets the agent
|
|
116
|
+
// (trace) judge find this run's spans in OpenSearch the same way the
|
|
117
|
+
// classic `waitForTracesAndJudge` path does (#264) — without them the SDK
|
|
118
|
+
// judge sends only `runId` and misses subprocess agents' spans. This is
|
|
119
|
+
// the SDK↔UI convergence fix.
|
|
120
|
+
const judgeAgents = !isTrajectory(resultOrTrajectory) && isResultLike(resultOrTrajectory)
|
|
121
|
+
? resultOrTrajectory.judgeAgents
|
|
122
|
+
: undefined;
|
|
123
|
+
const claims = Array.isArray(claimOrClaims) ? claimOrClaims : [claimOrClaims];
|
|
124
|
+
const serverUrl = resolveJudgeServerUrl(options?.serverUrl);
|
|
125
|
+
const description = claims.length === 1 ? `judge: ${claims[0]}` : `judge: ${claims.length} claims`;
|
|
126
|
+
// Body shape matches the UI's /api/judge POST exactly: trajectory,
|
|
127
|
+
// expectedOutcomes, expectedTrajectory, optional modelId, optional
|
|
128
|
+
// evaluatorId. The server applies the same evaluator-resolution and
|
|
129
|
+
// provider-routing logic regardless of caller, so SDK and UI runs
|
|
130
|
+
// produce comparable verdicts.
|
|
131
|
+
const requestBody = {
|
|
132
|
+
trajectory,
|
|
133
|
+
expectedOutcomes: claims,
|
|
134
|
+
expectedTrajectory: [],
|
|
135
|
+
};
|
|
136
|
+
if (options?.model)
|
|
137
|
+
requestBody.modelId = options.model;
|
|
138
|
+
if (options?.evaluatorId)
|
|
139
|
+
requestBody.evaluatorId = options.evaluatorId;
|
|
140
|
+
if (runId)
|
|
141
|
+
requestBody.runId = runId;
|
|
142
|
+
if (Array.isArray(judgeAgents) && judgeAgents.length > 0)
|
|
143
|
+
requestBody.agents = judgeAgents;
|
|
144
|
+
// Record the success path identically whether the verdict came fresh from
|
|
145
|
+
// the endpoint or from the in-process cache.
|
|
146
|
+
const finalize = (raw, durationMs) => {
|
|
147
|
+
const accuracy = raw.metrics?.accuracy ?? 0;
|
|
148
|
+
const verdict = makeVerdict({
|
|
149
|
+
passFailStatus: raw.passFailStatus ?? 'failed',
|
|
150
|
+
accuracy,
|
|
151
|
+
reasoning: raw.llmJudgeReasoning ?? '',
|
|
152
|
+
role,
|
|
153
|
+
skipped: false,
|
|
154
|
+
errored: false,
|
|
155
|
+
});
|
|
156
|
+
recordVerdict({
|
|
157
|
+
description,
|
|
158
|
+
pass: verdict.pass,
|
|
159
|
+
method: 'llm-judge',
|
|
160
|
+
role,
|
|
161
|
+
durationMs,
|
|
162
|
+
score: verdict.score,
|
|
163
|
+
reasoning: verdict.reasoning,
|
|
164
|
+
model: options?.model,
|
|
165
|
+
errorMessage: verdict.passFailStatus === 'failed' ? verdict.reasoning : undefined,
|
|
166
|
+
// Preserve the rest of the judge payload — these were silently
|
|
167
|
+
// dropped before, which made SDK `judge()` calls strictly less
|
|
168
|
+
// informative than the legacy auto-judge path. See MatcherResult.
|
|
169
|
+
...(Array.isArray(raw.improvementStrategies) && raw.improvementStrategies.length > 0
|
|
170
|
+
? { improvementStrategies: raw.improvementStrategies }
|
|
171
|
+
: {}),
|
|
172
|
+
...(raw.metrics && typeof raw.metrics === 'object'
|
|
173
|
+
? { judgeMetrics: { ...raw.metrics } }
|
|
174
|
+
: {}),
|
|
175
|
+
});
|
|
176
|
+
return verdict;
|
|
177
|
+
};
|
|
178
|
+
// SKIP: no LLM call. `skip` is tri-state and takes precedence over the env:
|
|
179
|
+
// skip === true → always skip
|
|
180
|
+
// skip === false → never skip (force the judge to run, even if AH_SKIP_JUDGE is set)
|
|
181
|
+
// skip undefined → defer to AH_SKIP_JUDGE
|
|
182
|
+
// This makes a per-call/bound `skip: false` a meaningful override rather than
|
|
183
|
+
// having the env unconditionally win.
|
|
184
|
+
const shouldSkip = options?.skip === true || (options?.skip !== false && judgeSkippedByEnv());
|
|
185
|
+
if (shouldSkip) {
|
|
186
|
+
recordVerdict({
|
|
187
|
+
description: `${description} (skipped)`,
|
|
188
|
+
pass: true,
|
|
189
|
+
method: 'llm-judge',
|
|
190
|
+
role: 'observe',
|
|
191
|
+
durationMs: 0,
|
|
192
|
+
reasoning: 'Judge skipped (AH_SKIP_JUDGE / skip option).',
|
|
193
|
+
});
|
|
194
|
+
return makeVerdict({
|
|
195
|
+
passFailStatus: 'passed',
|
|
196
|
+
accuracy: 0,
|
|
197
|
+
reasoning: 'Judge skipped.',
|
|
198
|
+
role,
|
|
199
|
+
skipped: true,
|
|
200
|
+
errored: false,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// CACHE: identical (evaluator, model, claims, trajectory) → reuse verdict.
|
|
204
|
+
const cacheKey = judgeCacheKey({
|
|
205
|
+
evaluatorId: options?.evaluatorId,
|
|
206
|
+
model: options?.model,
|
|
207
|
+
claims,
|
|
208
|
+
trajectory,
|
|
209
|
+
});
|
|
210
|
+
const cached = verdictCache.get(cacheKey);
|
|
211
|
+
if (cached) {
|
|
212
|
+
return finalize(cached, 0);
|
|
213
|
+
}
|
|
214
|
+
const startedAt = Date.now();
|
|
215
|
+
// Resilience: the agentic (trace) judge can be slow and, under load (in-process
|
|
216
|
+
// pi sessions + query_spans/query_logs round-trips on the same server), the
|
|
217
|
+
// loopback fetch to /api/judge can transiently throw "fetch failed" (undici
|
|
218
|
+
// keep-alive socket reset / ~300s headersTimeout) or return a 5xx/429. Without
|
|
219
|
+
// a retry, ONE such transient blip records an `errored` matcher — which makes
|
|
220
|
+
// the runner clear `passFailStatus` to null and bucket the whole run as
|
|
221
|
+
// "errored" (#247) even when every other gate passed. Retry transient failures
|
|
222
|
+
// with exponential backoff before giving up. Deterministic 4xx (not 429) are
|
|
223
|
+
// not retried.
|
|
224
|
+
const MAX_JUDGE_ATTEMPTS = 3;
|
|
225
|
+
let response;
|
|
226
|
+
let lastErrMsg = '';
|
|
227
|
+
for (let attempt = 1; attempt <= MAX_JUDGE_ATTEMPTS; attempt++) {
|
|
228
|
+
try {
|
|
229
|
+
const r = await fetch(`${serverUrl}/api/judge`, {
|
|
230
|
+
method: 'POST',
|
|
231
|
+
headers: { 'Content-Type': 'application/json' },
|
|
232
|
+
body: JSON.stringify(requestBody),
|
|
233
|
+
});
|
|
234
|
+
if (r.ok) {
|
|
235
|
+
response = r;
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
lastErrMsg = `Judge HTTP ${r.status}: ${await r.text()}`;
|
|
239
|
+
// 4xx (except 429) are deterministic — retrying won't help; surface as errored.
|
|
240
|
+
if (r.status < 500 && r.status !== 429) {
|
|
241
|
+
response = r;
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
lastErrMsg = err?.message || String(err); // e.g. "fetch failed"
|
|
247
|
+
}
|
|
248
|
+
if (attempt < MAX_JUDGE_ATTEMPTS) {
|
|
249
|
+
// Exponential backoff (1s, 2s). Overridable via AH_JUDGE_RETRY_BACKOFF_MS
|
|
250
|
+
// (set to 0 in tests to avoid real delays); 0 disables the wait.
|
|
251
|
+
const baseMs = process.env.AH_JUDGE_RETRY_BACKOFF_MS !== undefined
|
|
252
|
+
? Number(process.env.AH_JUDGE_RETRY_BACKOFF_MS)
|
|
253
|
+
: 1000;
|
|
254
|
+
if (baseMs > 0)
|
|
255
|
+
await new Promise((res) => setTimeout(res, baseMs * 2 ** (attempt - 1)));
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (!response) {
|
|
259
|
+
// Every attempt failed transiently — the judge could not run. `errored`,
|
|
260
|
+
// not a clean `pass: false`.
|
|
261
|
+
recordVerdict({
|
|
262
|
+
description,
|
|
263
|
+
pass: false,
|
|
264
|
+
method: 'llm-judge',
|
|
265
|
+
role,
|
|
266
|
+
errored: true,
|
|
267
|
+
durationMs: Date.now() - startedAt,
|
|
268
|
+
errorMessage: `Judge request failed after ${MAX_JUDGE_ATTEMPTS} attempts: ${lastErrMsg}`,
|
|
269
|
+
reasoning: '',
|
|
270
|
+
});
|
|
271
|
+
return makeVerdict({
|
|
272
|
+
passFailStatus: 'failed',
|
|
273
|
+
accuracy: 0,
|
|
274
|
+
reasoning: '',
|
|
275
|
+
role,
|
|
276
|
+
skipped: false,
|
|
277
|
+
errored: true,
|
|
278
|
+
errorMessage: `Judge request failed after ${MAX_JUDGE_ATTEMPTS} attempts: ${lastErrMsg}`,
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
if (!response.ok) {
|
|
282
|
+
recordVerdict({
|
|
283
|
+
description,
|
|
284
|
+
pass: false,
|
|
285
|
+
method: 'llm-judge',
|
|
286
|
+
role,
|
|
287
|
+
errored: true,
|
|
288
|
+
durationMs: Date.now() - startedAt,
|
|
289
|
+
errorMessage: lastErrMsg,
|
|
290
|
+
reasoning: '',
|
|
291
|
+
});
|
|
292
|
+
return makeVerdict({
|
|
293
|
+
passFailStatus: 'failed',
|
|
294
|
+
accuracy: 0,
|
|
295
|
+
reasoning: '',
|
|
296
|
+
role,
|
|
297
|
+
skipped: false,
|
|
298
|
+
errored: true,
|
|
299
|
+
errorMessage: lastErrMsg,
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
const raw = (await response.json());
|
|
303
|
+
// Only successful, non-errored verdicts are cached.
|
|
304
|
+
verdictCache.set(cacheKey, raw);
|
|
305
|
+
return finalize(raw, Date.now() - startedAt);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Single-claim ergonomic form (gate role).
|
|
309
|
+
* @example
|
|
310
|
+
* const v = await judge(result, 'identifies the failing dependency');
|
|
311
|
+
* if (!v.pass) { ... } // non-throwing
|
|
312
|
+
* (await judge(result, claim)).orThrow(); // explicit hard-stop
|
|
313
|
+
* await judge.observe(result, claim); // score-only, never gates
|
|
314
|
+
*/
|
|
315
|
+
export const judge = Object.assign((resultOrTrajectory, claimOrClaims, options) => runJudge(resultOrTrajectory, claimOrClaims, options, 'gate'), {
|
|
316
|
+
observe: (resultOrTrajectory, claimOrClaims, options) => runJudge(resultOrTrajectory, claimOrClaims, options, 'observe'),
|
|
317
|
+
});
|
|
318
|
+
/**
|
|
319
|
+
* Bind run-level defaults to `judge` and return a callable with the same
|
|
320
|
+
* signature. Used by the SDK runner to inject `run.evaluatorId` (and
|
|
321
|
+
* optionally a default judge model) into the `TestFixtures.judge` slot,
|
|
322
|
+
* so test bodies that destructure `({ judge })` automatically inherit
|
|
323
|
+
* the run's evaluator selection — matching the UI's behaviour where the
|
|
324
|
+
* evaluator picked on the run config applies to every judged test case.
|
|
325
|
+
*
|
|
326
|
+
* Per-call options always win over the bound defaults; pass an empty
|
|
327
|
+
* object (or omit the field) to fall through to the bound value.
|
|
328
|
+
*
|
|
329
|
+
* const boundJudge = bindJudge({ evaluatorId: run.evaluatorId });
|
|
330
|
+
* await boundJudge(result, claim); // uses run.evaluatorId
|
|
331
|
+
* await boundJudge(result, claim, { evaluatorId: 'other' }); // overrides
|
|
332
|
+
* await boundJudge(result, claim, { evaluatorId: undefined }); // still uses bound default
|
|
333
|
+
*/
|
|
334
|
+
export function bindJudge(defaults) {
|
|
335
|
+
// No defaults set → return the unbound function unchanged. Keeps zero
|
|
336
|
+
// overhead for tests that don't use a run-level evaluator. Note `skip` is
|
|
337
|
+
// compared against `undefined` (not falsiness) so a binding of
|
|
338
|
+
// `{ skip: false }` — a meaningful "force the judge to run" — is preserved
|
|
339
|
+
// rather than short-circuited to the unbound judge.
|
|
340
|
+
if (!defaults ||
|
|
341
|
+
(!defaults.evaluatorId && !defaults.model && !defaults.serverUrl && defaults.skip === undefined)) {
|
|
342
|
+
return judge;
|
|
343
|
+
}
|
|
344
|
+
const mergeOptions = (options) => ({
|
|
345
|
+
// Per-call options win on every field that's actually set. We treat
|
|
346
|
+
// an explicit `undefined` the same as a missing field — callers who
|
|
347
|
+
// want to *clear* a bound default should pass an empty string or
|
|
348
|
+
// call the unbound `judge` directly.
|
|
349
|
+
serverUrl: options?.serverUrl ?? defaults.serverUrl,
|
|
350
|
+
model: options?.model ?? defaults.model,
|
|
351
|
+
evaluatorId: options?.evaluatorId ?? defaults.evaluatorId,
|
|
352
|
+
skip: options?.skip ?? defaults.skip,
|
|
353
|
+
});
|
|
354
|
+
const bound = Object.assign((resultOrTrajectory, claimOrClaims, options) => runJudge(resultOrTrajectory, claimOrClaims, mergeOptions(options), 'gate'), {
|
|
355
|
+
observe: (resultOrTrajectory, claimOrClaims, options) => runJudge(resultOrTrajectory, claimOrClaims, mergeOptions(options), 'observe'),
|
|
356
|
+
});
|
|
357
|
+
return bound;
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=judge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"judge.js","sourceRoot":"","sources":["../../../testCases/judge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { CodeTestCase, RegisteredHook } from './types.js';
|
|
2
|
+
export declare function isCodeFile(filename: string): boolean;
|
|
3
|
+
export declare function computeTestCaseHash(tc: CodeTestCase): string;
|
|
4
|
+
export interface LoadedTestCase extends CodeTestCase {
|
|
5
|
+
hash: string;
|
|
6
|
+
}
|
|
7
|
+
export interface LoadResult {
|
|
8
|
+
testCases: LoadedTestCase[];
|
|
9
|
+
filePath: string;
|
|
10
|
+
/**
|
|
11
|
+
* Benchmark groups derived from `describe()` blocks in the file.
|
|
12
|
+
* Maps benchmark name (the joined describe path, e.g. 'RCA Suite' or
|
|
13
|
+
* 'A > B' for nested) to the test case names within. Tests outside any
|
|
14
|
+
* `describe()` are not in this map; they go to the file-default benchmark
|
|
15
|
+
* (CLI / server names it after the filename).
|
|
16
|
+
*/
|
|
17
|
+
benchmarks: Map<string, string[]>;
|
|
18
|
+
/**
|
|
19
|
+
* All lifecycle hooks (`beforeEach`/`afterEach`/`beforeAll`/`afterAll`)
|
|
20
|
+
* registered while loading this file. Empty when the file declares none.
|
|
21
|
+
* The orchestrator filters by `(sourceFile, describePath)` at run time.
|
|
22
|
+
*/
|
|
23
|
+
hooks: RegisteredHook[];
|
|
24
|
+
}
|
|
25
|
+
export declare function loadTestCasesFromModule(filePath: string): Promise<LoadResult>;
|
|
26
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../testCases/loader.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAW/D,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGpD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CAgB5D;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC;;;;OAIG;IACH,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAkInF"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright OpenSearch Contributors
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { createHash } from 'crypto';
|
|
6
|
+
import { readFileSync } from 'fs';
|
|
7
|
+
import { resolve, dirname } from 'path';
|
|
8
|
+
import { pathToFileURL } from 'url';
|
|
9
|
+
import { createRequire, Module as NodeModule } from 'module';
|
|
10
|
+
import { setActiveFile, getRegisteredTests, getRegisteredHooks, clearRegistry, } from './define.js';
|
|
11
|
+
import { getAuthoringSurface } from './authoringSurface.js';
|
|
12
|
+
const CODE_EXTENSIONS = ['.ts', '.js', '.mjs'];
|
|
13
|
+
export function isCodeFile(filename) {
|
|
14
|
+
const lower = filename.toLowerCase();
|
|
15
|
+
return CODE_EXTENSIONS.some(ext => lower.endsWith(ext));
|
|
16
|
+
}
|
|
17
|
+
export function computeTestCaseHash(tc) {
|
|
18
|
+
const content = JSON.stringify({
|
|
19
|
+
name: tc.name,
|
|
20
|
+
prompt: tc.options.prompt,
|
|
21
|
+
context: tc.options.context,
|
|
22
|
+
labels: tc.options.labels,
|
|
23
|
+
description: tc.options.description,
|
|
24
|
+
// Include the new expected* fields so editing them invalidates the
|
|
25
|
+
// sourceHash and the upsert path picks up the change. Without this,
|
|
26
|
+
// a user adding `expectedOutcomes: [...]` to an existing test would
|
|
27
|
+
// see the test case stay on its old version and the new outcomes
|
|
28
|
+
// would never reach storage.
|
|
29
|
+
expectedOutcomes: tc.options.expectedOutcomes,
|
|
30
|
+
expectedTrajectory: tc.options.expectedTrajectory,
|
|
31
|
+
});
|
|
32
|
+
return createHash('sha256').update(content).digest('hex');
|
|
33
|
+
}
|
|
34
|
+
export async function loadTestCasesFromModule(filePath) {
|
|
35
|
+
const absPath = resolve(filePath);
|
|
36
|
+
// Clear any prior registration for this file and set it as active
|
|
37
|
+
clearRegistry(absPath);
|
|
38
|
+
setActiveFile(absPath);
|
|
39
|
+
let module;
|
|
40
|
+
if (absPath.endsWith('.js')) {
|
|
41
|
+
// For CJS .js files, execute in a fresh context with our test() function
|
|
42
|
+
// injected. This avoids module caching issues across multiple loads.
|
|
43
|
+
const code = readFileSync(absPath, 'utf-8');
|
|
44
|
+
const fileDir = dirname(absPath);
|
|
45
|
+
// NOTE: do not call require('module') here — this file is bundled as ESM
|
|
46
|
+
// by esbuild for the server, and Dynamic require of built-ins is unsupported
|
|
47
|
+
// in ESM output. Use the statically-imported NodeModule instead.
|
|
48
|
+
const Module = NodeModule;
|
|
49
|
+
const m = new Module(absPath);
|
|
50
|
+
m.filename = absPath;
|
|
51
|
+
m.paths = Module._nodeModulePaths(fileDir);
|
|
52
|
+
// Provide a require function scoped to the file's directory, but override
|
|
53
|
+
// any require of the define module to return our own instance
|
|
54
|
+
const fileRequire = createRequire(absPath);
|
|
55
|
+
// Match if `id` looks like our own define module before doing any
|
|
56
|
+
// filesystem resolution. Required because:
|
|
57
|
+
// 1) the loader is bundled as ESM by esbuild, so synthetic CJS
|
|
58
|
+
// `require.resolve` is unavailable here, and
|
|
59
|
+
// 2) `lib/testCases/define.ts` is not compiled to a .js sibling, so
|
|
60
|
+
// `fileRequire.resolve('../../lib/testCases/define')` from a
|
|
61
|
+
// fixture would throw MODULE_NOT_FOUND.
|
|
62
|
+
const isDefineId = (id) => {
|
|
63
|
+
const normalized = id.replace(/\\/g, '/').replace(/\.js$/, '');
|
|
64
|
+
return (normalized === 'lib/testCases/define' ||
|
|
65
|
+
normalized.endsWith('/lib/testCases/define'));
|
|
66
|
+
};
|
|
67
|
+
// Intercept the published package name as well — fixtures generally
|
|
68
|
+
// do `require('@opensearch-project/agent-health')` and Node's resolver
|
|
69
|
+
// would otherwise hit the package's exports map (which only exposes
|
|
70
|
+
// 'import' for ESM consumers).
|
|
71
|
+
const isPackageName = (id) => id === '@opensearch-project/agent-health' ||
|
|
72
|
+
id === '@opensearch/agent-health' ||
|
|
73
|
+
id === 'agent-health';
|
|
74
|
+
// The object handed back when a CJS eval file requires the SDK. Single
|
|
75
|
+
// source of truth shared with the package exports (see authoringSurface)
|
|
76
|
+
// so `.js` and `.ts`/`.mjs` files see the SAME surface — no drift (#232).
|
|
77
|
+
const sdkExports = getAuthoringSurface();
|
|
78
|
+
const wrappedRequire = (id) => {
|
|
79
|
+
if (isDefineId(id) || isPackageName(id)) {
|
|
80
|
+
return sdkExports;
|
|
81
|
+
}
|
|
82
|
+
// Fall back to a resolution-based check so that fixtures requiring the
|
|
83
|
+
// SDK by absolute path or via the published package name still hand back
|
|
84
|
+
// our test() registrar (and therefore land in our file-scoped registry).
|
|
85
|
+
try {
|
|
86
|
+
const resolved = fileRequire.resolve(id);
|
|
87
|
+
const normalized = resolved.replace(/\\/g, '/');
|
|
88
|
+
if (normalized.endsWith('/lib/testCases/define.js') ||
|
|
89
|
+
normalized.endsWith('/lib/testCases/define')) {
|
|
90
|
+
return sdkExports;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// ignore unresolvable IDs — fileRequire below will surface the error
|
|
95
|
+
}
|
|
96
|
+
return fileRequire(id);
|
|
97
|
+
};
|
|
98
|
+
wrappedRequire.resolve = fileRequire.resolve;
|
|
99
|
+
const wrapper = `(function(exports, require, module, __filename, __dirname) { ${code}\n});`;
|
|
100
|
+
const compiledFn = eval(wrapper);
|
|
101
|
+
compiledFn(m.exports, wrappedRequire, m, absPath, fileDir);
|
|
102
|
+
module = m.exports;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// For .ts and .mjs files, use dynamic import
|
|
106
|
+
try {
|
|
107
|
+
const fileUrl = pathToFileURL(absPath).href;
|
|
108
|
+
module = await import(fileUrl);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
if (err.code === 'ERR_UNKNOWN_FILE_EXTENSION' && absPath.endsWith('.ts')) {
|
|
112
|
+
throw new Error(`Cannot import TypeScript file: ${filePath}\n` +
|
|
113
|
+
'Install tsx as a dependency: npm install tsx\n' +
|
|
114
|
+
'Or pre-compile .eval.ts to .eval.js before running.');
|
|
115
|
+
}
|
|
116
|
+
throw new Error(`Failed to import module: ${filePath}\n${err.message}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Tests come exclusively from test() / describe() registration calls
|
|
120
|
+
// (Playwright-style). Legacy default-export array form was removed when
|
|
121
|
+
// we dropped defineTestCases() — the SDK is experimental and the API
|
|
122
|
+
// shape is intentionally narrow.
|
|
123
|
+
const testCases = getRegisteredTests(absPath);
|
|
124
|
+
if (testCases.length === 0) {
|
|
125
|
+
throw new Error(`Module ${filePath} has no test cases. Register tests with test(name, options?, body) inside the file.`);
|
|
126
|
+
}
|
|
127
|
+
// Compute per-test-case hash
|
|
128
|
+
const loaded = testCases.map(tc => ({
|
|
129
|
+
...tc,
|
|
130
|
+
hash: computeTestCaseHash(tc),
|
|
131
|
+
}));
|
|
132
|
+
// Derive describe-group → test names mapping. Tests outside any
|
|
133
|
+
// describe() have benchmarkPath=undefined and are excluded; the CLI/
|
|
134
|
+
// server adds them to the file-default benchmark separately.
|
|
135
|
+
const benchmarks = new Map();
|
|
136
|
+
for (const tc of loaded) {
|
|
137
|
+
if (tc.benchmarkPath) {
|
|
138
|
+
const list = benchmarks.get(tc.benchmarkPath) ?? [];
|
|
139
|
+
list.push(tc.name);
|
|
140
|
+
benchmarks.set(tc.benchmarkPath, list);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Collect every hook the file registered. Empty when no
|
|
144
|
+
// beforeEach/afterEach/beforeAll/afterAll were called — the orchestrator
|
|
145
|
+
// is a no-op in that case so existing tests are unaffected.
|
|
146
|
+
const hooks = getRegisteredHooks(absPath);
|
|
147
|
+
return { testCases: loaded, filePath: absPath, benchmarks, hooks };
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../testCases/loader.ts"],"names":[],"mappings":"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"}
|