@aws/agentcore 1.0.0-preview.9 → 1.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +978 -145
- package/dist/assets/agent-inspector/index.css.asset +1 -0
- package/dist/assets/agent-inspector/index.js.asset +289 -0
- package/dist/assets/cdk/README.md +3 -0
- package/dist/assets/cdk/bin/cdk.ts +109 -59
- package/dist/assets/cdk/lib/cdk-stack.ts +30 -19
- package/dist/assets/cdk/package.json +9 -9
- package/dist/assets/cdk/test/cdk.test.ts +94 -2
- package/dist/assets/evaluators/autoevals-lambda/README.md +23 -0
- package/dist/assets/evaluators/autoevals-lambda/execution-role-policy.json +15 -0
- package/dist/assets/evaluators/autoevals-lambda/lambda_function.py +37 -0
- package/dist/assets/evaluators/autoevals-lambda/pyproject.toml +23 -0
- package/dist/assets/evaluators/deepeval-lambda/README.md +23 -0
- package/dist/assets/evaluators/deepeval-lambda/execution-role-policy.json +15 -0
- package/dist/assets/evaluators/deepeval-lambda/lambda_function.py +29 -0
- package/dist/assets/evaluators/deepeval-lambda/pyproject.toml +22 -0
- package/dist/assets/evaluators/python-lambda/README.md +28 -0
- package/dist/assets/evaluators/python-lambda/pyproject.toml +1 -1
- package/dist/assets/templates/a2a-python-strands/README.md +31 -0
- package/dist/assets/templates/a2a-python-strands/main.py +100 -0
- package/dist/assets/templates/a2a-python-strands/memory/session.py +35 -0
- package/dist/assets/templates/a2a-python-strands/model/load.py +6 -0
- package/dist/assets/templates/a2a-python-strands/pyproject.toml +20 -0
- package/dist/assets/templates/agent-python-langchain/README.md +55 -0
- package/dist/assets/{python/a2a/googleadk/base → templates/agent-python-langchain}/gitignore.template +1 -1
- package/dist/assets/templates/agent-python-langchain/main.py +54 -0
- package/dist/assets/templates/agent-python-langchain/model/load.py +9 -0
- package/dist/assets/templates/agent-python-langchain/pyproject.toml +21 -0
- package/dist/assets/templates/agent-python-minimal/README.md +31 -0
- package/dist/assets/templates/agent-python-minimal/main.py +13 -0
- package/dist/assets/templates/agent-python-minimal/pyproject.toml +18 -0
- package/dist/assets/{container/python/Dockerfile → templates/agent-python-strands/Dockerfile.template} +3 -1
- package/dist/assets/templates/agent-python-strands/README.md +46 -0
- package/dist/assets/{python/a2a/langchain_langgraph/base → templates/agent-python-strands}/gitignore.template +1 -1
- package/dist/assets/templates/agent-python-strands/main.py +106 -0
- package/dist/assets/templates/agent-python-strands/memory/__init__.py +0 -0
- package/dist/assets/templates/agent-python-strands/memory/session.py +35 -0
- package/dist/assets/{python/http/strands/base → templates/agent-python-strands}/model/load.py +46 -0
- package/dist/assets/templates/agent-python-strands/pyproject.toml +24 -0
- package/dist/assets/templates/agent-typescript-strands/README.md +29 -0
- package/dist/assets/templates/agent-typescript-strands/gitignore.template +22 -0
- package/dist/assets/templates/agent-typescript-strands/main.ts +86 -0
- package/dist/assets/templates/agent-typescript-strands/mcp_client/client.ts +11 -0
- package/dist/assets/templates/agent-typescript-strands/memory/memory.ts +44 -0
- package/dist/assets/templates/agent-typescript-strands/model/load.ts +5 -0
- package/dist/assets/templates/agent-typescript-strands/package.json.template +29 -0
- package/dist/assets/templates/agent-typescript-strands/tsconfig.json +19 -0
- package/dist/assets/templates/agent-typescript-vercel/README.md +22 -0
- package/dist/assets/templates/agent-typescript-vercel/gitignore.template +22 -0
- package/dist/assets/templates/agent-typescript-vercel/main.ts +35 -0
- package/dist/assets/templates/agent-typescript-vercel/package.json.template +24 -0
- package/dist/assets/templates/agent-typescript-vercel/tsconfig.json +19 -0
- package/dist/assets/templates/agui-python-strands/README.md +39 -0
- package/dist/assets/{python/a2a/strands/base → templates/agui-python-strands}/gitignore.template +1 -1
- package/dist/assets/{python/agui/strands/base → templates/agui-python-strands}/main.py +11 -14
- package/dist/assets/templates/agui-python-strands/memory/__init__.py +0 -0
- package/dist/assets/templates/agui-python-strands/memory/session.py +35 -0
- package/dist/assets/templates/agui-python-strands/model/load.py +6 -0
- package/dist/assets/templates/agui-python-strands/pyproject.toml +22 -0
- package/dist/assets/{python/http/strands/base → templates/export-harness-python}/README.md +15 -8
- package/dist/assets/templates/export-harness-python/gitignore.template +41 -0
- package/dist/assets/templates/export-harness-python/main.py +584 -0
- package/dist/assets/templates/export-harness-python/mcp_client/client.py +63 -0
- package/dist/assets/templates/export-harness-python/memory/__init__.py +0 -0
- package/dist/assets/templates/export-harness-python/memory/session.py +47 -0
- package/dist/assets/templates/export-harness-python/model/load.py +249 -0
- package/dist/assets/templates/export-harness-python/model/mantle_compat.py +21 -0
- package/dist/assets/templates/export-harness-python/pyproject.toml +22 -0
- package/dist/assets/templates/export-harness-python/skills/fetcher.py +279 -0
- package/dist/assets/templates/mcp-python-fastmcp/README.md +32 -0
- package/dist/assets/templates/mcp-python-fastmcp/gitignore.template +41 -0
- package/dist/assets/templates/mcp-python-fastmcp/main.py +83 -0
- package/dist/assets/{python/mcp/standalone/base → templates/mcp-python-fastmcp}/pyproject.toml +3 -2
- package/dist/assets/templates/shared/env.local.template +11 -0
- package/dist/assets/templates/shared/gitignore.template +19 -0
- package/dist/index.js +4 -27
- package/dist/main.js +1190 -0
- package/package.json +75 -149
- package/LICENSE +0 -175
- package/dist/agent-inspector/index.css +0 -1
- package/dist/agent-inspector/index.js +0 -279
- package/dist/assets/README.md +0 -104
- package/dist/assets/__tests__/__snapshots__/assets.snapshot.test.ts.snap +0 -5673
- package/dist/assets/__tests__/__snapshots__/dockerfile-render.test.ts.snap +0 -77
- package/dist/assets/__tests__/assets.snapshot.test.ts +0 -125
- package/dist/assets/__tests__/dockerfile-render.test.ts +0 -24
- package/dist/assets/agents/AGENTS.md +0 -141
- package/dist/assets/harness/invoke.py.template +0 -74
- package/dist/assets/mcp/python/README.md +0 -27
- package/dist/assets/mcp/python/pyproject.toml +0 -22
- package/dist/assets/mcp/python/server.py +0 -117
- package/dist/assets/mcp/python-lambda/README.md +0 -22
- package/dist/assets/mcp/python-lambda/handler.py +0 -144
- package/dist/assets/mcp/python-lambda/pyproject.toml +0 -15
- package/dist/assets/python/a2a/googleadk/base/README.md +0 -22
- package/dist/assets/python/a2a/googleadk/base/main.py +0 -110
- package/dist/assets/python/a2a/googleadk/base/model/load.py +0 -41
- package/dist/assets/python/a2a/googleadk/base/pyproject.toml +0 -20
- package/dist/assets/python/a2a/langchain_langgraph/base/README.md +0 -22
- package/dist/assets/python/a2a/langchain_langgraph/base/main.py +0 -130
- package/dist/assets/python/a2a/langchain_langgraph/base/model/load.py +0 -123
- package/dist/assets/python/a2a/langchain_langgraph/base/pyproject.toml +0 -25
- package/dist/assets/python/a2a/strands/base/README.md +0 -22
- package/dist/assets/python/a2a/strands/base/main.py +0 -107
- package/dist/assets/python/a2a/strands/base/model/load.py +0 -123
- package/dist/assets/python/a2a/strands/base/pyproject.toml +0 -23
- package/dist/assets/python/a2a/strands/capabilities/memory/session.py +0 -43
- package/dist/assets/python/agui/googleadk/base/README.md +0 -30
- package/dist/assets/python/agui/googleadk/base/gitignore.template +0 -41
- package/dist/assets/python/agui/googleadk/base/main.py +0 -31
- package/dist/assets/python/agui/googleadk/base/model/load.py +0 -41
- package/dist/assets/python/agui/googleadk/base/pyproject.toml +0 -24
- package/dist/assets/python/agui/langchain_langgraph/base/README.md +0 -22
- package/dist/assets/python/agui/langchain_langgraph/base/gitignore.template +0 -41
- package/dist/assets/python/agui/langchain_langgraph/base/main.py +0 -74
- package/dist/assets/python/agui/langchain_langgraph/base/model/load.py +0 -123
- package/dist/assets/python/agui/langchain_langgraph/base/pyproject.toml +0 -30
- package/dist/assets/python/agui/strands/base/README.md +0 -22
- package/dist/assets/python/agui/strands/base/gitignore.template +0 -41
- package/dist/assets/python/agui/strands/base/model/__init__.py +0 -1
- package/dist/assets/python/agui/strands/base/model/load.py +0 -123
- package/dist/assets/python/agui/strands/base/pyproject.toml +0 -27
- package/dist/assets/python/agui/strands/capabilities/memory/__init__.py +0 -1
- package/dist/assets/python/agui/strands/capabilities/memory/session.py +0 -43
- package/dist/assets/python/http/autogen/base/README.md +0 -39
- package/dist/assets/python/http/autogen/base/gitignore.template +0 -41
- package/dist/assets/python/http/autogen/base/main.py +0 -112
- package/dist/assets/python/http/autogen/base/mcp_client/__init__.py +0 -1
- package/dist/assets/python/http/autogen/base/mcp_client/client.py +0 -28
- package/dist/assets/python/http/autogen/base/model/__init__.py +0 -1
- package/dist/assets/python/http/autogen/base/model/load.py +0 -136
- package/dist/assets/python/http/autogen/base/pyproject.toml +0 -34
- package/dist/assets/python/http/googleadk/base/README.md +0 -39
- package/dist/assets/python/http/googleadk/base/gitignore.template +0 -41
- package/dist/assets/python/http/googleadk/base/main.py +0 -160
- package/dist/assets/python/http/googleadk/base/mcp_client/__init__.py +0 -1
- package/dist/assets/python/http/googleadk/base/mcp_client/client.py +0 -75
- package/dist/assets/python/http/googleadk/base/model/__init__.py +0 -1
- package/dist/assets/python/http/googleadk/base/model/load.py +0 -41
- package/dist/assets/python/http/googleadk/base/pyproject.toml +0 -22
- package/dist/assets/python/http/langchain_langgraph/base/README.md +0 -39
- package/dist/assets/python/http/langchain_langgraph/base/gitignore.template +0 -41
- package/dist/assets/python/http/langchain_langgraph/base/main.py +0 -176
- package/dist/assets/python/http/langchain_langgraph/base/mcp_client/__init__.py +0 -1
- package/dist/assets/python/http/langchain_langgraph/base/mcp_client/client.py +0 -77
- package/dist/assets/python/http/langchain_langgraph/base/model/__init__.py +0 -1
- package/dist/assets/python/http/langchain_langgraph/base/model/load.py +0 -123
- package/dist/assets/python/http/langchain_langgraph/base/pyproject.toml +0 -37
- package/dist/assets/python/http/openaiagents/base/README.md +0 -39
- package/dist/assets/python/http/openaiagents/base/gitignore.template +0 -41
- package/dist/assets/python/http/openaiagents/base/main.py +0 -169
- package/dist/assets/python/http/openaiagents/base/mcp_client/__init__.py +0 -1
- package/dist/assets/python/http/openaiagents/base/mcp_client/client.py +0 -74
- package/dist/assets/python/http/openaiagents/base/model/__init__.py +0 -1
- package/dist/assets/python/http/openaiagents/base/model/load.py +0 -37
- package/dist/assets/python/http/openaiagents/base/pyproject.toml +0 -21
- package/dist/assets/python/http/strands/base/main.py +0 -217
- package/dist/assets/python/http/strands/base/mcp_client/__init__.py +0 -1
- package/dist/assets/python/http/strands/base/mcp_client/client.py +0 -73
- package/dist/assets/python/http/strands/base/model/__init__.py +0 -1
- package/dist/assets/python/http/strands/base/pyproject.toml +0 -25
- package/dist/assets/python/http/strands/capabilities/memory/__init__.py +0 -1
- package/dist/assets/python/http/strands/capabilities/memory/session.py +0 -44
- package/dist/assets/python/mcp/standalone/base/README.md +0 -36
- package/dist/assets/python/mcp/standalone/base/gitignore.template +0 -41
- package/dist/assets/python/mcp/standalone/base/main.py +0 -25
- package/dist/cli/index.mjs +0 -1718
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/constants.d.ts +0 -37
- package/dist/lib/constants.d.ts.map +0 -1
- package/dist/lib/constants.js +0 -69
- package/dist/lib/constants.js.map +0 -1
- package/dist/lib/errors/config.d.ts +0 -49
- package/dist/lib/errors/config.d.ts.map +0 -1
- package/dist/lib/errors/config.js +0 -170
- package/dist/lib/errors/config.js.map +0 -1
- package/dist/lib/errors/index.d.ts +0 -2
- package/dist/lib/errors/index.d.ts.map +0 -1
- package/dist/lib/errors/index.js +0 -18
- package/dist/lib/errors/index.js.map +0 -1
- package/dist/lib/index.d.ts +0 -7
- package/dist/lib/index.d.ts.map +0 -1
- package/dist/lib/index.js +0 -44
- package/dist/lib/index.js.map +0 -1
- package/dist/lib/packaging/build-args.d.ts +0 -6
- package/dist/lib/packaging/build-args.d.ts.map +0 -1
- package/dist/lib/packaging/build-args.js +0 -18
- package/dist/lib/packaging/build-args.js.map +0 -1
- package/dist/lib/packaging/container.d.ts +0 -10
- package/dist/lib/packaging/container.d.ts.map +0 -1
- package/dist/lib/packaging/container.js +0 -78
- package/dist/lib/packaging/container.js.map +0 -1
- package/dist/lib/packaging/errors.d.ts +0 -16
- package/dist/lib/packaging/errors.d.ts.map +0 -1
- package/dist/lib/packaging/errors.js +0 -36
- package/dist/lib/packaging/errors.js.map +0 -1
- package/dist/lib/packaging/helpers.d.ts +0 -54
- package/dist/lib/packaging/helpers.d.ts.map +0 -1
- package/dist/lib/packaging/helpers.js +0 -463
- package/dist/lib/packaging/helpers.js.map +0 -1
- package/dist/lib/packaging/index.d.ts +0 -40
- package/dist/lib/packaging/index.d.ts.map +0 -1
- package/dist/lib/packaging/index.js +0 -98
- package/dist/lib/packaging/index.js.map +0 -1
- package/dist/lib/packaging/node.d.ts +0 -22
- package/dist/lib/packaging/node.d.ts.map +0 -1
- package/dist/lib/packaging/node.js +0 -109
- package/dist/lib/packaging/node.js.map +0 -1
- package/dist/lib/packaging/python.d.ts +0 -23
- package/dist/lib/packaging/python.d.ts.map +0 -1
- package/dist/lib/packaging/python.js +0 -165
- package/dist/lib/packaging/python.js.map +0 -1
- package/dist/lib/packaging/types/index.d.ts +0 -2
- package/dist/lib/packaging/types/index.d.ts.map +0 -1
- package/dist/lib/packaging/types/index.js +0 -3
- package/dist/lib/packaging/types/index.js.map +0 -1
- package/dist/lib/packaging/types/packaging.d.ts +0 -57
- package/dist/lib/packaging/types/packaging.d.ts.map +0 -1
- package/dist/lib/packaging/types/packaging.js +0 -3
- package/dist/lib/packaging/types/packaging.js.map +0 -1
- package/dist/lib/packaging/uv.d.ts +0 -7
- package/dist/lib/packaging/uv.d.ts.map +0 -1
- package/dist/lib/packaging/uv.js +0 -40
- package/dist/lib/packaging/uv.js.map +0 -1
- package/dist/lib/schemas/io/config-io.d.ts +0 -119
- package/dist/lib/schemas/io/config-io.d.ts.map +0 -1
- package/dist/lib/schemas/io/config-io.js +0 -323
- package/dist/lib/schemas/io/config-io.js.map +0 -1
- package/dist/lib/schemas/io/global-config.d.ts +0 -33
- package/dist/lib/schemas/io/global-config.d.ts.map +0 -1
- package/dist/lib/schemas/io/global-config.js +0 -89
- package/dist/lib/schemas/io/global-config.js.map +0 -1
- package/dist/lib/schemas/io/index.d.ts +0 -3
- package/dist/lib/schemas/io/index.d.ts.map +0 -1
- package/dist/lib/schemas/io/index.js +0 -18
- package/dist/lib/schemas/io/index.js.map +0 -1
- package/dist/lib/schemas/io/path-resolver.d.ts +0 -119
- package/dist/lib/schemas/io/path-resolver.d.ts.map +0 -1
- package/dist/lib/schemas/io/path-resolver.js +0 -207
- package/dist/lib/schemas/io/path-resolver.js.map +0 -1
- package/dist/lib/utils/aws-account.d.ts +0 -7
- package/dist/lib/utils/aws-account.d.ts.map +0 -1
- package/dist/lib/utils/aws-account.js +0 -24
- package/dist/lib/utils/aws-account.js.map +0 -1
- package/dist/lib/utils/credentials.d.ts +0 -86
- package/dist/lib/utils/credentials.d.ts.map +0 -1
- package/dist/lib/utils/credentials.js +0 -153
- package/dist/lib/utils/credentials.js.map +0 -1
- package/dist/lib/utils/env.d.ts +0 -22
- package/dist/lib/utils/env.d.ts.map +0 -1
- package/dist/lib/utils/env.js +0 -65
- package/dist/lib/utils/env.js.map +0 -1
- package/dist/lib/utils/index.d.ts +0 -9
- package/dist/lib/utils/index.d.ts.map +0 -1
- package/dist/lib/utils/index.js +0 -27
- package/dist/lib/utils/index.js.map +0 -1
- package/dist/lib/utils/json-rpc.d.ts +0 -3
- package/dist/lib/utils/json-rpc.d.ts.map +0 -1
- package/dist/lib/utils/json-rpc.js +0 -27
- package/dist/lib/utils/json-rpc.js.map +0 -1
- package/dist/lib/utils/platform.d.ts +0 -63
- package/dist/lib/utils/platform.d.ts.map +0 -1
- package/dist/lib/utils/platform.js +0 -88
- package/dist/lib/utils/platform.js.map +0 -1
- package/dist/lib/utils/subprocess.d.ts +0 -29
- package/dist/lib/utils/subprocess.d.ts.map +0 -1
- package/dist/lib/utils/subprocess.js +0 -116
- package/dist/lib/utils/subprocess.js.map +0 -1
- package/dist/lib/utils/time-parser.d.ts +0 -11
- package/dist/lib/utils/time-parser.d.ts.map +0 -1
- package/dist/lib/utils/time-parser.js +0 -47
- package/dist/lib/utils/time-parser.js.map +0 -1
- package/dist/lib/utils/zod.d.ts +0 -14
- package/dist/lib/utils/zod.d.ts.map +0 -1
- package/dist/lib/utils/zod.js +0 -32
- package/dist/lib/utils/zod.js.map +0 -1
- package/dist/schema/constants.d.ts +0 -119
- package/dist/schema/constants.d.ts.map +0 -1
- package/dist/schema/constants.js +0 -170
- package/dist/schema/constants.js.map +0 -1
- package/dist/schema/index.d.ts +0 -4
- package/dist/schema/index.d.ts.map +0 -1
- package/dist/schema/index.js +0 -21
- package/dist/schema/index.js.map +0 -1
- package/dist/schema/schemas/agent-env.d.ts +0 -186
- package/dist/schema/schemas/agent-env.d.ts.map +0 -1
- package/dist/schema/schemas/agent-env.js +0 -240
- package/dist/schema/schemas/agent-env.js.map +0 -1
- package/dist/schema/schemas/agentcore-project.d.ts +0 -838
- package/dist/schema/schemas/agentcore-project.d.ts.map +0 -1
- package/dist/schema/schemas/agentcore-project.js +0 -335
- package/dist/schema/schemas/agentcore-project.js.map +0 -1
- package/dist/schema/schemas/auth.d.ts +0 -140
- package/dist/schema/schemas/auth.d.ts.map +0 -1
- package/dist/schema/schemas/auth.js +0 -114
- package/dist/schema/schemas/auth.js.map +0 -1
- package/dist/schema/schemas/aws-targets.d.ts +0 -71
- package/dist/schema/schemas/aws-targets.d.ts.map +0 -1
- package/dist/schema/schemas/aws-targets.js +0 -57
- package/dist/schema/schemas/aws-targets.js.map +0 -1
- package/dist/schema/schemas/deployed-state.d.ts +0 -725
- package/dist/schema/schemas/deployed-state.d.ts.map +0 -1
- package/dist/schema/schemas/deployed-state.js +0 -218
- package/dist/schema/schemas/deployed-state.js.map +0 -1
- package/dist/schema/schemas/index.d.ts +0 -9
- package/dist/schema/schemas/index.d.ts.map +0 -1
- package/dist/schema/schemas/index.js +0 -26
- package/dist/schema/schemas/index.js.map +0 -1
- package/dist/schema/schemas/mcp-defs.d.ts +0 -52
- package/dist/schema/schemas/mcp-defs.d.ts.map +0 -1
- package/dist/schema/schemas/mcp-defs.js +0 -50
- package/dist/schema/schemas/mcp-defs.js.map +0 -1
- package/dist/schema/schemas/mcp.d.ts +0 -820
- package/dist/schema/schemas/mcp.d.ts.map +0 -1
- package/dist/schema/schemas/mcp.js +0 -564
- package/dist/schema/schemas/mcp.js.map +0 -1
- package/dist/schema/schemas/primitives/ab-test.d.ts +0 -141
- package/dist/schema/schemas/primitives/ab-test.d.ts.map +0 -1
- package/dist/schema/schemas/primitives/ab-test.js +0 -97
- package/dist/schema/schemas/primitives/ab-test.js.map +0 -1
- package/dist/schema/schemas/primitives/config-bundle.d.ts +0 -31
- package/dist/schema/schemas/primitives/config-bundle.d.ts.map +0 -1
- package/dist/schema/schemas/primitives/config-bundle.js +0 -38
- package/dist/schema/schemas/primitives/config-bundle.js.map +0 -1
- package/dist/schema/schemas/primitives/evaluator.d.ts +0 -102
- package/dist/schema/schemas/primitives/evaluator.d.ts.map +0 -1
- package/dist/schema/schemas/primitives/evaluator.js +0 -84
- package/dist/schema/schemas/primitives/evaluator.js.map +0 -1
- package/dist/schema/schemas/primitives/harness.d.ts +0 -363
- package/dist/schema/schemas/primitives/harness.d.ts.map +0 -1
- package/dist/schema/schemas/primitives/harness.js +0 -261
- package/dist/schema/schemas/primitives/harness.js.map +0 -1
- package/dist/schema/schemas/primitives/http-gateway.d.ts +0 -21
- package/dist/schema/schemas/primitives/http-gateway.d.ts.map +0 -1
- package/dist/schema/schemas/primitives/http-gateway.js +0 -34
- package/dist/schema/schemas/primitives/http-gateway.js.map +0 -1
- package/dist/schema/schemas/primitives/index.d.ts +0 -15
- package/dist/schema/schemas/primitives/index.d.ts.map +0 -1
- package/dist/schema/schemas/primitives/index.js +0 -61
- package/dist/schema/schemas/primitives/index.js.map +0 -1
- package/dist/schema/schemas/primitives/memory.d.ts +0 -51
- package/dist/schema/schemas/primitives/memory.d.ts.map +0 -1
- package/dist/schema/schemas/primitives/memory.js +0 -73
- package/dist/schema/schemas/primitives/memory.js.map +0 -1
- package/dist/schema/schemas/primitives/online-eval-config.d.ts +0 -14
- package/dist/schema/schemas/primitives/online-eval-config.d.ts.map +0 -1
- package/dist/schema/schemas/primitives/online-eval-config.js +0 -30
- package/dist/schema/schemas/primitives/online-eval-config.js.map +0 -1
- package/dist/schema/schemas/primitives/policy.d.ts +0 -49
- package/dist/schema/schemas/primitives/policy.d.ts.map +0 -1
- package/dist/schema/schemas/primitives/policy.js +0 -62
- package/dist/schema/schemas/primitives/policy.js.map +0 -1
- package/dist/schema/schemas/primitives/tags.d.ts +0 -6
- package/dist/schema/schemas/primitives/tags.d.ts.map +0 -1
- package/dist/schema/schemas/primitives/tags.js +0 -27
- package/dist/schema/schemas/primitives/tags.js.map +0 -1
- package/dist/schema/schemas/zod-util.d.ts +0 -10
- package/dist/schema/schemas/zod-util.d.ts.map +0 -1
- package/dist/schema/schemas/zod-util.js +0 -23
- package/dist/schema/schemas/zod-util.js.map +0 -1
- package/dist/schema/types/index.d.ts +0 -2
- package/dist/schema/types/index.d.ts.map +0 -1
- package/dist/schema/types/index.js +0 -18
- package/dist/schema/types/index.js.map +0 -1
- package/dist/schema/types/path.d.ts +0 -27
- package/dist/schema/types/path.d.ts.map +0 -1
- package/dist/schema/types/path.js +0 -13
- package/dist/schema/types/path.js.map +0 -1
- package/scripts/bump-version.ts +0 -393
- package/scripts/bundle.mjs +0 -219
- package/scripts/check-old-cli.lib.mjs +0 -102
- package/scripts/check-old-cli.mjs +0 -10
- package/scripts/copy-assets.mjs +0 -64
- package/scripts/generate-schema.mjs +0 -40
- package/scripts/run-e2e-local.sh +0 -112
- package/scripts/start-tui-harness.sh +0 -90
- /package/dist/{agent-inspector/favicon.svg → assets/agent-inspector/favicon.svg.asset} +0 -0
- /package/dist/{agent-inspector/index.html → assets/agent-inspector/index.html.asset} +0 -0
- /package/dist/assets/{python/http/strands/base → templates/a2a-python-strands}/gitignore.template +0 -0
- /package/dist/assets/{typescript/.gitkeep → templates/a2a-python-strands/memory/__init__.py} +0 -0
- /package/dist/assets/{python/a2a/googleadk/base → templates/a2a-python-strands}/model/__init__.py +0 -0
- /package/dist/assets/{python/a2a/langchain_langgraph/base → templates/agent-python-langchain}/model/__init__.py +0 -0
- /package/dist/assets/{container/python → templates/agent-python-strands}/dockerignore.template +0 -0
- /package/dist/assets/{python/a2a/strands/base → templates/agent-python-strands}/model/__init__.py +0 -0
- /package/dist/assets/{python/a2a/strands/capabilities/memory → templates/agui-python-strands/model}/__init__.py +0 -0
- /package/dist/assets/{python/agui/googleadk/base/model → templates/export-harness-python/mcp_client}/__init__.py +0 -0
- /package/dist/assets/{python/agui/langchain_langgraph/base → templates/export-harness-python}/model/__init__.py +0 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# {{ Name }}
|
|
2
|
+
|
|
3
|
+
An AgentCore **code-based evaluator** — a Lambda that scores an agent session
|
|
4
|
+
with your own logic.
|
|
5
|
+
|
|
6
|
+
## What's here
|
|
7
|
+
|
|
8
|
+
- `lambda_function.py` — the evaluator. The `@custom_code_based_evaluator()`
|
|
9
|
+
handler receives an `EvaluatorInput` (the session / trace / tool-call to
|
|
10
|
+
grade) and returns an `EvaluatorOutput` (`value` + `label`, or an error). It
|
|
11
|
+
ships as a stub that returns `Pass` for everything — replace the `TODO` with
|
|
12
|
+
your scoring logic.
|
|
13
|
+
- `pyproject.toml` — Python dependencies, managed with
|
|
14
|
+
[uv](https://docs.astral.sh/uv/).
|
|
15
|
+
- `execution-role-policy.json` — extra IAM the evaluator Lambda gets at runtime.
|
|
16
|
+
Add statements here for anything your logic calls (DynamoDB, S3, …).
|
|
17
|
+
|
|
18
|
+
## Write your evaluator
|
|
19
|
+
|
|
20
|
+
```python
|
|
21
|
+
@custom_code_based_evaluator()
|
|
22
|
+
def handler(input: EvaluatorInput, context) -> EvaluatorOutput:
|
|
23
|
+
# inspect input.session_spans / input.target_trace_id / input.target_span_id
|
|
24
|
+
return EvaluatorOutput(value=1.0, label="Pass", explanation="…")
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Then `agentcore project deploy` packages this directory into the evaluator
|
|
28
|
+
Lambda and registers the evaluator.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# {{ name }}
|
|
2
|
+
|
|
3
|
+
An A2A (Agent-to-Agent) agent deployed on Amazon Bedrock AgentCore using the Strands SDK.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
This agent speaks the A2A protocol. Other agents discover it via its agent card at
|
|
8
|
+
`/.well-known/agent-card.json` and invoke it with JSON-RPC (`message/send`, `message/stream`)
|
|
9
|
+
at the server root, matching the AgentCore Runtime A2A service contract.
|
|
10
|
+
|
|
11
|
+
## Adding Tools
|
|
12
|
+
|
|
13
|
+
Define tools with the `@tool` decorator in `main.py` and add them to the `tools` list:
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
@tool
|
|
17
|
+
def my_tool(param: str) -> str:
|
|
18
|
+
"""Description of what the tool does."""
|
|
19
|
+
return f"Result: {param}"
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Developing locally
|
|
23
|
+
|
|
24
|
+
`agentcore project dev` starts the agent locally on `0.0.0.0:9000`. Fetch its agent card at
|
|
25
|
+
`http://127.0.0.1:9000/.well-known/agent-card.json` and send it messages by posting A2A
|
|
26
|
+
JSON-RPC to `http://127.0.0.1:9000/`.
|
|
27
|
+
|
|
28
|
+
## Deployment
|
|
29
|
+
|
|
30
|
+
`agentcore project deploy` deploys the agent into Amazon Bedrock AgentCore. Invoke it with the
|
|
31
|
+
AWS CLI (`bedrock-agentcore invoke-agent-runtime`) using an A2A JSON-RPC payload.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
from strands import Agent, tool
|
|
2
|
+
from strands.multiagent.a2a.executor import StrandsA2AExecutor
|
|
3
|
+
from bedrock_agentcore.runtime import serve_a2a
|
|
4
|
+
from model.load import load_model
|
|
5
|
+
from memory.session import get_memory_session_manager
|
|
6
|
+
{{#if needsOs}}
|
|
7
|
+
import os
|
|
8
|
+
{{/if}}
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@tool
|
|
12
|
+
def add_numbers(a: int, b: int) -> int:
|
|
13
|
+
"""Return the sum of two numbers."""
|
|
14
|
+
return a + b
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
tools = [add_numbers]
|
|
18
|
+
|
|
19
|
+
{{#if needsOs}}
|
|
20
|
+
_MOUNT_PATHS = [
|
|
21
|
+
{{#if sessionStorageMountPath}}"{{sessionStorageMountPath}}",{{/if}}
|
|
22
|
+
{{#each efsMounts}}"{{mountPath}}",{{/each}}
|
|
23
|
+
{{#each s3Mounts}}"{{mountPath}}",{{/each}}
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
def _safe_resolve(path: str) -> str:
|
|
27
|
+
resolved = os.path.realpath(path)
|
|
28
|
+
if not any(resolved == os.path.realpath(m) or resolved.startswith(os.path.realpath(m) + os.sep) for m in _MOUNT_PATHS):
|
|
29
|
+
raise ValueError(f"Path '{path}' is not within any configured mount ({', '.join(_MOUNT_PATHS)})")
|
|
30
|
+
return resolved
|
|
31
|
+
|
|
32
|
+
@tool
|
|
33
|
+
def file_read(path: str) -> str:
|
|
34
|
+
"""Read a file from a mounted filesystem. Use the absolute path (e.g. /mnt/tools/data.txt)."""
|
|
35
|
+
try:
|
|
36
|
+
full_path = _safe_resolve(path)
|
|
37
|
+
with open(full_path) as f:
|
|
38
|
+
return f.read()
|
|
39
|
+
except ValueError as e:
|
|
40
|
+
return str(e)
|
|
41
|
+
except OSError as e:
|
|
42
|
+
return f"Error reading '{path}': {e.strerror}"
|
|
43
|
+
|
|
44
|
+
@tool
|
|
45
|
+
def file_write(path: str, content: str) -> str:
|
|
46
|
+
"""Write a file to a mounted filesystem. Use the absolute path (e.g. /mnt/tools/data.txt)."""
|
|
47
|
+
try:
|
|
48
|
+
full_path = _safe_resolve(path)
|
|
49
|
+
parent = os.path.dirname(full_path)
|
|
50
|
+
if parent:
|
|
51
|
+
os.makedirs(parent, exist_ok=True)
|
|
52
|
+
with open(full_path, "w") as f:
|
|
53
|
+
f.write(content)
|
|
54
|
+
return f"Written to {path}"
|
|
55
|
+
except ValueError as e:
|
|
56
|
+
return str(e)
|
|
57
|
+
except OSError as e:
|
|
58
|
+
return f"Error writing '{path}': {e.strerror}"
|
|
59
|
+
|
|
60
|
+
@tool
|
|
61
|
+
def list_files(path: str) -> str:
|
|
62
|
+
"""List files in a mounted filesystem directory. Use the absolute path (e.g. /mnt/tools)."""
|
|
63
|
+
try:
|
|
64
|
+
full_path = _safe_resolve(path)
|
|
65
|
+
entries = os.listdir(full_path)
|
|
66
|
+
return "\n".join(entries) if entries else "(empty directory)"
|
|
67
|
+
except ValueError as e:
|
|
68
|
+
return str(e)
|
|
69
|
+
except OSError as e:
|
|
70
|
+
return f"Error listing '{path}': {e.strerror}"
|
|
71
|
+
|
|
72
|
+
tools.extend([file_read, file_write, list_files])
|
|
73
|
+
{{/if}}
|
|
74
|
+
|
|
75
|
+
SYSTEM_PROMPT = """
|
|
76
|
+
You are a helpful assistant. Use tools when appropriate.
|
|
77
|
+
{{#if needsOs}}
|
|
78
|
+
You have access to the following mounted filesystems. Use file_read, file_write, and list_files with full absolute paths:
|
|
79
|
+
{{#if sessionStorageMountPath}}- {{sessionStorageMountPath}}: ephemeral session storage (lost when session ends)
|
|
80
|
+
{{/if}}{{#each efsMounts}}- {{mountPath}}: EFS persistent storage (persists across sessions and agent restarts)
|
|
81
|
+
{{/each}}{{#each s3Mounts}}- {{mountPath}}: S3 Files persistent storage (durable, backed by S3)
|
|
82
|
+
{{/each}}{{/if}}
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
# serve_a2a serves one agent instance, so it is bound to a fixed session and
|
|
86
|
+
# actor; get_memory_session_manager returns None (in-process history only) until
|
|
87
|
+
# the deployed MEMORY_ID env var is set by the CDK.
|
|
88
|
+
agent = Agent(
|
|
89
|
+
name="{{ name }}",
|
|
90
|
+
model=load_model(),
|
|
91
|
+
session_manager=get_memory_session_manager("default-session", "default-user"),
|
|
92
|
+
system_prompt=SYSTEM_PROMPT,
|
|
93
|
+
tools=tools,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
# serve_a2a binds 0.0.0.0:9000 in the container (the AgentCore A2A service
|
|
97
|
+
# contract) and publishes the agent card at /.well-known/agent-card.json. The
|
|
98
|
+
# card is derived by introspecting the executor's agent.
|
|
99
|
+
if __name__ == "__main__":
|
|
100
|
+
serve_a2a(StrandsA2AExecutor(agent))
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import uuid
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from bedrock_agentcore.memory.integrations.strands.config import AgentCoreMemoryConfig, RetrievalConfig
|
|
6
|
+
from bedrock_agentcore.memory.integrations.strands.session_manager import AgentCoreMemorySessionManager
|
|
7
|
+
|
|
8
|
+
MEMORY_ID = os.getenv("{{memoryEnvVarName}}")
|
|
9
|
+
REGION = os.getenv("AWS_REGION")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def get_memory_session_manager(
|
|
13
|
+
session_id: Optional[str], actor_id: str
|
|
14
|
+
) -> Optional[AgentCoreMemorySessionManager]:
|
|
15
|
+
if not MEMORY_ID:
|
|
16
|
+
return None
|
|
17
|
+
|
|
18
|
+
session_id = session_id or uuid.uuid4().hex
|
|
19
|
+
|
|
20
|
+
retrieval_config = {
|
|
21
|
+
f"/users/{actor_id}/facts": RetrievalConfig(top_k=3, relevance_score=0.5),
|
|
22
|
+
f"/users/{actor_id}/preferences": RetrievalConfig(top_k=3, relevance_score=0.5),
|
|
23
|
+
f"/episodes/{actor_id}/{session_id}": RetrievalConfig(top_k=5, relevance_score=0.5),
|
|
24
|
+
f"/summaries/{actor_id}": RetrievalConfig(top_k=3, relevance_score=0.5),
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return AgentCoreMemorySessionManager(
|
|
28
|
+
AgentCoreMemoryConfig(
|
|
29
|
+
memory_id=MEMORY_ID,
|
|
30
|
+
session_id=session_id,
|
|
31
|
+
actor_id=actor_id,
|
|
32
|
+
retrieval_config=retrieval_config,
|
|
33
|
+
),
|
|
34
|
+
REGION,
|
|
35
|
+
)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling ~= 1.27.0"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "{{ name }}"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "AgentCore A2A Agent using Strands SDK"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
dependencies = [
|
|
12
|
+
"a2a-sdk[all] ~= 0.3.0",
|
|
13
|
+
"aws-opentelemetry-distro ~= 0.17.0",
|
|
14
|
+
"bedrock-agentcore[a2a] ~= 1.9.1",
|
|
15
|
+
"botocore[crt] ~= 1.43.0",
|
|
16
|
+
"strands-agents ~= 1.15.0",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
[tool.hatch.build.targets.wheel]
|
|
20
|
+
packages = ["."]
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# agent-python-langchain
|
|
2
|
+
|
|
3
|
+
A LangChain agent on AgentCore Runtime, calling Claude through Amazon Bedrock.
|
|
4
|
+
The agent is built with `create_agent`, keeps conversation history per Runtime
|
|
5
|
+
session, and streams its response.
|
|
6
|
+
|
|
7
|
+
## What's here
|
|
8
|
+
|
|
9
|
+
- `main.py`: the agent. A `BedrockAgentCoreApp` wraps an async entrypoint
|
|
10
|
+
that reads `prompt` from the payload, runs the agent, and streams each model
|
|
11
|
+
chunk back as a JSON event of content blocks. An `InMemorySaver` checkpointer
|
|
12
|
+
keyed on the Runtime session id carries history between turns.
|
|
13
|
+
- `model/load.py`: creates the Bedrock chat model with `init_chat_model`.
|
|
14
|
+
- `pyproject.toml`: Python dependencies, managed with
|
|
15
|
+
[uv](https://docs.astral.sh/uv/). `agentcore project create` has already run
|
|
16
|
+
`uv sync` for you (unless you passed `--skip-install`), so `.venv/` is ready.
|
|
17
|
+
|
|
18
|
+
## Develop
|
|
19
|
+
|
|
20
|
+
Run the agent locally from the project root:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
agentcore project dev
|
|
24
|
+
agentcore project invoke runtime --local --payload '{"prompt":"What is 2 plus 3?"}'
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Environment variables for local development go in `agentcore/.env.local`
|
|
28
|
+
(gitignored).
|
|
29
|
+
|
|
30
|
+
## Deploy
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
agentcore project deploy
|
|
34
|
+
agentcore project invoke runtime --payload '{"prompt":"Hello!"}'
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Traces are collected automatically: AgentCore Runtime starts the agent under
|
|
38
|
+
`opentelemetry-instrument`, which picks up `opentelemetry-instrumentation-langchain`
|
|
39
|
+
from the dependencies.
|
|
40
|
+
|
|
41
|
+
## Extending
|
|
42
|
+
|
|
43
|
+
Everything hangs off the `create_agent` call in `main.py`.
|
|
44
|
+
|
|
45
|
+
- **Tools.** Add a function decorated with `@tool` and append it to `tools`.
|
|
46
|
+
- **Middleware.** Hook the agent loop with `langchain.agents.middleware`, for
|
|
47
|
+
example a `@before_model` function passed as `middleware=[...]`.
|
|
48
|
+
- **Durable memory.** Replace `InMemorySaver()` with `AgentCoreMemorySaver`
|
|
49
|
+
from `langgraph-checkpoint-aws` and add `actor_id` next to `thread_id` in the
|
|
50
|
+
`configurable` config to persist history in AgentCore Memory.
|
|
51
|
+
- **Structured output.** Pass a Pydantic model as `response_format=` and read
|
|
52
|
+
`structured_response` from the final state.
|
|
53
|
+
|
|
54
|
+
See the [LangChain agents documentation](https://docs.langchain.com/oss/python/langchain/agents)
|
|
55
|
+
for the full `create_agent` surface.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
from langchain.agents import create_agent
|
|
2
|
+
from langchain.tools import tool
|
|
3
|
+
from langchain_core.messages import AIMessageChunk
|
|
4
|
+
from langgraph.checkpoint.memory import InMemorySaver
|
|
5
|
+
from bedrock_agentcore.runtime import BedrockAgentCoreApp
|
|
6
|
+
from model.load import load_model
|
|
7
|
+
|
|
8
|
+
app = BedrockAgentCoreApp()
|
|
9
|
+
|
|
10
|
+
SYSTEM_PROMPT = "You are a helpful assistant. Use tools when appropriate."
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@tool
|
|
14
|
+
def add_numbers(a: int, b: int) -> int:
|
|
15
|
+
"""Return the sum of two numbers"""
|
|
16
|
+
return a + b
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
tools = [add_numbers]
|
|
20
|
+
|
|
21
|
+
agent = create_agent(
|
|
22
|
+
model=load_model(),
|
|
23
|
+
tools=tools,
|
|
24
|
+
system_prompt=SYSTEM_PROMPT,
|
|
25
|
+
checkpointer=InMemorySaver(),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@app.entrypoint
|
|
30
|
+
async def invoke(payload, context):
|
|
31
|
+
prompt = payload.get("prompt") if isinstance(payload, dict) else None
|
|
32
|
+
if not isinstance(prompt, str) or not prompt:
|
|
33
|
+
yield {"error": "payload must be a JSON object with a non-empty string 'prompt'"}
|
|
34
|
+
return
|
|
35
|
+
|
|
36
|
+
session_id = context.session_id or "default-session"
|
|
37
|
+
config = {"configurable": {"thread_id": session_id}}
|
|
38
|
+
|
|
39
|
+
async for event in agent.astream(
|
|
40
|
+
{"messages": [{"role": "user", "content": prompt}]},
|
|
41
|
+
config,
|
|
42
|
+
stream_mode="messages",
|
|
43
|
+
version="v2",
|
|
44
|
+
):
|
|
45
|
+
message, metadata = event["data"]
|
|
46
|
+
if not isinstance(message, AIMessageChunk):
|
|
47
|
+
continue
|
|
48
|
+
blocks = message.content_blocks
|
|
49
|
+
if blocks:
|
|
50
|
+
yield {"node": metadata["langgraph_node"], "content": blocks}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
if __name__ == "__main__":
|
|
54
|
+
app.run()
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from langchain.chat_models import init_chat_model
|
|
2
|
+
from langchain_core.language_models import BaseChatModel
|
|
3
|
+
|
|
4
|
+
MODEL_ID = "global.anthropic.claude-sonnet-4-5-20250929-v1:0"
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def load_model() -> BaseChatModel:
|
|
8
|
+
"""Get a Bedrock chat model using IAM credentials."""
|
|
9
|
+
return init_chat_model(MODEL_ID, model_provider="bedrock_converse")
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling ~= 1.27.0"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "{{ name }}"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "AgentCore Runtime Application using LangChain"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
dependencies = [
|
|
12
|
+
"aws-opentelemetry-distro ~= 0.19.0",
|
|
13
|
+
"bedrock-agentcore ~= 1.22.0",
|
|
14
|
+
"langchain ~= 1.4.0",
|
|
15
|
+
"langchain-aws ~= 1.7.5",
|
|
16
|
+
"langgraph ~= 1.2.11",
|
|
17
|
+
"opentelemetry-instrumentation-langchain ~= 0.62.3",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
[tool.hatch.build.targets.wheel]
|
|
21
|
+
packages = ["."]
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# agent-python-minimal
|
|
2
|
+
|
|
3
|
+
A minimal AgentCore Runtime HTTP agent with no agent framework. Its
|
|
4
|
+
`@app.entrypoint` returns a fixed `Hello, world!` message for every
|
|
5
|
+
invocation — a starting point you own and grow into a real agent.
|
|
6
|
+
|
|
7
|
+
## What's here
|
|
8
|
+
|
|
9
|
+
- `main.py` — the agent. A `BedrockAgentCoreApp` wraps the entrypoint that
|
|
10
|
+
receives each invocation payload and returns the response.
|
|
11
|
+
- `pyproject.toml` — Python dependencies, managed with
|
|
12
|
+
[uv](https://docs.astral.sh/uv/). `agentcore project create` has already run
|
|
13
|
+
`uv sync` for you (unless you passed `--skip-install`), so `.venv/` is ready.
|
|
14
|
+
|
|
15
|
+
## Develop
|
|
16
|
+
|
|
17
|
+
Run the agent locally from the project root:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
agentcore project dev
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Environment variables for local development go in `agentcore/.env.local`
|
|
24
|
+
(gitignored).
|
|
25
|
+
|
|
26
|
+
## Deploy
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
agentcore project deploy
|
|
30
|
+
agentcore project invoke runtime --payload '{"prompt":"Hello!"}'
|
|
31
|
+
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from bedrock_agentcore.runtime import BedrockAgentCoreApp
|
|
2
|
+
|
|
3
|
+
app = BedrockAgentCoreApp()
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@app.entrypoint
|
|
7
|
+
def invoke(payload, context):
|
|
8
|
+
"""Add agent logic here"""
|
|
9
|
+
return {"message": "Hello, world!"}
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
if __name__ == "__main__":
|
|
13
|
+
app.run()
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "agent-python-minimal"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Minimal AgentCore Runtime HTTP agent"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
dependencies = [
|
|
12
|
+
"aws-opentelemetry-distro ~= 0.18.0",
|
|
13
|
+
"bedrock-agentcore ~= 1.9.1",
|
|
14
|
+
"botocore[crt] ~= 1.43.0",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
[tool.hatch.build.targets.wheel]
|
|
18
|
+
packages = ["."]
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
This is a project generated by the AgentCore CLI!
|
|
2
|
+
|
|
3
|
+
# Layout
|
|
4
|
+
|
|
5
|
+
The generated application code lives at the agent root directory. At the root, there is a `.gitignore` file, an
|
|
6
|
+
`agentcore/` folder which represents the configurations and state associated with this project. Other `agentcore`
|
|
7
|
+
commands like `deploy`, `dev`, and `invoke` rely on the configuration stored here.
|
|
8
|
+
|
|
9
|
+
## Agent Root
|
|
10
|
+
|
|
11
|
+
The main entrypoint to your app is defined in `main.py`. Using the AgentCore SDK `@app.entrypoint` decorator, this
|
|
12
|
+
file defines a Starlette ASGI app with the Strands Agent SDK running within.
|
|
13
|
+
|
|
14
|
+
`model/load.py` instantiates the chosen model provider.
|
|
15
|
+
|
|
16
|
+
## Input Validation
|
|
17
|
+
|
|
18
|
+
Validate invocation input before forwarding it to Strands. Keep plain prompts typed as strings. If the app accepts a
|
|
19
|
+
caller-supplied message history, retain `strip_trailing_tool_use()`, which normalizes the history tail before
|
|
20
|
+
invoking the agent.
|
|
21
|
+
|
|
22
|
+
## Environment Variables
|
|
23
|
+
|
|
24
|
+
| Variable | Required | Description |
|
|
25
|
+
| --- | --- | --- |
|
|
26
|
+
{{#if identityProviders.[0]}}| `{{identityProviders.[0].envVarName}}` | Yes | {{modelProvider}} API key (local) or Identity provider name (deployed) |
|
|
27
|
+
{{/if}}| `LOCAL_DEV` | No | Set to `1` to use `.env.local` instead of AgentCore Identity |
|
|
28
|
+
|
|
29
|
+
# Developing locally
|
|
30
|
+
|
|
31
|
+
If installation was successful, a virtual environment is already created with dependencies installed.
|
|
32
|
+
|
|
33
|
+
Activate the environment with `source .venv/bin/activate` on macOS/Linux, `.venv\Scripts\activate.bat` in Windows
|
|
34
|
+
Command Prompt, or `.\.venv\Scripts\activate.ps1` in Windows PowerShell.
|
|
35
|
+
|
|
36
|
+
`agentcore project dev` will start a local server on 0.0.0.0:8080.
|
|
37
|
+
|
|
38
|
+
# Deployment
|
|
39
|
+
|
|
40
|
+
After providing credentials, `agentcore project deploy` will deploy your project into Amazon Bedrock AgentCore.
|
|
41
|
+
|
|
42
|
+
Invoke the deployed Runtime with its native payload:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
agentcore project invoke runtime --payload '{"prompt":"Hello!"}'
|
|
46
|
+
```
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from strands import Agent, tool
|
|
4
|
+
from strands.agent.conversation_manager.null_conversation_manager import NullConversationManager
|
|
5
|
+
from bedrock_agentcore.runtime import BedrockAgentCoreApp
|
|
6
|
+
from model.load import load_model
|
|
7
|
+
from memory.session import get_memory_session_manager
|
|
8
|
+
|
|
9
|
+
app = BedrockAgentCoreApp()
|
|
10
|
+
log = app.logger
|
|
11
|
+
|
|
12
|
+
DEFAULT_SYSTEM_PROMPT = "You are a helpful assistant. Use tools when appropriate."
|
|
13
|
+
|
|
14
|
+
# Define a collection of tools used by the model
|
|
15
|
+
tools = []
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# Define a simple function tool
|
|
19
|
+
@tool
|
|
20
|
+
def add_numbers(a: int, b: int) -> int:
|
|
21
|
+
"""Return the sum of two numbers"""
|
|
22
|
+
return a + b
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
tools.append(add_numbers)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _make_conversation_manager():
|
|
29
|
+
return NullConversationManager()
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def agent_factory():
|
|
33
|
+
cache = {}
|
|
34
|
+
def get_or_create_agent(session_id, user_id):
|
|
35
|
+
key = f"{session_id}/{user_id}"
|
|
36
|
+
if key not in cache:
|
|
37
|
+
cache[key] = Agent(
|
|
38
|
+
model=load_model(),
|
|
39
|
+
session_manager=get_memory_session_manager(session_id, user_id),
|
|
40
|
+
conversation_manager=_make_conversation_manager(),
|
|
41
|
+
system_prompt=DEFAULT_SYSTEM_PROMPT,
|
|
42
|
+
tools=tools,
|
|
43
|
+
)
|
|
44
|
+
return cache[key]
|
|
45
|
+
return get_or_create_agent
|
|
46
|
+
get_or_create_agent = agent_factory()
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def strip_trailing_tool_use(messages: Any) -> list[dict]:
|
|
50
|
+
"""Strip toolUse blocks from the tail until the last message has none."""
|
|
51
|
+
if not isinstance(messages, list):
|
|
52
|
+
raise ValueError("messages must be a list")
|
|
53
|
+
|
|
54
|
+
messages = list(messages)
|
|
55
|
+
while messages:
|
|
56
|
+
last = messages[-1]
|
|
57
|
+
if not isinstance(last, dict):
|
|
58
|
+
raise ValueError("each message must be an object")
|
|
59
|
+
original_content = last.get("content", [])
|
|
60
|
+
if not isinstance(original_content, list) or not all(isinstance(block, dict) for block in original_content):
|
|
61
|
+
raise ValueError("each message content value must be a list of content blocks")
|
|
62
|
+
|
|
63
|
+
content = [block for block in original_content if "toolUse" not in block]
|
|
64
|
+
if len(content) == len(original_content):
|
|
65
|
+
break
|
|
66
|
+
if content:
|
|
67
|
+
messages[-1] = {**last, "content": content}
|
|
68
|
+
break
|
|
69
|
+
messages.pop()
|
|
70
|
+
|
|
71
|
+
return messages
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _extract_prompt(payload: dict):
|
|
75
|
+
"""Accept a caller-supplied message history or a plain prompt string."""
|
|
76
|
+
if not isinstance(payload, dict):
|
|
77
|
+
raise ValueError("payload must be a JSON object")
|
|
78
|
+
if "messages" in payload:
|
|
79
|
+
return strip_trailing_tool_use(payload["messages"])
|
|
80
|
+
prompt = payload.get("prompt", "")
|
|
81
|
+
if not isinstance(prompt, str):
|
|
82
|
+
raise ValueError("prompt must be a string")
|
|
83
|
+
return prompt
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@app.entrypoint
|
|
87
|
+
async def invoke(payload, context):
|
|
88
|
+
log.info("Invoking Agent.....")
|
|
89
|
+
|
|
90
|
+
session_id = getattr(context, "session_id", "default-session")
|
|
91
|
+
user_id = getattr(context, "user_id", "default-user")
|
|
92
|
+
agent = get_or_create_agent(session_id, user_id)
|
|
93
|
+
|
|
94
|
+
prompt = _extract_prompt(payload)
|
|
95
|
+
|
|
96
|
+
async for event in agent.stream_async(prompt):
|
|
97
|
+
if not isinstance(event, dict) or "event" not in event:
|
|
98
|
+
continue
|
|
99
|
+
cbs = event["event"].get("contentBlockStart")
|
|
100
|
+
if cbs is not None and not cbs.get("start"):
|
|
101
|
+
continue
|
|
102
|
+
yield event
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
if __name__ == "__main__":
|
|
106
|
+
app.run()
|
|
File without changes
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import uuid
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from bedrock_agentcore.memory.integrations.strands.config import AgentCoreMemoryConfig, RetrievalConfig
|
|
6
|
+
from bedrock_agentcore.memory.integrations.strands.session_manager import AgentCoreMemorySessionManager
|
|
7
|
+
|
|
8
|
+
MEMORY_ID = os.getenv("{{memoryEnvVarName}}")
|
|
9
|
+
REGION = os.getenv("AWS_REGION")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def get_memory_session_manager(
|
|
13
|
+
session_id: Optional[str], actor_id: str
|
|
14
|
+
) -> Optional[AgentCoreMemorySessionManager]:
|
|
15
|
+
if not MEMORY_ID:
|
|
16
|
+
return None
|
|
17
|
+
|
|
18
|
+
session_id = session_id or uuid.uuid4().hex
|
|
19
|
+
|
|
20
|
+
retrieval_config = {
|
|
21
|
+
f"/users/{actor_id}/facts": RetrievalConfig(top_k=3, relevance_score=0.5),
|
|
22
|
+
f"/users/{actor_id}/preferences": RetrievalConfig(top_k=3, relevance_score=0.5),
|
|
23
|
+
f"/episodes/{actor_id}/{session_id}": RetrievalConfig(top_k=5, relevance_score=0.5),
|
|
24
|
+
f"/summaries/{actor_id}": RetrievalConfig(top_k=3, relevance_score=0.5),
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return AgentCoreMemorySessionManager(
|
|
28
|
+
AgentCoreMemoryConfig(
|
|
29
|
+
memory_id=MEMORY_ID,
|
|
30
|
+
session_id=session_id,
|
|
31
|
+
actor_id=actor_id,
|
|
32
|
+
retrieval_config=retrieval_config,
|
|
33
|
+
),
|
|
34
|
+
REGION,
|
|
35
|
+
)
|