diff --git a/bun.lock b/bun.lock index a99d76eea..b254f4aa7 100644 --- a/bun.lock +++ b/bun.lock @@ -7,8 +7,8 @@ "dependencies": { "@aws-cdk/toolkit-lib": "1.38.2", "@aws-sdk/client-bedrock-agent": "^3.1092.0", - "@aws-sdk/client-bedrock-agentcore": "^3.1092.0", - "@aws-sdk/client-bedrock-agentcore-control": "^3.1102.0", + "@aws-sdk/client-bedrock-agentcore": "^3.1129.0", + "@aws-sdk/client-bedrock-agentcore-control": "^3.1129.0", "@aws-sdk/client-cloudformation": "^3.1092.0", "@aws-sdk/client-cloudwatch-logs": "^3.1092.0", "@aws-sdk/client-iam": "^3.1080.0", @@ -95,9 +95,9 @@ "@aws-sdk/client-bedrock-agent": ["@aws-sdk/client-bedrock-agent@3.1121.0", "", { "dependencies": { "@aws-sdk/core": "^3.977.9", "@aws-sdk/credential-provider-node": "^3.972.81", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-RAjn1g6X+u4WwnuwxYU8sKna5q1waTBCM+kzXWAvxSaNbgRsXFL6ZylPjOl0qCDZ7x6aVTj7Jb7Q0z6DZifP3w=="], - "@aws-sdk/client-bedrock-agentcore": ["@aws-sdk/client-bedrock-agentcore@3.1121.0", "", { "dependencies": { "@aws-sdk/core": "^3.977.9", "@aws-sdk/credential-provider-node": "^3.972.81", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-VxagAO73X0efH+5oQfOqWc2/q1wTkiZ1IkBg7L0GnPBo4NFYw37H8klNbbrTqoluMAzRiBwsHoGX2jfnjZlDOQ=="], + "@aws-sdk/client-bedrock-agentcore": ["@aws-sdk/client-bedrock-agentcore@3.1130.0", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/credential-provider-node": "^3.972.83", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-HgHR24kDJwRN9NNrtWNeuyrJZgl0nXOikeeD2HBAprsRXFl3tvZQw6hHOADHR41sjT4z3+SmqIqN5U7JiaF40Q=="], - "@aws-sdk/client-bedrock-agentcore-control": ["@aws-sdk/client-bedrock-agentcore-control@3.1121.0", "", { "dependencies": { "@aws-sdk/core": "^3.977.9", "@aws-sdk/credential-provider-node": "^3.972.81", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-zta1MHik3+WbRUVwRFyFWSGTEfhaMPDDG+qdzmLAAyK3m7gqYHJr6+p+6dvBeiO6U15FQ1PWSjj2C3O5ikiyAw=="], + "@aws-sdk/client-bedrock-agentcore-control": ["@aws-sdk/client-bedrock-agentcore-control@3.1130.0", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/credential-provider-node": "^3.972.83", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-EB3zB2zmxVsx+ZqusNjwBHhsqzWlkMLwyO7TIvc9tWHh02eV0lkmRT3HE4L6+DvZrE9R2x6KBl4OSkfU1TZvGA=="], "@aws-sdk/client-cloudcontrol": ["@aws-sdk/client-cloudcontrol@3.1121.0", "", { "dependencies": { "@aws-sdk/core": "^3.977.9", "@aws-sdk/credential-provider-node": "^3.972.81", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-kpR+c528XFWFT04APYPKrhSCyzdEJPgxryR0wWs2dfIj7Ovqwak+1zLwFOS8zpNqDPEx8xn7j3dqA/HTCo+qLw=="], @@ -1531,6 +1531,14 @@ "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], + "@aws-sdk/client-bedrock-agentcore/@aws-sdk/core": ["@aws-sdk/core@3.978.0", "", { "dependencies": { "@aws-sdk/types": "^3.974.5", "@aws-sdk/xml-builder": "^3.972.40", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.33.3", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.17.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-2yX9LUmxPklVjSGTb8dfnWRJSiFQ3TeH2nn7G1mdKHTfnabzF0+gfrS8rYfLWmZrQ8A3mEcxMJjRc51dL5KWaA=="], + + "@aws-sdk/client-bedrock-agentcore/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.83", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.71", "@aws-sdk/credential-provider-http": "^3.972.73", "@aws-sdk/credential-provider-ini": "^3.973.16", "@aws-sdk/credential-provider-process": "^3.972.71", "@aws-sdk/credential-provider-sso": "^3.973.15", "@aws-sdk/credential-provider-web-identity": "^3.972.77", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/credential-provider-imds": "^4.4.16", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-jdso7ejzfRnatxMUZK4S/U6KbaDPCvfIV4XL+IQAPFDBt5rj5Fq595euqlK8Le4lNCMFR9oUpt+1l0aMgaayOQ=="], + + "@aws-sdk/client-bedrock-agentcore-control/@aws-sdk/core": ["@aws-sdk/core@3.978.0", "", { "dependencies": { "@aws-sdk/types": "^3.974.5", "@aws-sdk/xml-builder": "^3.972.40", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.33.3", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.17.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-2yX9LUmxPklVjSGTb8dfnWRJSiFQ3TeH2nn7G1mdKHTfnabzF0+gfrS8rYfLWmZrQ8A3mEcxMJjRc51dL5KWaA=="], + + "@aws-sdk/client-bedrock-agentcore-control/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.83", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.71", "@aws-sdk/credential-provider-http": "^3.972.73", "@aws-sdk/credential-provider-ini": "^3.973.16", "@aws-sdk/credential-provider-process": "^3.972.71", "@aws-sdk/credential-provider-sso": "^3.973.15", "@aws-sdk/credential-provider-web-identity": "^3.972.77", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/credential-provider-imds": "^4.4.16", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-jdso7ejzfRnatxMUZK4S/U6KbaDPCvfIV4XL+IQAPFDBt5rj5Fq595euqlK8Le4lNCMFR9oUpt+1l0aMgaayOQ=="], + "@aws-sdk/protocol-http/@smithy/protocol-http": ["@smithy/protocol-http@1.2.0", "", { "dependencies": { "@smithy/types": "^1.2.0", "tslib": "^2.5.0" } }, "sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q=="], "@aws-sdk/signature-v4/@smithy/signature-v4": ["@smithy/signature-v4@1.1.0", "", { "dependencies": { "@smithy/eventstream-codec": "^1.1.0", "@smithy/is-array-buffer": "^1.1.0", "@smithy/types": "^1.2.0", "@smithy/util-hex-encoding": "^1.1.0", "@smithy/util-middleware": "^1.1.0", "@smithy/util-uri-escape": "^1.1.0", "@smithy/util-utf8": "^1.1.0", "tslib": "^2.5.0" } }, "sha512-fDo3m7YqXBs7neciOePPd/X9LPm5QLlDMdIC4m1H6dgNLnXfLMFNIxEfPyohGA8VW9Wn4X8lygnPSGxDZSmp0Q=="], @@ -1651,6 +1659,30 @@ "@aws-cdk/cx-api/@aws-cdk/cloud-assembly-schema/semver": ["semver@7.8.5", "", { "bundled": true, "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + "@aws-sdk/client-bedrock-agentcore-control/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.71", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-JN+JHruYZw3GUZB8YGAlDk4wTDPOEAEEdEzj5nS0xodWR4smzHsN7PnK2j6IeOsDIj2aqua5DSbhXl9Gtf90FQ=="], + + "@aws-sdk/client-bedrock-agentcore-control/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.73", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-uyYYnJOnlis8uQzaYGPd7N1JoioCoNpXgnkXYixsWJXHXgXyYi8WXJSDfofxJeWfQIGWLe2Nwyq60Uc7MZdVOg=="], + + "@aws-sdk/client-bedrock-agentcore-control/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.973.16", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/credential-provider-env": "^3.972.71", "@aws-sdk/credential-provider-http": "^3.972.73", "@aws-sdk/credential-provider-login": "^3.972.78", "@aws-sdk/credential-provider-process": "^3.972.71", "@aws-sdk/credential-provider-sso": "^3.973.15", "@aws-sdk/credential-provider-web-identity": "^3.972.77", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/credential-provider-imds": "^4.4.16", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-i++ly+0Uxa+u3ebSSyr0S/3CFhFJDxCXT3+Zj+mW2bXenEx5bKGCdTIKFu39SgXBNhWDjex/8cXUx9MUTMCrTw=="], + + "@aws-sdk/client-bedrock-agentcore-control/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.71", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-lYmXJa4gvq4xN1lrT5NiP5vIYYKcGWAdj8y+8o6dlcateB5eF3Dn8DtmjjHKfMBrTPAMr2pebIiX/UOj8c1/UA=="], + + "@aws-sdk/client-bedrock-agentcore-control/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.973.15", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/token-providers": "3.1129.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-6Jhcf4v0pSFdjk1EW2kvzuEBKD+UZ2uNcHUIglKKLndD20YhvkL2kdmDOV5/j4mYuWWwe/a1FQ1aomU86/Cg5Q=="], + + "@aws-sdk/client-bedrock-agentcore-control/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.77", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-uylIQSUWpfLuH2LovxEEfwzJGM/SabLOfLMg6YXu/E8jJEKUdpdILCVCQCdFvHyu/7dLJOHPMfrSwduxO56NkQ=="], + + "@aws-sdk/client-bedrock-agentcore/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.71", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-JN+JHruYZw3GUZB8YGAlDk4wTDPOEAEEdEzj5nS0xodWR4smzHsN7PnK2j6IeOsDIj2aqua5DSbhXl9Gtf90FQ=="], + + "@aws-sdk/client-bedrock-agentcore/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.73", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-uyYYnJOnlis8uQzaYGPd7N1JoioCoNpXgnkXYixsWJXHXgXyYi8WXJSDfofxJeWfQIGWLe2Nwyq60Uc7MZdVOg=="], + + "@aws-sdk/client-bedrock-agentcore/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.973.16", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/credential-provider-env": "^3.972.71", "@aws-sdk/credential-provider-http": "^3.972.73", "@aws-sdk/credential-provider-login": "^3.972.78", "@aws-sdk/credential-provider-process": "^3.972.71", "@aws-sdk/credential-provider-sso": "^3.973.15", "@aws-sdk/credential-provider-web-identity": "^3.972.77", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/credential-provider-imds": "^4.4.16", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-i++ly+0Uxa+u3ebSSyr0S/3CFhFJDxCXT3+Zj+mW2bXenEx5bKGCdTIKFu39SgXBNhWDjex/8cXUx9MUTMCrTw=="], + + "@aws-sdk/client-bedrock-agentcore/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.71", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-lYmXJa4gvq4xN1lrT5NiP5vIYYKcGWAdj8y+8o6dlcateB5eF3Dn8DtmjjHKfMBrTPAMr2pebIiX/UOj8c1/UA=="], + + "@aws-sdk/client-bedrock-agentcore/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.973.15", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/token-providers": "3.1129.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-6Jhcf4v0pSFdjk1EW2kvzuEBKD+UZ2uNcHUIglKKLndD20YhvkL2kdmDOV5/j4mYuWWwe/a1FQ1aomU86/Cg5Q=="], + + "@aws-sdk/client-bedrock-agentcore/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.77", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-uylIQSUWpfLuH2LovxEEfwzJGM/SabLOfLMg6YXu/E8jJEKUdpdILCVCQCdFvHyu/7dLJOHPMfrSwduxO56NkQ=="], + "@aws-sdk/protocol-http/@smithy/protocol-http/@smithy/types": ["@smithy/types@1.2.0", "", { "dependencies": { "tslib": "^2.5.0" } }, "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA=="], "@aws-sdk/signature-v4/@smithy/signature-v4/@smithy/types": ["@smithy/types@1.2.0", "", { "dependencies": { "tslib": "^2.5.0" } }, "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA=="], @@ -1691,6 +1723,26 @@ "@aws-cdk/cloudformation-diff/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "@aws-sdk/client-bedrock-agentcore-control/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.78", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-eUtswnXu0+Ii9ieRK+0L7aPFV3Z/dnW2VntJzjBP9xs8s+8p5nBNuymIXtXwZ+5r5+XJP3e32nMkuZ/r0HozEA=="], + + "@aws-sdk/client-bedrock-agentcore-control/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.45", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/signature-v4-multi-region": "^3.996.46", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-mooq9Q+jLa18VoM7HouczmslZU60iiB0aKc/Ztnq/luIL1ud0z4DnYprLR/ZO1gp331S9tJctM1HZr7u6YKBXQ=="], + + "@aws-sdk/client-bedrock-agentcore-control/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.45", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/signature-v4-multi-region": "^3.996.46", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-mooq9Q+jLa18VoM7HouczmslZU60iiB0aKc/Ztnq/luIL1ud0z4DnYprLR/ZO1gp331S9tJctM1HZr7u6YKBXQ=="], + + "@aws-sdk/client-bedrock-agentcore-control/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1129.0", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-Sbl3rpzQdsG4ZK2zh0JWUYyZPKKorJlVOddA2T0DVbKJFrsW8J6wgnslxxUH04+WaBMr4A1HzJZvZX0xUvkniA=="], + + "@aws-sdk/client-bedrock-agentcore-control/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.45", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/signature-v4-multi-region": "^3.996.46", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-mooq9Q+jLa18VoM7HouczmslZU60iiB0aKc/Ztnq/luIL1ud0z4DnYprLR/ZO1gp331S9tJctM1HZr7u6YKBXQ=="], + + "@aws-sdk/client-bedrock-agentcore/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.78", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-eUtswnXu0+Ii9ieRK+0L7aPFV3Z/dnW2VntJzjBP9xs8s+8p5nBNuymIXtXwZ+5r5+XJP3e32nMkuZ/r0HozEA=="], + + "@aws-sdk/client-bedrock-agentcore/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.45", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/signature-v4-multi-region": "^3.996.46", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-mooq9Q+jLa18VoM7HouczmslZU60iiB0aKc/Ztnq/luIL1ud0z4DnYprLR/ZO1gp331S9tJctM1HZr7u6YKBXQ=="], + + "@aws-sdk/client-bedrock-agentcore/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.45", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/signature-v4-multi-region": "^3.996.46", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-mooq9Q+jLa18VoM7HouczmslZU60iiB0aKc/Ztnq/luIL1ud0z4DnYprLR/ZO1gp331S9tJctM1HZr7u6YKBXQ=="], + + "@aws-sdk/client-bedrock-agentcore/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1129.0", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-Sbl3rpzQdsG4ZK2zh0JWUYyZPKKorJlVOddA2T0DVbKJFrsW8J6wgnslxxUH04+WaBMr4A1HzJZvZX0xUvkniA=="], + + "@aws-sdk/client-bedrock-agentcore/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.45", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/signature-v4-multi-region": "^3.996.46", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-mooq9Q+jLa18VoM7HouczmslZU60iiB0aKc/Ztnq/luIL1ud0z4DnYprLR/ZO1gp331S9tJctM1HZr7u6YKBXQ=="], + "@aws-sdk/signature-v4/@smithy/signature-v4/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@1.1.0", "", { "dependencies": { "@smithy/is-array-buffer": "^1.1.0", "tslib": "^2.5.0" } }, "sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw=="], "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], diff --git a/package.json b/package.json index 5ab4d027e..c2b2792cf 100644 --- a/package.json +++ b/package.json @@ -64,8 +64,8 @@ "dependencies": { "@aws-cdk/toolkit-lib": "1.38.2", "@aws-sdk/client-bedrock-agent": "^3.1092.0", - "@aws-sdk/client-bedrock-agentcore": "^3.1092.0", - "@aws-sdk/client-bedrock-agentcore-control": "^3.1102.0", + "@aws-sdk/client-bedrock-agentcore": "^3.1129.0", + "@aws-sdk/client-bedrock-agentcore-control": "^3.1129.0", "@aws-sdk/client-cloudformation": "^3.1092.0", "@aws-sdk/client-cloudwatch-logs": "^3.1092.0", "@aws-sdk/client-iam": "^3.1080.0", diff --git a/src/core/eval.tsx b/src/core/eval.tsx index bf9080d51..61bd76802 100644 --- a/src/core/eval.tsx +++ b/src/core/eval.tsx @@ -679,6 +679,7 @@ export class EvalClient implements CoreEvalClient { dataSourceConfig, evaluationMetadata: input.groundTruth ? { sessionMetadata: input.groundTruth } : undefined, kmsKeyArn: input.kmsKeyArn, + outputConfig: input.outputConfig, }), ); } diff --git a/src/handlers/eval/batch-evaluation/__fixtures__/StartBatchEvaluationCommand.2a1e0be72c84e19a.json b/src/handlers/eval/batch-evaluation/__fixtures__/StartBatchEvaluationCommand.2a1e0be72c84e19a.json new file mode 100644 index 000000000..868682e88 --- /dev/null +++ b/src/handlers/eval/batch-evaluation/__fixtures__/StartBatchEvaluationCommand.2a1e0be72c84e19a.json @@ -0,0 +1,21 @@ +{ + "batchEvaluationId": "golden_batch_evaluate_outputconfig1-936a801ab2", + "batchEvaluationArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:batch-evaluate/golden_batch_evaluate_outputconfig1-936a801ab2", + "batchEvaluationName": "golden_batch_evaluate_outputconfig1", + "status": "PENDING", + "createdAt": { + "$date": "2026-09-11T20:52:41.450Z" + }, + "evaluators": [ + { + "evaluatorId": "Builtin.Helpfulness" + } + ], + "outputConfig": { + "cloudWatchConfig": { + "logStreamName": "run-golden_batch_evaluate_outputconfig1-936a801ab2", + "metricsNamespace": "Company/AgentEvaluations", + "resultDestination": "SOURCE_LOG_GROUP" + } + } +} \ No newline at end of file diff --git a/src/handlers/eval/batch-evaluation/__fixtures__/StartBatchEvaluationCommand.374d4ae3a6654fca.json b/src/handlers/eval/batch-evaluation/__fixtures__/StartBatchEvaluationCommand.374d4ae3a6654fca.json new file mode 100644 index 000000000..b43a36679 --- /dev/null +++ b/src/handlers/eval/batch-evaluation/__fixtures__/StartBatchEvaluationCommand.374d4ae3a6654fca.json @@ -0,0 +1,21 @@ +{ + "batchEvaluationId": "golden_batch_simulate_endpoint1-120c119e26", + "batchEvaluationArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:batch-evaluate/golden_batch_simulate_endpoint1-120c119e26", + "batchEvaluationName": "golden_batch_simulate_endpoint1", + "status": "PENDING", + "createdAt": { + "$date": "2026-09-11T20:52:44.223Z" + }, + "evaluators": [ + { + "evaluatorId": "Builtin.Helpfulness" + } + ], + "outputConfig": { + "cloudWatchConfig": { + "logStreamName": "run-golden_batch_simulate_endpoint1-120c119e26", + "metricsNamespace": "Bedrock-AgentCore/Evaluations", + "resultDestination": "SOURCE_LOG_GROUP" + } + } +} \ No newline at end of file diff --git a/src/handlers/eval/batch-evaluation/__fixtures__/evaluate-output-config.golden.json b/src/handlers/eval/batch-evaluation/__fixtures__/evaluate-output-config.golden.json new file mode 100644 index 000000000..4ba4dad51 --- /dev/null +++ b/src/handlers/eval/batch-evaluation/__fixtures__/evaluate-output-config.golden.json @@ -0,0 +1,19 @@ +{ + "batchEvaluationId": "golden_batch_evaluate_outputconfig1-936a801ab2", + "batchEvaluationArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:batch-evaluate/golden_batch_evaluate_outputconfig1-936a801ab2", + "batchEvaluationName": "golden_batch_evaluate_outputconfig1", + "status": "PENDING", + "createdAt": "2026-09-11T20:52:41.450Z", + "evaluators": [ + { + "evaluatorId": "Builtin.Helpfulness" + } + ], + "outputConfig": { + "cloudWatchConfig": { + "logStreamName": "run-golden_batch_evaluate_outputconfig1-936a801ab2", + "metricsNamespace": "Company/AgentEvaluations", + "resultDestination": "SOURCE_LOG_GROUP" + } + } +} \ No newline at end of file diff --git a/src/handlers/eval/batch-evaluation/__fixtures__/simulate-endpoint-output-config.golden.json b/src/handlers/eval/batch-evaluation/__fixtures__/simulate-endpoint-output-config.golden.json new file mode 100644 index 000000000..fd419ac0d --- /dev/null +++ b/src/handlers/eval/batch-evaluation/__fixtures__/simulate-endpoint-output-config.golden.json @@ -0,0 +1,13 @@ +{ + "batchEvaluationId": "golden_batch_simulate_endpoint1-120c119e26", + "status": "PENDING", + "examplesInvoked": 1, + "examplesFailed": 0, + "sessions": [ + { + "exampleId": "e1", + "sessionId": "00000000-0000-4000-8000-000000000001" + } + ], + "failures": [] +} \ No newline at end of file diff --git a/src/handlers/eval/batch-evaluation/batch-evaluation.fixture.test.tsx b/src/handlers/eval/batch-evaluation/batch-evaluation.fixture.test.tsx index a690811e3..f9ce3f5c0 100644 --- a/src/handlers/eval/batch-evaluation/batch-evaluation.fixture.test.tsx +++ b/src/handlers/eval/batch-evaluation/batch-evaluation.fixture.test.tsx @@ -44,6 +44,8 @@ const FIXTURE_EVAL_AGENT = "asdf_MyAgent-3s5axvBC6Q"; const FIXTURE_EVAL_NAME = "golden_batch_evaluate_fixture685"; const FIXTURE_SIMULATE_NAME = "golden_batch_simulate_fixture1"; +const FIXTURE_OUTPUT_CONFIG_NAME = "golden_batch_evaluate_outputconfig1"; +const FIXTURE_SIMULATE_ENDPOINT_NAME = "golden_batch_simulate_endpoint1"; const FIXTURE_SIMULATE_DATASET = join(FIXTURES, "simulate-ds.jsonl"); function createFixtureCore(): CoreClient { @@ -185,4 +187,72 @@ describe("eval batch-evaluation (fixture-backed)", () => { matchGolden(FIXTURES, "simulate.golden.json", io.stdout()); }, 180_000); + + test("evaluate submits a job with a customer-supplied output config", async () => { + const stdout = await run([ + "eval", + "batch-evaluation", + "evaluate", + "--agent", + FIXTURE_EVAL_AGENT, + "--evaluators", + "Builtin.Helpfulness", + "--name", + FIXTURE_OUTPUT_CONFIG_NAME, + "--output-config", + '{"cloudWatchConfig":{"resultDestination":"SOURCE_LOG_GROUP","metricsNamespace":"Company/AgentEvaluations"}}', + "--json", + ]); + + matchGolden(FIXTURES, "evaluate-output-config.golden.json", stdout); + }); + + test("simulate passes --endpoint through and submits with an output config", async () => { + let n = 0; + const { createControlClient, createDataClient, createIamClient, createLogsClient } = + fixtureFactories(FIXTURES); + const core = new CoreClient({ + createControlClient, + createDataClient, + createIamClient, + createLogsClient, + logger: createSilentLogger(), + newSessionId: () => `00000000-0000-4000-8000-${String(++n).padStart(12, "0")}`, + }); + const io = testIO(); + const root = createRootHandler(core, { + io: io.io, + logger: createSilentLogger(), + globalConfigAccessor: new TestGlobalConfigAccessor(), + }); + + await root.route([ + "node", + "agentcore", + "eval", + "batch-evaluation", + "simulate", + "--runtime-id", + FIXTURE_EVAL_AGENT, + "--endpoint", + "DEFAULT", + "--payload-template", + '{"prompt":"{input}"}', + "--dataset", + FIXTURE_SIMULATE_DATASET, + "--evaluators", + "Builtin.Helpfulness", + "--name", + FIXTURE_SIMULATE_ENDPOINT_NAME, + "--output-config", + '{"cloudWatchConfig":{"resultDestination":"SOURCE_LOG_GROUP"}}', + "--ingestion-wait-ms", + "0", + "--json", + "--region", + REGION, + ]); + + matchGolden(FIXTURES, "simulate-endpoint-output-config.golden.json", io.stdout()); + }, 180_000); }); diff --git a/src/handlers/eval/batch-evaluation/batch-evaluation.test.tsx b/src/handlers/eval/batch-evaluation/batch-evaluation.test.tsx index 98d49f7b2..fb6ca3706 100644 --- a/src/handlers/eval/batch-evaluation/batch-evaluation.test.tsx +++ b/src/handlers/eval/batch-evaluation/batch-evaluation.test.tsx @@ -34,10 +34,14 @@ const RESULTS: BatchEvaluationResultEntry[] = [ { evaluatorId: "Builtin.Helpfulness", level: "Session", sessionId: "s1", score: 5 }, ]; -async function run(args: string[], configure?: (core: TestCoreClient) => void) { +async function run( + args: string[], + configure?: (core: TestCoreClient) => void, + ioOptions?: { stdin?: string }, +) { const core = new TestCoreClient(); configure?.(core); - const io = testIO(); + const io = testIO(ioOptions); const root = createRootHandler(core, { io: io.io, logger: createSilentLogger(), @@ -262,3 +266,97 @@ describe("eval batch-evaluation simulate", () => { expect(JSON.parse(stdout).failures).toEqual([{ exampleId: "bad", error: "HTTP 500" }]); }); }); + +describe("eval batch-evaluation evaluate --output-config", () => { + const BASE = [ + "eval", + "batch-evaluation", + "evaluate", + "--agent", + "r-1", + "--evaluators", + "Builtin.Helpfulness", + "--name", + "eval-1", + ]; + function startInput(core: TestCoreClient) { + const call = core.eval.calls.find((c) => c.method === "startBatchEvaluation"); + expect(call).toBeDefined(); + return call!.args[0] as { outputConfig?: unknown }; + } + + test("is left undefined when omitted, so the service keeps its default destination", async () => { + const { core } = await run(BASE); + expect(startInput(core).outputConfig).toBeUndefined(); + }); + + test("rejects malformed JSON before any SDK call", async () => { + const core = new TestCoreClient(); + const io = testIO(); + const root = createRootHandler(core, { + io: io.io, + logger: createSilentLogger(), + globalConfigAccessor: new TestGlobalConfigAccessor(), + }); + await expect( + root.route([ + "node", + "agentcore", + ...BASE, + "--output-config", + "{not json", + "--region", + "us-west-2", + ]), + ).rejects.toThrow(/Invalid JSON for option '--output-config'/); + expect(core.eval.calls).toEqual([]); + }); +}); + +describe("eval batch-evaluation simulate --endpoint and --output-config", () => { + const BASE = [ + "eval", + "batch-evaluation", + "simulate", + "--runtime-id", + "r-1", + "--payload-template", + '{"prompt":"{input}"}', + "--dataset", + "/tmp/ds.jsonl", + "--evaluators", + "Builtin.Helpfulness", + "--name", + "sim-1", + ]; + const invoked = (c: TestCoreClient) => + c.eval.setInvokeDatasetResponse({ + sessions: [{ exampleId: "e1", sessionId: "s1" }], + invoked: 1, + failed: 0, + failures: [], + }); + + test("malformed --output-config aborts before any Runtime is invoked", async () => { + const core = new TestCoreClient(); + invoked(core); + const io = testIO(); + const root = createRootHandler(core, { + io: io.io, + logger: createSilentLogger(), + globalConfigAccessor: new TestGlobalConfigAccessor(), + }); + await expect( + root.route([ + "node", + "agentcore", + ...BASE, + "--output-config", + "{not json", + "--region", + "us-west-2", + ]), + ).rejects.toThrow(/Invalid JSON for option '--output-config'/); + expect(core.eval.calls.map((c) => c.method)).not.toContain("invokeDataset"); + }); +}); diff --git a/src/handlers/eval/batch-evaluation/evaluate/index.tsx b/src/handlers/eval/batch-evaluation/evaluate/index.tsx index 8b95678ad..17e9d92f8 100644 --- a/src/handlers/eval/batch-evaluation/evaluate/index.tsx +++ b/src/handlers/eval/batch-evaluation/evaluate/index.tsx @@ -7,6 +7,7 @@ import type { Core } from "../../../types"; import type { SessionMetadataShape } from "@aws-sdk/client-bedrock-agentcore"; import { coreOptsFromCtx, parseJsonFlag } from "../../../utils"; import { SessionSource } from "../../sessionSource"; +import { BatchOutputConfig } from "../outputConfig"; const CONFIGURATION = "Configuration:"; const EVALUATION = "Evaluation:"; @@ -59,6 +60,7 @@ export const createEvaluateBatchEvaluationHandler = (core: Core, io: AppIO) => z.string().optional(), { group: EVALUATION, help: groundTruthHelp }, ), + ...BatchOutputConfig.flags, ], handle: async (ctx, flags) => { if (!flags["name"]) { @@ -78,6 +80,8 @@ export const createEvaluateBatchEvaluationHandler = (core: Core, io: AppIO) => await resolver.resolveText("ground-truth", flags["ground-truth"]), ); + const outputConfig = await BatchOutputConfig.resolve(flags["output-config"], io); + const response = await core.eval.startBatchEvaluation( { name: flags["name"], @@ -86,6 +90,7 @@ export const createEvaluateBatchEvaluationHandler = (core: Core, io: AppIO) => source, groundTruth, kmsKeyArn: flags["kms-key-arn"], + outputConfig, }, coreOptsFromCtx(ctx), ); diff --git a/src/handlers/eval/batch-evaluation/outputConfig.tsx b/src/handlers/eval/batch-evaluation/outputConfig.tsx new file mode 100644 index 000000000..d3fead6b1 --- /dev/null +++ b/src/handlers/eval/batch-evaluation/outputConfig.tsx @@ -0,0 +1,54 @@ +import type { OutputConfig } from "@aws-sdk/client-bedrock-agentcore"; +import z from "zod"; +import { SourceResolver, type AppIO } from "../../../io"; +import { flag } from "../../../router"; +import { parseJsonFlag } from "../../utils"; + +const outputConfigHelp = `(JSON: tagged union object) +Where evaluation results and metrics are written. Omit it and results go to the +service-managed default location. Only top-level key: cloudWatchConfig. + +Accepts inline JSON, file://, or - to read stdin. + +JSON syntax: + { + "cloudWatchConfig": { + "logGroupName": "string", // result log group; omit for + // SOURCE_LOG_GROUP, and it cannot sit + // under /aws/bedrock-agentcore/evaluations/ + "logStreamName": "string", // result log stream + "metricsNamespace": "string", // defaults to + // Bedrock-AgentCore/Evaluations; cannot + // begin with "AWS/" + "resultDestination": "DEDICATED_LOG_GROUP" | "SOURCE_LOG_GROUP" + // DEDICATED_LOG_GROUP (default) writes to + // a dedicated result group; + // SOURCE_LOG_GROUP writes back to the log + // group the traces were read from + } + } + +API reference: + https://docs.aws.amazon.com/bedrock-agentcore/latest/APIReference/API_OutputConfig.html + +Example: + --output-config '{"cloudWatchConfig":{"logGroupName":"/company/agent-evaluations","metricsNamespace":"Company/AgentEvaluations","resultDestination":"DEDICATED_LOG_GROUP"}}'`; + +export class BatchOutputConfig { + static readonly flags = [ + flag( + "output-config", + "where results and metrics are written (JSON OutputConfig)", + z.string().optional(), + { group: "Result output:", help: outputConfigHelp }, + ), + ] as const; + + static async resolve(value: string | undefined, io: AppIO): Promise { + const resolver = new SourceResolver({ stdin: io.stdin }); + return parseJsonFlag( + "output-config", + await resolver.resolveText("output-config", value), + ); + } +} diff --git a/src/handlers/eval/batch-evaluation/simulate/index.tsx b/src/handlers/eval/batch-evaluation/simulate/index.tsx index ff6c51ec7..23ee6d69c 100644 --- a/src/handlers/eval/batch-evaluation/simulate/index.tsx +++ b/src/handlers/eval/batch-evaluation/simulate/index.tsx @@ -6,6 +6,7 @@ import type { AppIO } from "../../../../io"; import type { Core } from "../../../types"; import { coreOptsFromCtx } from "../../../utils"; import { parseRuntimeInvokeHeaders } from "../../../runtime/invoke/request"; +import { BatchOutputConfig } from "../outputConfig"; const RUNTIME_INVOCATION = "Runtime invocation:"; const DATASET = "Dataset:"; @@ -23,7 +24,7 @@ Example: // Composes invokeDataset (replay) → startBatchEvaluation (grade). Invoke flags mirror // `runtime invoke`. -export const createSimulateBatchEvaluationHandler = (core: Core, _io: AppIO) => +export const createSimulateBatchEvaluationHandler = (core: Core, io: AppIO) => createHandler({ name: "simulate", description: "replay a dataset against a Runtime, then batch-evaluate the resulting sessions", @@ -31,7 +32,7 @@ export const createSimulateBatchEvaluationHandler = (core: Core, _io: AppIO) => flag("runtime-id", "Runtime ID to invoke per scenario", z.string().optional(), { group: RUNTIME_INVOCATION, }), - flag("qualifier", "Runtime endpoint qualifier (default DEFAULT)", z.string().optional(), { + flag("endpoint", "Runtime endpoint qualifier (default DEFAULT)", z.string().optional(), { group: RUNTIME_INVOCATION, }), flag( @@ -77,6 +78,7 @@ export const createSimulateBatchEvaluationHandler = (core: Core, _io: AppIO) => flag("evaluators", "evaluator ID(s) to apply", z.array(z.string()).optional(), { group: "Evaluation:", }), + ...BatchOutputConfig.flags, ], handle: async (ctx, flags) => { if (!flags["runtime-id"]) @@ -96,6 +98,8 @@ export const createSimulateBatchEvaluationHandler = (core: Core, _io: AppIO) => // Ctrl-C aborts the run (invokes, the ingestion wait, the dataset download). // TODO(#1986): swap for the shared SIGINT/abort helper once it merges. + const outputConfig = await BatchOutputConfig.resolve(flags["output-config"], io); + const controller = new AbortController(); const interrupt = () => controller.abort(); process.once("SIGINT", interrupt); @@ -105,7 +109,7 @@ export const createSimulateBatchEvaluationHandler = (core: Core, _io: AppIO) => const r = await core.eval.invokeDataset( { runtimeId: flags["runtime-id"], - qualifier: flags["qualifier"], + qualifier: flags["endpoint"], payloadTemplate: flags["payload-template"], headers: parseRuntimeInvokeHeaders(flags["header"]), bearerToken: flags["bearer-token"], @@ -134,7 +138,7 @@ export const createSimulateBatchEvaluationHandler = (core: Core, _io: AppIO) => source: { origin: "agent", agent: flags["runtime-id"], - endpoint: flags["qualifier"], + endpoint: flags["endpoint"], sessionIds: r.sessions.map((s) => s.sessionId), }, groundTruth: r.sessions.map((s) => ({ @@ -143,6 +147,7 @@ export const createSimulateBatchEvaluationHandler = (core: Core, _io: AppIO) => ...(s.groundTruth && { groundTruth: { inline: s.groundTruth } }), })), kmsKeyArn: flags["kms-key-arn"], + outputConfig, }, opts, ); diff --git a/src/handlers/eval/ondemand/ondemand.test.tsx b/src/handlers/eval/ondemand/ondemand.test.tsx index 56892a454..7b8659406 100644 --- a/src/handlers/eval/ondemand/ondemand.test.tsx +++ b/src/handlers/eval/ondemand/ondemand.test.tsx @@ -233,6 +233,34 @@ describe("eval ondemand simulate", () => { ).rejects.toThrow(/no examples could be invoked \(2 failed\).*first error: e1 — HTTP 500/); }); + test("--endpoint reaches the Runtime invocation as the qualifier", async () => { + const { core } = await run([...BASE, "--endpoint", "BETA"], (c) => + c.eval.setInvokeDatasetResponse({ + sessions: [{ exampleId: "e1", sessionId: "s1" }], + invoked: 1, + failed: 0, + failures: [], + }), + ); + const invoke = core.eval.calls.find((c) => c.method === "invokeDataset"); + expect(invoke).toBeDefined(); + expect((invoke!.args[0] as { qualifier?: string }).qualifier).toBe("BETA"); + }); + + test("--endpoint is reused when fetching the traces to evaluate", async () => { + const { core } = await run([...BASE, "--endpoint", "BETA"], (c) => + c.eval.setInvokeDatasetResponse({ + sessions: [{ exampleId: "e1", sessionId: "s1" }], + invoked: 1, + failed: 0, + failures: [], + }), + ); + const fetch = core.eval.calls.find((c) => c.method === "getTracesForAgent"); + expect(fetch).toBeDefined(); + expect((fetch!.args[0] as { endpoint?: string }).endpoint).toBe("BETA"); + }); + test("passes --ingestion-wait-ms through to invokeDataset and renders failures", async () => { const { core, stdout } = await run([...BASE, "--ingestion-wait-ms", "0"], (c) => c.eval.setInvokeDatasetResponse({ diff --git a/src/handlers/eval/ondemand/simulate/index.tsx b/src/handlers/eval/ondemand/simulate/index.tsx index 7284666e3..17d24f3ed 100644 --- a/src/handlers/eval/ondemand/simulate/index.tsx +++ b/src/handlers/eval/ondemand/simulate/index.tsx @@ -16,7 +16,7 @@ export const createSimulateOnDemandHandler = (core: Core, _io: AppIO) => description: "replay a dataset against a Runtime, then evaluate the sessions client-side", flags: [ flag("runtime-id", "Runtime ID to invoke per scenario", z.string().optional()), - flag("qualifier", "Runtime endpoint qualifier (default DEFAULT)", z.string().optional()), + flag("endpoint", "Runtime endpoint qualifier (default DEFAULT)", z.string().optional()), flag( "payload-template", 'JSON payload template; {input} is the scenario input, e.g. {"prompt":"{input}"}', @@ -66,7 +66,7 @@ export const createSimulateOnDemandHandler = (core: Core, _io: AppIO) => const replay = await core.eval.invokeDataset( { runtimeId, - qualifier: flags["qualifier"], + qualifier: flags["endpoint"], payloadTemplate, headers: parseRuntimeInvokeHeaders(flags["header"]), bearerToken: flags["bearer-token"], @@ -89,7 +89,7 @@ export const createSimulateOnDemandHandler = (core: Core, _io: AppIO) => const traces = await core.eval.getTracesForAgent( { agent: runtimeId, - endpoint: flags["qualifier"], + endpoint: flags["endpoint"], sessionIds: replay.sessions.map((s) => s.sessionId), }, opts, diff --git a/src/handlers/eval/types.tsx b/src/handlers/eval/types.tsx index 8d84c3656..7c8dd4c29 100644 --- a/src/handlers/eval/types.tsx +++ b/src/handlers/eval/types.tsx @@ -51,6 +51,7 @@ import type { InlineGroundTruth, EvaluationReferenceInput, EvaluationResultContent, + OutputConfig, DataSourceConfig as DataPlaneDataSourceConfig, } from "@aws-sdk/client-bedrock-agentcore"; import type { CoreOptions } from "../../core/types"; @@ -289,6 +290,7 @@ export type StartBatchEvaluationInput = { // Already-parsed --ground-truth (SessionMetadataShape[]) → evaluationMetadata. groundTruth?: SessionMetadataShape[]; kmsKeyArn?: string; + outputConfig?: OutputConfig; }; // Batch insights use the same service job API as batch evaluations, but remain