agentcore-cli 0.31.1__py3-none-any.whl
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.
- agentcore/__init__.py +1 -0
- agentcore/agent_inspector/NOTICE +9 -0
- agentcore/agent_inspector/favicon.svg +60 -0
- agentcore/agent_inspector/index.css +1 -0
- agentcore/agent_inspector/index.html +14 -0
- agentcore/agent_inspector/index.js +289 -0
- agentcore/assets/AGENTS.md +60 -0
- agentcore/assets/README.md +108 -0
- agentcore/assets/agents/AGENTS.md +218 -0
- agentcore/assets/cdk/.prettierrc +8 -0
- agentcore/assets/cdk/README.md +26 -0
- agentcore/assets/cdk/bin/cdk.ts +216 -0
- agentcore/assets/cdk/cdk.json +88 -0
- agentcore/assets/cdk/gitignore.template +9 -0
- agentcore/assets/cdk/jest.config.js +9 -0
- agentcore/assets/cdk/lib/cdk-stack.ts +291 -0
- agentcore/assets/cdk/npmignore.template +6 -0
- agentcore/assets/cdk/package.json +30 -0
- agentcore/assets/cdk/test/cdk.test.ts +31 -0
- agentcore/assets/cdk/tsconfig.json +28 -0
- agentcore/assets/container/python/Dockerfile +47 -0
- agentcore/assets/container/python/dockerignore.template +27 -0
- agentcore/assets/container/typescript/Dockerfile +25 -0
- agentcore/assets/container/typescript/dockerignore.template +24 -0
- agentcore/assets/datasets/predefined-v1.jsonl +3 -0
- agentcore/assets/datasets/simulated-v1.jsonl +3 -0
- agentcore/assets/evaluators/autoevals-lambda/execution-role-policy.json +15 -0
- agentcore/assets/evaluators/autoevals-lambda/lambda_function.py +37 -0
- agentcore/assets/evaluators/autoevals-lambda/pyproject.toml +22 -0
- agentcore/assets/evaluators/deepeval-lambda/execution-role-policy.json +15 -0
- agentcore/assets/evaluators/deepeval-lambda/lambda_function.py +29 -0
- agentcore/assets/evaluators/deepeval-lambda/pyproject.toml +19 -0
- agentcore/assets/evaluators/python-lambda/execution-role-policy.json +10 -0
- agentcore/assets/evaluators/python-lambda/lambda_function.py +19 -0
- agentcore/assets/evaluators/python-lambda/pyproject.toml +15 -0
- agentcore/assets/harness/invoke.py.template +74 -0
- agentcore/assets/mcp/python/README.md +27 -0
- agentcore/assets/mcp/python/pyproject.toml +22 -0
- agentcore/assets/mcp/python/server.py +117 -0
- agentcore/assets/mcp/python-lambda/README.md +22 -0
- agentcore/assets/mcp/python-lambda/handler.py +144 -0
- agentcore/assets/mcp/python-lambda/pyproject.toml +15 -0
- agentcore/assets/python/a2a/googleadk/base/README.md +22 -0
- agentcore/assets/python/a2a/googleadk/base/gitignore.template +41 -0
- agentcore/assets/python/a2a/googleadk/base/main.py +124 -0
- agentcore/assets/python/a2a/googleadk/base/model/__init__.py +1 -0
- agentcore/assets/python/a2a/googleadk/base/model/load.py +41 -0
- agentcore/assets/python/a2a/googleadk/base/pyproject.toml +22 -0
- agentcore/assets/python/a2a/langchain_langgraph/base/README.md +22 -0
- agentcore/assets/python/a2a/langchain_langgraph/base/gitignore.template +41 -0
- agentcore/assets/python/a2a/langchain_langgraph/base/main.py +144 -0
- agentcore/assets/python/a2a/langchain_langgraph/base/model/__init__.py +1 -0
- agentcore/assets/python/a2a/langchain_langgraph/base/model/load.py +123 -0
- agentcore/assets/python/a2a/langchain_langgraph/base/pyproject.toml +26 -0
- agentcore/assets/python/a2a/strands/base/README.md +22 -0
- agentcore/assets/python/a2a/strands/base/gitignore.template +41 -0
- agentcore/assets/python/a2a/strands/base/main.py +113 -0
- agentcore/assets/python/a2a/strands/base/model/__init__.py +1 -0
- agentcore/assets/python/a2a/strands/base/model/load.py +123 -0
- agentcore/assets/python/a2a/strands/base/pyproject.toml +23 -0
- agentcore/assets/python/a2a/strands/capabilities/memory/__init__.py +1 -0
- agentcore/assets/python/a2a/strands/capabilities/memory/session.py +46 -0
- agentcore/assets/python/agui/googleadk/base/README.md +30 -0
- agentcore/assets/python/agui/googleadk/base/gitignore.template +41 -0
- agentcore/assets/python/agui/googleadk/base/main.py +91 -0
- agentcore/assets/python/agui/googleadk/base/model/__init__.py +1 -0
- agentcore/assets/python/agui/googleadk/base/model/load.py +41 -0
- agentcore/assets/python/agui/googleadk/base/pyproject.toml +25 -0
- agentcore/assets/python/agui/langchain_langgraph/base/README.md +22 -0
- agentcore/assets/python/agui/langchain_langgraph/base/gitignore.template +41 -0
- agentcore/assets/python/agui/langchain_langgraph/base/main.py +130 -0
- agentcore/assets/python/agui/langchain_langgraph/base/model/__init__.py +1 -0
- agentcore/assets/python/agui/langchain_langgraph/base/model/load.py +123 -0
- agentcore/assets/python/agui/langchain_langgraph/base/pyproject.toml +31 -0
- agentcore/assets/python/agui/strands/base/README.md +22 -0
- agentcore/assets/python/agui/strands/base/gitignore.template +41 -0
- agentcore/assets/python/agui/strands/base/main.py +105 -0
- agentcore/assets/python/agui/strands/base/model/__init__.py +1 -0
- agentcore/assets/python/agui/strands/base/model/load.py +123 -0
- agentcore/assets/python/agui/strands/base/pyproject.toml +27 -0
- agentcore/assets/python/agui/strands/capabilities/memory/__init__.py +1 -0
- agentcore/assets/python/agui/strands/capabilities/memory/session.py +46 -0
- agentcore/assets/python/http/autogen/base/README.md +45 -0
- agentcore/assets/python/http/autogen/base/gitignore.template +41 -0
- agentcore/assets/python/http/autogen/base/main.py +145 -0
- agentcore/assets/python/http/autogen/base/mcp_client/__init__.py +1 -0
- agentcore/assets/python/http/autogen/base/mcp_client/client.py +28 -0
- agentcore/assets/python/http/autogen/base/model/__init__.py +1 -0
- agentcore/assets/python/http/autogen/base/model/load.py +136 -0
- agentcore/assets/python/http/autogen/base/pyproject.toml +34 -0
- agentcore/assets/python/http/bma/base/Dockerfile +41 -0
- agentcore/assets/python/http/bma/base/README.md +178 -0
- agentcore/assets/python/http/bma/base/client.py +200 -0
- agentcore/assets/python/http/bma/base/lifecycle/server.py +641 -0
- agentcore/assets/python/http/bma/base/otel/collector.yaml +69 -0
- agentcore/assets/python/http/bma/base/plugins/acr-report/.codex-plugin/plugin.json +6 -0
- agentcore/assets/python/http/bma/base/plugins/acr-report/skills/acr-report/SKILL.md +16 -0
- agentcore/assets/python/http/bma/base/policies/bma-acr-policy.json +11 -0
- agentcore/assets/python/http/bma/base/policies/bma-session-policy.json +35 -0
- agentcore/assets/python/http/bma/base/policies/bma-session-trust.json +20 -0
- agentcore/assets/python/http/bma/base/pyproject.toml +21 -0
- agentcore/assets/python/http/googleadk/base/README.md +45 -0
- agentcore/assets/python/http/googleadk/base/gitignore.template +41 -0
- agentcore/assets/python/http/googleadk/base/main.py +207 -0
- agentcore/assets/python/http/googleadk/base/mcp_client/__init__.py +1 -0
- agentcore/assets/python/http/googleadk/base/mcp_client/client.py +75 -0
- agentcore/assets/python/http/googleadk/base/model/__init__.py +1 -0
- agentcore/assets/python/http/googleadk/base/model/load.py +41 -0
- agentcore/assets/python/http/googleadk/base/pyproject.toml +24 -0
- agentcore/assets/python/http/langchain_langgraph/base/README.md +45 -0
- agentcore/assets/python/http/langchain_langgraph/base/gitignore.template +41 -0
- agentcore/assets/python/http/langchain_langgraph/base/main.py +227 -0
- agentcore/assets/python/http/langchain_langgraph/base/mcp_client/__init__.py +1 -0
- agentcore/assets/python/http/langchain_langgraph/base/mcp_client/client.py +79 -0
- agentcore/assets/python/http/langchain_langgraph/base/model/__init__.py +1 -0
- agentcore/assets/python/http/langchain_langgraph/base/model/load.py +123 -0
- agentcore/assets/python/http/langchain_langgraph/base/pyproject.toml +38 -0
- agentcore/assets/python/http/openaiagents/base/README.md +45 -0
- agentcore/assets/python/http/openaiagents/base/gitignore.template +41 -0
- agentcore/assets/python/http/openaiagents/base/main.py +200 -0
- agentcore/assets/python/http/openaiagents/base/mcp_client/__init__.py +1 -0
- agentcore/assets/python/http/openaiagents/base/mcp_client/client.py +74 -0
- agentcore/assets/python/http/openaiagents/base/model/__init__.py +1 -0
- agentcore/assets/python/http/openaiagents/base/model/load.py +37 -0
- agentcore/assets/python/http/openaiagents/base/pyproject.toml +21 -0
- agentcore/assets/python/http/strands/base/README.md +46 -0
- agentcore/assets/python/http/strands/base/gitignore.template +41 -0
- agentcore/assets/python/http/strands/base/main.py +714 -0
- agentcore/assets/python/http/strands/base/mcp_client/__init__.py +1 -0
- agentcore/assets/python/http/strands/base/mcp_client/client.py +116 -0
- agentcore/assets/python/http/strands/base/model/__init__.py +1 -0
- agentcore/assets/python/http/strands/base/model/load.py +239 -0
- agentcore/assets/python/http/strands/base/model/mantle_compat.py +21 -0
- agentcore/assets/python/http/strands/base/pyproject.toml +31 -0
- agentcore/assets/python/http/strands/base/skills/fetcher.py +279 -0
- agentcore/assets/python/http/strands/capabilities/execution-limits/hooks/execution_limits.py +54 -0
- agentcore/assets/python/http/strands/capabilities/memory/__init__.py +1 -0
- agentcore/assets/python/http/strands/capabilities/memory/session.py +47 -0
- agentcore/assets/python/http/strands/capabilities/payments/__init__.py +4 -0
- agentcore/assets/python/http/strands/capabilities/payments/payments.py +142 -0
- agentcore/assets/python/mcp/standalone/base/README.md +36 -0
- agentcore/assets/python/mcp/standalone/base/gitignore.template +41 -0
- agentcore/assets/python/mcp/standalone/base/main.py +83 -0
- agentcore/assets/python/mcp/standalone/base/pyproject.toml +16 -0
- agentcore/assets/typescript/.gitkeep +0 -0
- agentcore/assets/typescript/http/strands/base/README.md +42 -0
- agentcore/assets/typescript/http/strands/base/gitignore.template +22 -0
- agentcore/assets/typescript/http/strands/base/main.ts +149 -0
- agentcore/assets/typescript/http/strands/base/mcp_client/client.ts +11 -0
- agentcore/assets/typescript/http/strands/base/model/load.ts +102 -0
- agentcore/assets/typescript/http/strands/base/package.json +38 -0
- agentcore/assets/typescript/http/strands/base/tsconfig.json +19 -0
- agentcore/assets/typescript/http/strands/capabilities/memory/memory.ts +52 -0
- agentcore/assets/typescript/http/vercelai/base/README.md +42 -0
- agentcore/assets/typescript/http/vercelai/base/gitignore.template +22 -0
- agentcore/assets/typescript/http/vercelai/base/main.ts +70 -0
- agentcore/assets/typescript/http/vercelai/base/model/load.ts +121 -0
- agentcore/assets/typescript/http/vercelai/base/package.json +35 -0
- agentcore/assets/typescript/http/vercelai/base/tsconfig.json +19 -0
- agentcore/aws/__init__.py +263 -0
- agentcore/aws/_aws_errors.py +72 -0
- agentcore/aws/_http.py +176 -0
- agentcore/aws/_util.py +37 -0
- agentcore/aws/account.py +165 -0
- agentcore/aws/agentcore.py +971 -0
- agentcore/aws/agentcore_ab_tests.py +230 -0
- agentcore/aws/agentcore_batch_evaluation.py +227 -0
- agentcore/aws/agentcore_config_bundles.py +220 -0
- agentcore/aws/agentcore_control.py +994 -0
- agentcore/aws/agentcore_datasets.py +222 -0
- agentcore/aws/agentcore_harness.py +330 -0
- agentcore/aws/agentcore_payments.py +430 -0
- agentcore/aws/agentcore_recommendation.py +140 -0
- agentcore/aws/agui_parser.py +131 -0
- agentcore/aws/agui_types.py +342 -0
- agentcore/aws/api_client.py +87 -0
- agentcore/aws/arn.py +18 -0
- agentcore/aws/aws_context.py +23 -0
- agentcore/aws/bedrock.py +44 -0
- agentcore/aws/bedrock_agent.py +129 -0
- agentcore/aws/bedrock_import.py +252 -0
- agentcore/aws/bedrock_import_types.py +111 -0
- agentcore/aws/cloudwatch.py +136 -0
- agentcore/aws/connect_shell.py +266 -0
- agentcore/aws/iam.py +41 -0
- agentcore/aws/partition.py +58 -0
- agentcore/aws/policy_generation.py +116 -0
- agentcore/aws/region.py +54 -0
- agentcore/aws/retry.py +27 -0
- agentcore/aws/shell_framer.py +136 -0
- agentcore/aws/stage_endpoint.py +39 -0
- agentcore/aws/target_region.py +54 -0
- agentcore/aws/transaction_search.py +97 -0
- agentcore/cdk/__init__.py +10 -0
- agentcore/cdk/constants.py +13 -0
- agentcore/cdk/local_cdk_project.py +48 -0
- agentcore/cdk/toolkit.py +706 -0
- agentcore/cli/__init__.py +0 -0
- agentcore/cli/commands/__init__.py +0 -0
- agentcore/cli/commands/_jobs_common.py +39 -0
- agentcore/cli/commands/_run_wizards.py +639 -0
- agentcore/cli/commands/add/__init__.py +37 -0
- agentcore/cli/commands/add/_commander.py +52 -0
- agentcore/cli/commands/add/_common.py +47 -0
- agentcore/cli/commands/add/agent_wizard.py +528 -0
- agentcore/cli/commands/add/auth_options.py +154 -0
- agentcore/cli/commands/add/skill_action.py +105 -0
- agentcore/cli/commands/add/skill_command.py +87 -0
- agentcore/cli/commands/add/tool_action.py +160 -0
- agentcore/cli/commands/add/tool_command.py +117 -0
- agentcore/cli/commands/add/validate.py +333 -0
- agentcore/cli/commands/capacity_provider/__init__.py +86 -0
- agentcore/cli/commands/capacity_provider/action.py +114 -0
- agentcore/cli/commands/capacity_provider/constants.py +22 -0
- agentcore/cli/commands/config.py +91 -0
- agentcore/cli/commands/config_bundle.py +251 -0
- agentcore/cli/commands/create/__init__.py +643 -0
- agentcore/cli/commands/create/action.py +406 -0
- agentcore/cli/commands/create/dependencies.py +91 -0
- agentcore/cli/commands/create/harness_validate.py +82 -0
- agentcore/cli/commands/create/validate.py +195 -0
- agentcore/cli/commands/create/wizard.py +127 -0
- agentcore/cli/commands/dataset.py +119 -0
- agentcore/cli/commands/deploy/__init__.py +31 -0
- agentcore/cli/commands/deploy/_guards.py +25 -0
- agentcore/cli/commands/deploy/actions.py +840 -0
- agentcore/cli/commands/deploy/command.py +349 -0
- agentcore/cli/commands/deploy/progress.py +115 -0
- agentcore/cli/commands/deploy/types.py +68 -0
- agentcore/cli/commands/deploy/utils.py +43 -0
- agentcore/cli/commands/deploy/validate.py +21 -0
- agentcore/cli/commands/dev/__init__.py +5 -0
- agentcore/cli/commands/dev/_deps.py +50 -0
- agentcore/cli/commands/dev/browser_mode.py +270 -0
- agentcore/cli/commands/dev/command.py +450 -0
- agentcore/cli/commands/dev/terminal_mode.py +379 -0
- agentcore/cli/commands/exec/__init__.py +29 -0
- agentcore/cli/commands/exec/action.py +442 -0
- agentcore/cli/commands/exec/command.py +206 -0
- agentcore/cli/commands/exec/types.py +35 -0
- agentcore/cli/commands/export/__init__.py +114 -0
- agentcore/cli/commands/export/constants.py +21 -0
- agentcore/cli/commands/export/fetch_harness_spec.py +234 -0
- agentcore/cli/commands/export/harness_action.py +385 -0
- agentcore/cli/commands/export/harness_mapper.py +868 -0
- agentcore/cli/commands/export/harness_resolver.py +95 -0
- agentcore/cli/commands/export/types.py +90 -0
- agentcore/cli/commands/export/wizard.py +97 -0
- agentcore/cli/commands/feedback/__init__.py +69 -0
- agentcore/cli/commands/feedback/action.py +30 -0
- agentcore/cli/commands/feedback/consent_prompt.py +35 -0
- agentcore/cli/commands/feedback/wizard.py +49 -0
- agentcore/cli/commands/fetch/__init__.py +69 -0
- agentcore/cli/commands/fetch/action.py +62 -0
- agentcore/cli/commands/help.py +65 -0
- agentcore/cli/commands/import_/__init__.py +167 -0
- agentcore/cli/commands/import_/_js.py +72 -0
- agentcore/cli/commands/import_/actions.py +457 -0
- agentcore/cli/commands/import_/constants.py +45 -0
- agentcore/cli/commands/import_/import_evaluator.py +140 -0
- agentcore/cli/commands/import_/import_gateway.py +520 -0
- agentcore/cli/commands/import_/import_memory.py +128 -0
- agentcore/cli/commands/import_/import_online_eval.py +165 -0
- agentcore/cli/commands/import_/import_pipeline.py +145 -0
- agentcore/cli/commands/import_/import_runtime.py +214 -0
- agentcore/cli/commands/import_/import_utils.py +410 -0
- agentcore/cli/commands/import_/phase1_update.py +110 -0
- agentcore/cli/commands/import_/phase2_import.py +206 -0
- agentcore/cli/commands/import_/resource_import.py +228 -0
- agentcore/cli/commands/import_/template_utils.py +148 -0
- agentcore/cli/commands/import_/types.py +150 -0
- agentcore/cli/commands/import_/yaml_parser.py +265 -0
- agentcore/cli/commands/init.py +196 -0
- agentcore/cli/commands/invoke/__init__.py +32 -0
- agentcore/cli/commands/invoke/_deps.py +73 -0
- agentcore/cli/commands/invoke/action.py +840 -0
- agentcore/cli/commands/invoke/command.py +490 -0
- agentcore/cli/commands/invoke/constants.py +40 -0
- agentcore/cli/commands/invoke/guards.py +23 -0
- agentcore/cli/commands/invoke/interactive.py +604 -0
- agentcore/cli/commands/invoke/resolve.py +149 -0
- agentcore/cli/commands/invoke/resolve_prompt.py +60 -0
- agentcore/cli/commands/invoke/types.py +61 -0
- agentcore/cli/commands/invoke/validate.py +33 -0
- agentcore/cli/commands/job_actions.py +239 -0
- agentcore/cli/commands/job_history.py +380 -0
- agentcore/cli/commands/logs/__init__.py +53 -0
- agentcore/cli/commands/logs/action.py +159 -0
- agentcore/cli/commands/logs/filter_pattern.py +17 -0
- agentcore/cli/commands/logs/guards.py +51 -0
- agentcore/cli/commands/logs_evals.py +42 -0
- agentcore/cli/commands/package.py +118 -0
- agentcore/cli/commands/remove/__init__.py +172 -0
- agentcore/cli/commands/remove/skill_command.py +131 -0
- agentcore/cli/commands/remove/tool_command.py +59 -0
- agentcore/cli/commands/run.py +808 -0
- agentcore/cli/commands/run_ingest.py +97 -0
- agentcore/cli/commands/shared/__init__.py +0 -0
- agentcore/cli/commands/shared/arn_utils.py +9 -0
- agentcore/cli/commands/shared/filesystem_utils.py +421 -0
- agentcore/cli/commands/shared/header_utils.py +87 -0
- agentcore/cli/commands/shared/indexed_key_parser.py +76 -0
- agentcore/cli/commands/shared/lifecycle_utils.py +72 -0
- agentcore/cli/commands/shared/region_utils.py +20 -0
- agentcore/cli/commands/shared/vpc_utils.py +99 -0
- agentcore/cli/commands/status/__init__.py +30 -0
- agentcore/cli/commands/status/_guards.py +25 -0
- agentcore/cli/commands/status/action.py +741 -0
- agentcore/cli/commands/status/command.py +321 -0
- agentcore/cli/commands/status/constants.py +36 -0
- agentcore/cli/commands/status/format_knowledge_base.py +111 -0
- agentcore/cli/commands/telemetry.py +79 -0
- agentcore/cli/commands/traces/__init__.py +155 -0
- agentcore/cli/commands/traces/action.py +123 -0
- agentcore/cli/commands/update/__init__.py +63 -0
- agentcore/cli/commands/update/action.py +164 -0
- agentcore/cli/commands/validate.py +165 -0
- agentcore/cli/constants.py +96 -0
- agentcore/cli/errors.py +118 -0
- agentcore/cli/external_requirements/__init__.py +67 -0
- agentcore/cli/external_requirements/checks.py +280 -0
- agentcore/cli/external_requirements/detect.py +55 -0
- agentcore/cli/external_requirements/versions.py +57 -0
- agentcore/cli/groups.py +23 -0
- agentcore/cli/interactive.py +85 -0
- agentcore/cli/main.py +137 -0
- agentcore/cli/naming.py +11 -0
- agentcore/cli/notices.py +42 -0
- agentcore/cli/project.py +34 -0
- agentcore/cli/run_command.py +27 -0
- agentcore/cli/tree.py +135 -0
- agentcore/cli/update_notifier.py +123 -0
- agentcore/cli/variadic.py +50 -0
- agentcore/cloudformation/__init__.py +84 -0
- agentcore/cloudformation/bootstrap.py +64 -0
- agentcore/cloudformation/logical_ids.py +37 -0
- agentcore/cloudformation/outputs.py +566 -0
- agentcore/cloudformation/stack_discovery.py +75 -0
- agentcore/cloudformation/stack_events.py +107 -0
- agentcore/cloudformation/stack_status.py +98 -0
- agentcore/cloudformation/types.py +44 -0
- agentcore/lib/__init__.py +68 -0
- agentcore/lib/constants.py +77 -0
- agentcore/lib/dependency_management/__init__.py +23 -0
- agentcore/lib/dependency_management/messages.py +92 -0
- agentcore/lib/dependency_management/plan.py +98 -0
- agentcore/lib/dependency_management/semver.py +137 -0
- agentcore/lib/dependency_management/sync.py +139 -0
- agentcore/lib/dependency_management/types.py +56 -0
- agentcore/lib/errors/__init__.py +5 -0
- agentcore/lib/errors/types.py +352 -0
- agentcore/lib/errors/validation.py +121 -0
- agentcore/lib/packaging/__init__.py +81 -0
- agentcore/lib/packaging/build_args.py +23 -0
- agentcore/lib/packaging/build_context.py +26 -0
- agentcore/lib/packaging/build_context_dockerignore.py +45 -0
- agentcore/lib/packaging/container.py +95 -0
- agentcore/lib/packaging/helpers.py +289 -0
- agentcore/lib/packaging/node.py +153 -0
- agentcore/lib/packaging/python.py +135 -0
- agentcore/lib/packaging/types.py +69 -0
- agentcore/lib/packaging/uv.py +45 -0
- agentcore/lib/result.py +104 -0
- agentcore/lib/schemas/__init__.py +1 -0
- agentcore/lib/schemas/io/__init__.py +27 -0
- agentcore/lib/schemas/io/config_io.py +458 -0
- agentcore/lib/schemas/io/global_config.py +239 -0
- agentcore/lib/schemas/io/path_resolver.py +132 -0
- agentcore/lib/secrets/__init__.py +18 -0
- agentcore/lib/secrets/cipher.py +70 -0
- agentcore/lib/secrets/key_provider.py +163 -0
- agentcore/lib/secrets/sensitive_keys.py +55 -0
- agentcore/lib/time_constants.py +4 -0
- agentcore/lib/utils/__init__.py +47 -0
- agentcore/lib/utils/aws_account.py +15 -0
- agentcore/lib/utils/credentials.py +68 -0
- agentcore/lib/utils/dotenv.py +32 -0
- agentcore/lib/utils/env.py +105 -0
- agentcore/lib/utils/json_format.py +29 -0
- agentcore/lib/utils/json_rpc.py +22 -0
- agentcore/lib/utils/platform.py +33 -0
- agentcore/lib/utils/polling.py +86 -0
- agentcore/lib/utils/subprocess.py +135 -0
- agentcore/lib/utils/time_parser.py +48 -0
- agentcore/lib/utils/validation.py +106 -0
- agentcore/logging/__init__.py +10 -0
- agentcore/logging/_common.py +77 -0
- agentcore/logging/cdk_io_host.py +36 -0
- agentcore/logging/create_logger.py +107 -0
- agentcore/logging/dev_logger.py +63 -0
- agentcore/logging/exec_logger.py +159 -0
- agentcore/logging/invoke_logger.py +154 -0
- agentcore/logging/remove_logger.py +95 -0
- agentcore/operations/__init__.py +0 -0
- agentcore/operations/agent/__init__.py +0 -0
- agentcore/operations/agent/config_bundle_defaults.py +31 -0
- agentcore/operations/agent/generate/__init__.py +28 -0
- agentcore/operations/agent/generate/schema_mapper.py +319 -0
- agentcore/operations/agent/generate/types.py +172 -0
- agentcore/operations/agent/generate/write_agent_to_project.py +67 -0
- agentcore/operations/agent/import_/__init__.py +31 -0
- agentcore/operations/agent/import_/base_translator.py +449 -0
- agentcore/operations/agent/import_/constants.py +23 -0
- agentcore/operations/agent/import_/execute.py +127 -0
- agentcore/operations/agent/import_/langgraph_translator.py +294 -0
- agentcore/operations/agent/import_/pyproject_generator.py +73 -0
- agentcore/operations/agent/import_/strands_translator.py +289 -0
- agentcore/operations/config_bundle/__init__.py +1 -0
- agentcore/operations/config_bundle/bundle_name_variants.py +9 -0
- agentcore/operations/config_bundle/diff_versions.py +52 -0
- agentcore/operations/config_bundle/resolve_bundle.py +65 -0
- agentcore/operations/connectors/__init__.py +3 -0
- agentcore/operations/connectors/translators.py +63 -0
- agentcore/operations/dataset/__init__.py +21 -0
- agentcore/operations/dataset/delete.py +7 -0
- agentcore/operations/dataset/publish.py +16 -0
- agentcore/operations/dataset/pull.py +21 -0
- agentcore/operations/dataset/push.py +201 -0
- agentcore/operations/dataset/resolve_dataset.py +65 -0
- agentcore/operations/dataset/status.py +18 -0
- agentcore/operations/dataset/wait.py +25 -0
- agentcore/operations/deploy/__init__.py +152 -0
- agentcore/operations/deploy/backfill_vpc_id.py +90 -0
- agentcore/operations/deploy/change_detection.py +84 -0
- agentcore/operations/deploy/constants.py +58 -0
- agentcore/operations/deploy/dependency_sync.py +105 -0
- agentcore/operations/deploy/ensure_target.py +30 -0
- agentcore/operations/deploy/gateway_status.py +44 -0
- agentcore/operations/deploy/managed_memory_notice.py +36 -0
- agentcore/operations/deploy/payment_connector_authorization.py +106 -0
- agentcore/operations/deploy/post_deploy_datasets.py +96 -0
- agentcore/operations/deploy/post_deploy_knowledge_bases.py +104 -0
- agentcore/operations/deploy/post_deploy_observability.py +28 -0
- agentcore/operations/deploy/post_deploy_online_evals.py +60 -0
- agentcore/operations/deploy/pre_deploy_identity.py +505 -0
- agentcore/operations/deploy/preflight.py +385 -0
- agentcore/operations/deploy/region_override.py +45 -0
- agentcore/operations/deploy/teardown.py +153 -0
- agentcore/operations/dev/__init__.py +61 -0
- agentcore/operations/dev/_http.py +79 -0
- agentcore/operations/dev/_server.py +165 -0
- agentcore/operations/dev/codezip_dev_server.py +151 -0
- agentcore/operations/dev/config.py +128 -0
- agentcore/operations/dev/constants.py +9 -0
- agentcore/operations/dev/container_dev_server.py +237 -0
- agentcore/operations/dev/container_runtime.py +37 -0
- agentcore/operations/dev/dev_server.py +244 -0
- agentcore/operations/dev/gateway_env.py +25 -0
- agentcore/operations/dev/invoke.py +214 -0
- agentcore/operations/dev/invoke_a2a.py +204 -0
- agentcore/operations/dev/invoke_agui.py +88 -0
- agentcore/operations/dev/invoke_mcp.py +145 -0
- agentcore/operations/dev/invoke_types.py +30 -0
- agentcore/operations/dev/load_dev_env.py +26 -0
- agentcore/operations/dev/memory_env.py +19 -0
- agentcore/operations/dev/otel/__init__.py +5 -0
- agentcore/operations/dev/otel/collector.py +234 -0
- agentcore/operations/dev/otel/transforms.py +331 -0
- agentcore/operations/dev/payment_env.py +50 -0
- agentcore/operations/dev/server.py +28 -0
- agentcore/operations/dev/sse_transform.py +30 -0
- agentcore/operations/dev/utils.py +152 -0
- agentcore/operations/dev/web_ui/__init__.py +31 -0
- agentcore/operations/dev/web_ui/constants.py +25 -0
- agentcore/operations/dev/web_ui/handlers/__init__.py +36 -0
- agentcore/operations/dev/web_ui/handlers/_common.py +36 -0
- agentcore/operations/dev/web_ui/handlers/_deployed.py +37 -0
- agentcore/operations/dev/web_ui/handlers/a2a_proxy.py +37 -0
- agentcore/operations/dev/web_ui/handlers/cloudwatch_traces.py +71 -0
- agentcore/operations/dev/web_ui/handlers/harness_invocation.py +89 -0
- agentcore/operations/dev/web_ui/handlers/harness_utils.py +95 -0
- agentcore/operations/dev/web_ui/handlers/invocations.py +327 -0
- agentcore/operations/dev/web_ui/handlers/mcp_proxy.py +119 -0
- agentcore/operations/dev/web_ui/handlers/memory.py +84 -0
- agentcore/operations/dev/web_ui/handlers/resources.py +351 -0
- agentcore/operations/dev/web_ui/handlers/start.py +182 -0
- agentcore/operations/dev/web_ui/handlers/status.py +25 -0
- agentcore/operations/dev/web_ui/handlers/traces.py +50 -0
- agentcore/operations/dev/web_ui/run_web_ui.py +60 -0
- agentcore/operations/dev/web_ui/web_server.py +297 -0
- agentcore/operations/eval/__init__.py +8 -0
- agentcore/operations/eval/list_eval_runs.py +18 -0
- agentcore/operations/eval/logs_eval.py +119 -0
- agentcore/operations/eval/pause_resume.py +90 -0
- agentcore/operations/eval/run_eval.py +354 -0
- agentcore/operations/eval/shared/__init__.py +0 -0
- agentcore/operations/eval/shared/dataset_loader.py +68 -0
- agentcore/operations/eval/shared/dataset_session_provider.py +122 -0
- agentcore/operations/eval/shared/evaluator_runner.py +89 -0
- agentcore/operations/eval/shared/scenario_executor.py +71 -0
- agentcore/operations/eval/shared/span_collector.py +255 -0
- agentcore/operations/eval/storage.py +67 -0
- agentcore/operations/feedback/__init__.py +21 -0
- agentcore/operations/feedback/aperture_client.py +98 -0
- agentcore/operations/feedback/build_payload.py +97 -0
- agentcore/operations/feedback/constants.py +26 -0
- agentcore/operations/feedback/submit_feedback.py +150 -0
- agentcore/operations/fetch_access/__init__.py +36 -0
- agentcore/operations/fetch_access/_target.py +17 -0
- agentcore/operations/fetch_access/fetch_gateway_token.py +75 -0
- agentcore/operations/fetch_access/fetch_harness_token.py +72 -0
- agentcore/operations/fetch_access/fetch_runtime_token.py +76 -0
- agentcore/operations/fetch_access/list_agents.py +18 -0
- agentcore/operations/fetch_access/list_gateways.py +26 -0
- agentcore/operations/fetch_access/list_harnesses.py +23 -0
- agentcore/operations/fetch_access/oauth_token.py +162 -0
- agentcore/operations/fetch_access/types.py +34 -0
- agentcore/operations/harness/__init__.py +1 -0
- agentcore/operations/harness/orphan.py +84 -0
- agentcore/operations/harness/skill_utils.py +56 -0
- agentcore/operations/identity/__init__.py +33 -0
- agentcore/operations/identity/api_key_credential_provider.py +68 -0
- agentcore/operations/identity/oauth2_credential_provider.py +95 -0
- agentcore/operations/ingest/__init__.py +184 -0
- agentcore/operations/init/__init__.py +3 -0
- agentcore/operations/init/files.py +59 -0
- agentcore/operations/insights/__init__.py +21 -0
- agentcore/operations/insights/insights_storage.py +67 -0
- agentcore/operations/insights/run_insights.py +148 -0
- agentcore/operations/invoke/__init__.py +5 -0
- agentcore/operations/invoke/resolve_agent_context.py +85 -0
- agentcore/operations/jobs/__init__.py +38 -0
- agentcore/operations/jobs/ab_test/__init__.py +0 -0
- agentcore/operations/jobs/ab_test/build_options.py +126 -0
- agentcore/operations/jobs/ab_test/format.py +121 -0
- agentcore/operations/jobs/ab_test/handler.py +412 -0
- agentcore/operations/jobs/ab_test/promote.py +142 -0
- agentcore/operations/jobs/ab_test/resolve.py +221 -0
- agentcore/operations/jobs/batch_evaluation/__init__.py +0 -0
- agentcore/operations/jobs/batch_evaluation/build_source.py +68 -0
- agentcore/operations/jobs/batch_evaluation/dataset_phase1.py +95 -0
- agentcore/operations/jobs/batch_evaluation/format.py +58 -0
- agentcore/operations/jobs/batch_evaluation/handler.py +203 -0
- agentcore/operations/jobs/insights/__init__.py +0 -0
- agentcore/operations/jobs/insights/format.py +65 -0
- agentcore/operations/jobs/insights/handler.py +178 -0
- agentcore/operations/jobs/recommendation/__init__.py +0 -0
- agentcore/operations/jobs/recommendation/apply_to_bundle.py +76 -0
- agentcore/operations/jobs/recommendation/build_config.py +271 -0
- agentcore/operations/jobs/recommendation/fetch_session_spans.py +93 -0
- agentcore/operations/jobs/recommendation/format.py +77 -0
- agentcore/operations/jobs/recommendation/handler.py +331 -0
- agentcore/operations/jobs/shared/__init__.py +0 -0
- agentcore/operations/jobs/shared/constants.py +85 -0
- agentcore/operations/jobs/shared/engine.py +187 -0
- agentcore/operations/jobs/shared/format.py +104 -0
- agentcore/operations/jobs/shared/region.py +34 -0
- agentcore/operations/jobs/shared/resolve_agent_state.py +30 -0
- agentcore/operations/jobs/shared/storage.py +117 -0
- agentcore/operations/jobs/shared/wait.py +30 -0
- agentcore/operations/knowledge_base/__init__.py +33 -0
- agentcore/operations/knowledge_base/connector_config.py +105 -0
- agentcore/operations/knowledge_base/hydrate_data_sources.py +59 -0
- agentcore/operations/mcp/__init__.py +4 -0
- agentcore/operations/memory/__init__.py +13 -0
- agentcore/operations/memory/_records.py +72 -0
- agentcore/operations/memory/list_memory_records.py +45 -0
- agentcore/operations/memory/retrieve_memory_records.py +52 -0
- agentcore/operations/node/__init__.py +15 -0
- agentcore/operations/node/setup.py +36 -0
- agentcore/operations/python/__init__.py +17 -0
- agentcore/operations/python/setup.py +47 -0
- agentcore/operations/resolve_agent.py +159 -0
- agentcore/operations/session/__init__.py +86 -0
- agentcore/operations/traces/__init__.py +29 -0
- agentcore/operations/traces/get_trace.py +202 -0
- agentcore/operations/traces/insights_query.py +74 -0
- agentcore/operations/traces/list_traces.py +46 -0
- agentcore/operations/traces/trace_url.py +25 -0
- agentcore/operations/traces/types.py +55 -0
- agentcore/primitives/__init__.py +0 -0
- agentcore/primitives/_gateway_target_wizard.py +293 -0
- agentcore/primitives/_gateway_validation.py +442 -0
- agentcore/primitives/_harness_cli.py +557 -0
- agentcore/primitives/_harness_validation.py +163 -0
- agentcore/primitives/_harness_wizard.py +726 -0
- agentcore/primitives/_knowledge_base_wizard.py +259 -0
- agentcore/primitives/_payment_wizard.py +331 -0
- agentcore/primitives/_policy_form.py +160 -0
- agentcore/primitives/agent.py +817 -0
- agentcore/primitives/auth_utils.py +77 -0
- agentcore/primitives/base.py +178 -0
- agentcore/primitives/capacity_provider.py +501 -0
- agentcore/primitives/config_bundle.py +329 -0
- agentcore/primitives/credential.py +387 -0
- agentcore/primitives/credential_utils.py +45 -0
- agentcore/primitives/dataset.py +211 -0
- agentcore/primitives/deployed_gateways.py +34 -0
- agentcore/primitives/evaluator.py +909 -0
- agentcore/primitives/gateway.py +496 -0
- agentcore/primitives/gateway_target.py +988 -0
- agentcore/primitives/harness.py +706 -0
- agentcore/primitives/knowledge_base.py +477 -0
- agentcore/primitives/memory.py +387 -0
- agentcore/primitives/online_eval_config.py +365 -0
- agentcore/primitives/online_insights.py +275 -0
- agentcore/primitives/payment_connector.py +427 -0
- agentcore/primitives/payment_eligible.py +20 -0
- agentcore/primitives/payment_manager.py +605 -0
- agentcore/primitives/payment_validation.py +68 -0
- agentcore/primitives/policy.py +622 -0
- agentcore/primitives/policy_engine.py +358 -0
- agentcore/primitives/registry.py +56 -0
- agentcore/primitives/runtime_endpoint.py +361 -0
- agentcore/primitives/secret_flag_warning.py +17 -0
- agentcore/schema/__init__.py +14 -0
- agentcore/schema/_zod.py +395 -0
- agentcore/schema/constants.py +306 -0
- agentcore/schema/schemas/__init__.py +40 -0
- agentcore/schema/schemas/agent_env.py +545 -0
- agentcore/schema/schemas/agentcore_project.py +530 -0
- agentcore/schema/schemas/auth.py +286 -0
- agentcore/schema/schemas/aws_targets.py +72 -0
- agentcore/schema/schemas/connections.py +187 -0
- agentcore/schema/schemas/deployed_state.py +322 -0
- agentcore/schema/schemas/mcp.py +650 -0
- agentcore/schema/schemas/mcp_defs.py +54 -0
- agentcore/schema/schemas/primitives/__init__.py +52 -0
- agentcore/schema/schemas/primitives/ab_test.py +162 -0
- agentcore/schema/schemas/primitives/capacity_provider.py +214 -0
- agentcore/schema/schemas/primitives/config_bundle.py +48 -0
- agentcore/schema/schemas/primitives/dataset.py +55 -0
- agentcore/schema/schemas/primitives/evaluator.py +171 -0
- agentcore/schema/schemas/primitives/harness.py +710 -0
- agentcore/schema/schemas/primitives/knowledge_base.py +90 -0
- agentcore/schema/schemas/primitives/memory.py +113 -0
- agentcore/schema/schemas/primitives/online_eval_config.py +77 -0
- agentcore/schema/schemas/primitives/payment.py +114 -0
- agentcore/schema/schemas/primitives/policy.py +83 -0
- agentcore/schema/schemas/primitives/tags.py +50 -0
- agentcore/schema/schemas/zod_util.py +5 -0
- agentcore/schema/types/__init__.py +3 -0
- agentcore/schema/types/path.py +16 -0
- agentcore/templates/__init__.py +115 -0
- agentcore/templates/_handlebars.py +782 -0
- agentcore/templates/_js.py +164 -0
- agentcore/templates/base_renderer.py +107 -0
- agentcore/templates/cdk_renderer.py +129 -0
- agentcore/templates/evaluator_renderer.py +39 -0
- agentcore/templates/gateway_target_renderer.py +69 -0
- agentcore/templates/llm_context/README.md +16 -0
- agentcore/templates/llm_context/agentcore.ts +685 -0
- agentcore/templates/llm_context/aws-targets.ts +51 -0
- agentcore/templates/profiles.py +151 -0
- agentcore/templates/render.py +92 -0
- agentcore/templates/renderers.py +83 -0
- agentcore/templates/schema_assets.py +23 -0
- agentcore/templates/template_root.py +28 -0
- agentcore/templates/types.py +192 -0
- agentcore_cli-0.31.1.dist-info/METADATA +84 -0
- agentcore_cli-0.31.1.dist-info/RECORD +655 -0
- agentcore_cli-0.31.1.dist-info/WHEEL +4 -0
- agentcore_cli-0.31.1.dist-info/entry_points.txt +2 -0
- agentcore_cli-0.31.1.dist-info/licenses/LICENSE +175 -0
- agentcore_cli-0.31.1.dist-info/licenses/NOTICE +88 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
{{#if needsOs}}
|
|
2
|
+
import os
|
|
3
|
+
{{/if}}
|
|
4
|
+
from mcp.server.fastmcp import FastMCP
|
|
5
|
+
|
|
6
|
+
mcp = FastMCP("{{ name }}", host="0.0.0.0", stateless_http=True)
|
|
7
|
+
|
|
8
|
+
{{#if needsOs}}
|
|
9
|
+
_MOUNT_PATHS = [
|
|
10
|
+
{{#if sessionStorageMountPath}}"{{sessionStorageMountPath}}",{{/if}}
|
|
11
|
+
{{#each efsMounts}}"{{mountPath}}",{{/each}}
|
|
12
|
+
{{#each s3Mounts}}"{{mountPath}}",{{/each}}
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
def _safe_resolve(path: str) -> str:
|
|
16
|
+
resolved = os.path.realpath(path)
|
|
17
|
+
if not any(resolved == os.path.realpath(m) or resolved.startswith(os.path.realpath(m) + os.sep) for m in _MOUNT_PATHS):
|
|
18
|
+
raise ValueError(f"Path '{path}' is not within any configured mount ({', '.join(_MOUNT_PATHS)})")
|
|
19
|
+
return resolved
|
|
20
|
+
|
|
21
|
+
@mcp.tool()
|
|
22
|
+
def file_read(path: str) -> str:
|
|
23
|
+
"""Read a file from a mounted filesystem. Use the absolute path (e.g. /mnt/tools/data.txt)."""
|
|
24
|
+
try:
|
|
25
|
+
full_path = _safe_resolve(path)
|
|
26
|
+
with open(full_path) as f:
|
|
27
|
+
return f.read()
|
|
28
|
+
except ValueError as e:
|
|
29
|
+
return str(e)
|
|
30
|
+
except OSError as e:
|
|
31
|
+
return f"Error reading '{path}': {e.strerror}"
|
|
32
|
+
|
|
33
|
+
@mcp.tool()
|
|
34
|
+
def file_write(path: str, content: str) -> str:
|
|
35
|
+
"""Write a file to a mounted filesystem. Use the absolute path (e.g. /mnt/tools/data.txt)."""
|
|
36
|
+
try:
|
|
37
|
+
full_path = _safe_resolve(path)
|
|
38
|
+
parent = os.path.dirname(full_path)
|
|
39
|
+
if parent:
|
|
40
|
+
os.makedirs(parent, exist_ok=True)
|
|
41
|
+
with open(full_path, "w") as f:
|
|
42
|
+
f.write(content)
|
|
43
|
+
return f"Written to {path}"
|
|
44
|
+
except ValueError as e:
|
|
45
|
+
return str(e)
|
|
46
|
+
except OSError as e:
|
|
47
|
+
return f"Error writing '{path}': {e.strerror}"
|
|
48
|
+
|
|
49
|
+
@mcp.tool()
|
|
50
|
+
def list_files(path: str) -> str:
|
|
51
|
+
"""List files in a mounted filesystem directory. Use the absolute path (e.g. /mnt/tools)."""
|
|
52
|
+
try:
|
|
53
|
+
full_path = _safe_resolve(path)
|
|
54
|
+
entries = os.listdir(full_path)
|
|
55
|
+
return "\n".join(entries) if entries else "(empty directory)"
|
|
56
|
+
except ValueError as e:
|
|
57
|
+
return str(e)
|
|
58
|
+
except OSError as e:
|
|
59
|
+
return f"Error listing '{path}': {e.strerror}"
|
|
60
|
+
|
|
61
|
+
{{/if}}
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@mcp.tool()
|
|
65
|
+
def add_numbers(a: int, b: int) -> int:
|
|
66
|
+
"""Add two numbers together"""
|
|
67
|
+
return a + b
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@mcp.tool()
|
|
71
|
+
def multiply_numbers(a: int, b: int) -> int:
|
|
72
|
+
"""Multiply two numbers together"""
|
|
73
|
+
return a * b
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@mcp.tool()
|
|
77
|
+
def greet_user(name: str) -> str:
|
|
78
|
+
"""Greet a user by name"""
|
|
79
|
+
return f"Hello, {name}! Nice to meet you."
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
if __name__ == "__main__":
|
|
83
|
+
mcp.run(transport="streamable-http")
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "{{ name }}"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "AgentCore MCP Server"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
dependencies = [
|
|
12
|
+
"mcp >= 1.28.1, < 2.0.0",
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
[tool.hatch.build.targets.wheel]
|
|
16
|
+
packages = ["."]
|
|
File without changes
|
|
@@ -0,0 +1,42 @@
|
|
|
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.ts`. Using the AgentCore SDK `BedrockAgentCoreApp`, this file
|
|
12
|
+
defines an HTTP server that streams tokens from your chosen Agent framework SDK.
|
|
13
|
+
|
|
14
|
+
`model/load.ts` instantiates your chosen model provider.
|
|
15
|
+
|
|
16
|
+
## Input Validation
|
|
17
|
+
|
|
18
|
+
The generated Zod request schema keeps plain prompts typed as strings before forwarding them to Strands. Retain this
|
|
19
|
+
validation when extending the request shape, and pass only prompt text to the agent.
|
|
20
|
+
|
|
21
|
+
## Environment Variables
|
|
22
|
+
|
|
23
|
+
| Variable | Required | Description |
|
|
24
|
+
| --- | --- | --- |
|
|
25
|
+
{{#if hasIdentity}}| `{{identityProviders.[0].envVarName}}` | Yes | {{modelProvider}} API key (local) or Identity provider name (deployed) |
|
|
26
|
+
{{/if}}| `LOCAL_DEV` | No | Set to `1` to use `.env.local` instead of AgentCore Identity |
|
|
27
|
+
|
|
28
|
+
# Developing locally
|
|
29
|
+
|
|
30
|
+
If installation was successful, `node_modules/` is already populated with dependencies.
|
|
31
|
+
|
|
32
|
+
`agentcore dev` will start a local server using `npx tsx watch main.ts` for hot reload. The port is logged to the terminal (default `8080`).
|
|
33
|
+
|
|
34
|
+
In a new terminal, you can invoke that server with:
|
|
35
|
+
|
|
36
|
+
`agentcore invoke --dev "What can you do"`
|
|
37
|
+
|
|
38
|
+
# Deployment
|
|
39
|
+
|
|
40
|
+
After providing credentials, `agentcore deploy` will deploy your project into Amazon Bedrock AgentCore.
|
|
41
|
+
|
|
42
|
+
Use `agentcore invoke` to invoke your deployed agent.
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { BedrockAgentCoreApp } from 'bedrock-agentcore/runtime';
|
|
2
|
+
import { Agent, McpClient, tool, type ToolList } from '@strands-agents/sdk';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { loadModel } from './model/load.js';
|
|
5
|
+
import { getStreamableHttpMcpClient } from './mcp_client/client.js';
|
|
6
|
+
{{#if hasMemory}}
|
|
7
|
+
import { getActorId, getOrCreateMemoryManager } from './memory/memory.js';
|
|
8
|
+
{{/if}}
|
|
9
|
+
|
|
10
|
+
// Define a collection of MCP clients (filter out anything that failed to initialize)
|
|
11
|
+
const mcpClients: McpClient[] = [getStreamableHttpMcpClient()].filter(
|
|
12
|
+
(client): client is McpClient => Boolean(client)
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
// Define a collection of tools used by the model
|
|
16
|
+
const tools: ToolList = [];
|
|
17
|
+
|
|
18
|
+
// Define a simple function tool — the Zod schema gives us type inference and runtime validation for free
|
|
19
|
+
const addNumbers = tool({
|
|
20
|
+
name: 'add_numbers',
|
|
21
|
+
description: 'Return the sum of two numbers',
|
|
22
|
+
inputSchema: z.object({
|
|
23
|
+
a: z.number(),
|
|
24
|
+
b: z.number(),
|
|
25
|
+
}),
|
|
26
|
+
callback: async ({ a, b }) => a + b,
|
|
27
|
+
});
|
|
28
|
+
tools.push(addNumbers);
|
|
29
|
+
|
|
30
|
+
// Add MCP clients to tools
|
|
31
|
+
tools.push(...mcpClients);
|
|
32
|
+
|
|
33
|
+
const SYSTEM_PROMPT = `
|
|
34
|
+
You are a helpful assistant. Use tools when appropriate.
|
|
35
|
+
`;
|
|
36
|
+
|
|
37
|
+
const requestSchema = z.object({
|
|
38
|
+
prompt: z.string().default(''),
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
{{#if hasMemory}}
|
|
42
|
+
const agentCache = new Map<string, Agent>();
|
|
43
|
+
|
|
44
|
+
async function getOrCreateAgent(sessionId: string, actorId: string): Promise<Agent> {
|
|
45
|
+
const key = `${actorId}:${sessionId}`;
|
|
46
|
+
let agent = agentCache.get(key);
|
|
47
|
+
if (agent) return agent;
|
|
48
|
+
|
|
49
|
+
const model = await loadModel();
|
|
50
|
+
agent = new Agent({
|
|
51
|
+
model,
|
|
52
|
+
systemPrompt: SYSTEM_PROMPT,
|
|
53
|
+
tools,
|
|
54
|
+
memoryManager: getOrCreateMemoryManager(sessionId, actorId) ?? undefined,
|
|
55
|
+
});
|
|
56
|
+
agentCache.set(key, agent);
|
|
57
|
+
return agent;
|
|
58
|
+
}
|
|
59
|
+
{{else}}
|
|
60
|
+
const AGENT_CACHE_LIMIT = 128;
|
|
61
|
+
|
|
62
|
+
// Reuses one Agent per sessionId so each session keeps its own in-process
|
|
63
|
+
// conversation history (best-effort; resets on cold start). A Map preserves
|
|
64
|
+
// insertion order, so it doubles as an LRU bounded to 128 sessions — a local
|
|
65
|
+
// dev process serving many sessions cannot leak history between them or grow
|
|
66
|
+
// without bound. On AgentCore Runtime each microVM serves a single session, so
|
|
67
|
+
// this holds one entry. For durable history, attach memory.
|
|
68
|
+
const agentCache = new Map<string, Agent>();
|
|
69
|
+
|
|
70
|
+
async function getOrCreateAgent(sessionId: string): Promise<Agent> {
|
|
71
|
+
const existing = agentCache.get(sessionId);
|
|
72
|
+
if (existing) {
|
|
73
|
+
agentCache.delete(sessionId);
|
|
74
|
+
agentCache.set(sessionId, existing);
|
|
75
|
+
return existing;
|
|
76
|
+
}
|
|
77
|
+
if (agentCache.size >= AGENT_CACHE_LIMIT) {
|
|
78
|
+
const oldest = agentCache.keys().next().value;
|
|
79
|
+
if (oldest !== undefined) agentCache.delete(oldest);
|
|
80
|
+
}
|
|
81
|
+
const model = await loadModel();
|
|
82
|
+
const agent = new Agent({
|
|
83
|
+
model,
|
|
84
|
+
systemPrompt: SYSTEM_PROMPT,
|
|
85
|
+
tools,
|
|
86
|
+
});
|
|
87
|
+
agentCache.set(sessionId, agent);
|
|
88
|
+
return agent;
|
|
89
|
+
}
|
|
90
|
+
{{/if}}
|
|
91
|
+
|
|
92
|
+
const app = new BedrockAgentCoreApp({
|
|
93
|
+
invocationHandler: {
|
|
94
|
+
requestSchema,
|
|
95
|
+
async *process(payload, context) {
|
|
96
|
+
{{#if hasMemory}}
|
|
97
|
+
const sessionId = context?.sessionId ?? 'default-session';
|
|
98
|
+
const actorId = getActorId(payload, context);
|
|
99
|
+
const agent = await getOrCreateAgent(sessionId, actorId);
|
|
100
|
+
{{else}}
|
|
101
|
+
const sessionId = context?.sessionId ?? 'default-session';
|
|
102
|
+
const agent = await getOrCreateAgent(sessionId);
|
|
103
|
+
{{/if}}
|
|
104
|
+
|
|
105
|
+
{{#if hasMemory}}
|
|
106
|
+
try {
|
|
107
|
+
for await (const event of agent.stream(payload.prompt)) {
|
|
108
|
+
if (
|
|
109
|
+
event.type === 'modelStreamUpdateEvent' &&
|
|
110
|
+
event.event?.type === 'modelContentBlockDeltaEvent' &&
|
|
111
|
+
event.event.delta?.type === 'textDelta'
|
|
112
|
+
) {
|
|
113
|
+
yield { data: event.event.delta.text };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
} finally {
|
|
117
|
+
// Drain in-flight createEvent calls before the runtime can reclaim
|
|
118
|
+
// the session microVM. flush() is the durability mechanism — without
|
|
119
|
+
// it, an idle reclamation can lose the tail of the conversation.
|
|
120
|
+
await agent.memoryManager?.flush();
|
|
121
|
+
}
|
|
122
|
+
{{else}}
|
|
123
|
+
// Snapshot history before streaming so a failed turn can be rolled back.
|
|
124
|
+
// Agent.stream() appends the user message before invoking the model; on a
|
|
125
|
+
// mid-stream error that user turn would otherwise linger in the cached
|
|
126
|
+
// agent, and the next turn for this session would send consecutive user
|
|
127
|
+
// messages (rejected by providers that require strict role alternation,
|
|
128
|
+
// e.g. Anthropic). Restoring on error keeps the session reusable.
|
|
129
|
+
const snapshot = agent.takeSnapshot({ include: ['messages'] });
|
|
130
|
+
try {
|
|
131
|
+
for await (const event of agent.stream(payload.prompt)) {
|
|
132
|
+
if (
|
|
133
|
+
event.type === 'modelStreamUpdateEvent' &&
|
|
134
|
+
event.event?.type === 'modelContentBlockDeltaEvent' &&
|
|
135
|
+
event.event.delta?.type === 'textDelta'
|
|
136
|
+
) {
|
|
137
|
+
yield { data: event.event.delta.text };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
} catch (error) {
|
|
141
|
+
agent.loadSnapshot(snapshot);
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
{{/if}}
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
app.run({ port: parseInt(process.env.PORT ?? '8080') });
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { McpClient } from '@strands-agents/sdk';
|
|
2
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
3
|
+
|
|
4
|
+
// ExaAI provides information about code through web searches, crawling and code context searches through their platform. Requires no authentication
|
|
5
|
+
const EXAMPLE_MCP_ENDPOINT = 'https://mcp.exa.ai/mcp';
|
|
6
|
+
|
|
7
|
+
export function getStreamableHttpMcpClient(): McpClient {
|
|
8
|
+
// to use an MCP server that supports bearer authentication, add a headers() callback to requestInit
|
|
9
|
+
const transport = new StreamableHTTPClientTransport(new URL(EXAMPLE_MCP_ENDPOINT));
|
|
10
|
+
return new McpClient({ transport });
|
|
11
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
{{#if (eq modelProvider "Bedrock")}}
|
|
2
|
+
import { BedrockModel } from '@strands-agents/sdk/models/bedrock';
|
|
3
|
+
|
|
4
|
+
export function loadModel(): BedrockModel {
|
|
5
|
+
return new BedrockModel({ modelId: 'global.anthropic.claude-sonnet-4-5-20250929-v1:0' });
|
|
6
|
+
}
|
|
7
|
+
{{/if}}
|
|
8
|
+
{{#if (eq modelProvider "Anthropic")}}
|
|
9
|
+
import { AnthropicModel } from '@strands-agents/sdk/models/anthropic';
|
|
10
|
+
import { withApiKey } from 'bedrock-agentcore/identity';
|
|
11
|
+
|
|
12
|
+
const IDENTITY_PROVIDER_NAME = '{{identityProviders.[0].name}}';
|
|
13
|
+
const IDENTITY_ENV_VAR = '{{identityProviders.[0].envVarName}}';
|
|
14
|
+
|
|
15
|
+
async function getApiKey(): Promise<string> {
|
|
16
|
+
if (process.env.LOCAL_DEV === '1') {
|
|
17
|
+
const apiKey = process.env[IDENTITY_ENV_VAR] ?? process.env.ANTHROPIC_API_KEY;
|
|
18
|
+
if (!apiKey) {
|
|
19
|
+
throw new Error(`${IDENTITY_ENV_VAR} or ANTHROPIC_API_KEY not found. Add your key to agentcore/.env.local`);
|
|
20
|
+
}
|
|
21
|
+
return apiKey;
|
|
22
|
+
}
|
|
23
|
+
return withApiKey({ providerName: IDENTITY_PROVIDER_NAME })(async (apiKey: string) => apiKey)();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
let _model: AnthropicModel | undefined;
|
|
27
|
+
|
|
28
|
+
export async function loadModel(): Promise<AnthropicModel> {
|
|
29
|
+
if (!_model) {
|
|
30
|
+
const apiKey = await getApiKey();
|
|
31
|
+
_model = new AnthropicModel({
|
|
32
|
+
apiKey,
|
|
33
|
+
modelId: 'claude-sonnet-4-5-20250929',
|
|
34
|
+
maxTokens: 5000,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return _model;
|
|
38
|
+
}
|
|
39
|
+
{{/if}}
|
|
40
|
+
{{#if (eq modelProvider "OpenAI")}}
|
|
41
|
+
import { OpenAIModel } from '@strands-agents/sdk/models/openai';
|
|
42
|
+
import { withApiKey } from 'bedrock-agentcore/identity';
|
|
43
|
+
|
|
44
|
+
const IDENTITY_PROVIDER_NAME = '{{identityProviders.[0].name}}';
|
|
45
|
+
const IDENTITY_ENV_VAR = '{{identityProviders.[0].envVarName}}';
|
|
46
|
+
|
|
47
|
+
async function getApiKey(): Promise<string> {
|
|
48
|
+
if (process.env.LOCAL_DEV === '1') {
|
|
49
|
+
const apiKey = process.env[IDENTITY_ENV_VAR] ?? process.env.OPENAI_API_KEY;
|
|
50
|
+
if (!apiKey) {
|
|
51
|
+
throw new Error(`${IDENTITY_ENV_VAR} or OPENAI_API_KEY not found. Add your key to agentcore/.env.local`);
|
|
52
|
+
}
|
|
53
|
+
return apiKey;
|
|
54
|
+
}
|
|
55
|
+
return withApiKey({ providerName: IDENTITY_PROVIDER_NAME })(async (apiKey: string) => apiKey)();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
let _model: OpenAIModel | undefined;
|
|
59
|
+
|
|
60
|
+
export async function loadModel(): Promise<OpenAIModel> {
|
|
61
|
+
if (!_model) {
|
|
62
|
+
const apiKey = await getApiKey();
|
|
63
|
+
_model = new OpenAIModel({
|
|
64
|
+
api: 'chat',
|
|
65
|
+
apiKey,
|
|
66
|
+
modelId: 'gpt-4.1',
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return _model;
|
|
70
|
+
}
|
|
71
|
+
{{/if}}
|
|
72
|
+
{{#if (eq modelProvider "Gemini")}}
|
|
73
|
+
import { GoogleModel } from '@strands-agents/sdk/models/google';
|
|
74
|
+
import { withApiKey } from 'bedrock-agentcore/identity';
|
|
75
|
+
|
|
76
|
+
const IDENTITY_PROVIDER_NAME = '{{identityProviders.[0].name}}';
|
|
77
|
+
const IDENTITY_ENV_VAR = '{{identityProviders.[0].envVarName}}';
|
|
78
|
+
|
|
79
|
+
async function getApiKey(): Promise<string> {
|
|
80
|
+
if (process.env.LOCAL_DEV === '1') {
|
|
81
|
+
const apiKey = process.env[IDENTITY_ENV_VAR] ?? process.env.GEMINI_API_KEY;
|
|
82
|
+
if (!apiKey) {
|
|
83
|
+
throw new Error(`${IDENTITY_ENV_VAR} or GEMINI_API_KEY not found. Add your key to agentcore/.env.local`);
|
|
84
|
+
}
|
|
85
|
+
return apiKey;
|
|
86
|
+
}
|
|
87
|
+
return withApiKey({ providerName: IDENTITY_PROVIDER_NAME })(async (apiKey: string) => apiKey)();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
let _model: GoogleModel | undefined;
|
|
91
|
+
|
|
92
|
+
export async function loadModel(): Promise<GoogleModel> {
|
|
93
|
+
if (!_model) {
|
|
94
|
+
const apiKey = await getApiKey();
|
|
95
|
+
_model = new GoogleModel({
|
|
96
|
+
apiKey,
|
|
97
|
+
modelId: 'gemini-2.5-flash',
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return _model;
|
|
101
|
+
}
|
|
102
|
+
{{/if}}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{name}}",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AgentCore Runtime Application using Strands TypeScript SDK",
|
|
5
|
+
"private": true,
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"start": "node dist/main.js",
|
|
10
|
+
"dev": "tsx watch main.ts"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
{{#if (eq modelProvider "Anthropic")}}
|
|
14
|
+
"@anthropic-ai/sdk": "^0.71.2",
|
|
15
|
+
{{/if}}
|
|
16
|
+
{{#if (eq modelProvider "OpenAI")}}
|
|
17
|
+
"openai": "^6.7.0",
|
|
18
|
+
{{/if}}
|
|
19
|
+
{{#if (eq modelProvider "Gemini")}}
|
|
20
|
+
"@google/genai": "^1.40.0",
|
|
21
|
+
{{/if}}
|
|
22
|
+
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
23
|
+
"@opentelemetry/api": "^1.9.0",
|
|
24
|
+
"@strands-agents/sdk": "^1.5.0",
|
|
25
|
+
"bedrock-agentcore": "^0.3.0",
|
|
26
|
+
"tsx": "^4.19.0",
|
|
27
|
+
"zod": "^4.4.3"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/node": "^22.0.0",
|
|
31
|
+
"typescript": "^5.6.0"
|
|
32
|
+
},
|
|
33
|
+
"overrides": {
|
|
34
|
+
"bedrock-agentcore": {
|
|
35
|
+
"@strands-agents/sdk": "$@strands-agents/sdk"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "NodeNext",
|
|
5
|
+
"moduleResolution": "NodeNext",
|
|
6
|
+
"strict": true,
|
|
7
|
+
"esModuleInterop": true,
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
"forceConsistentCasingInFileNames": true,
|
|
10
|
+
"resolveJsonModule": true,
|
|
11
|
+
"declaration": false,
|
|
12
|
+
"sourceMap": true,
|
|
13
|
+
"outDir": "dist",
|
|
14
|
+
"rootDir": ".",
|
|
15
|
+
"types": ["node"]
|
|
16
|
+
},
|
|
17
|
+
"include": ["**/*.ts"],
|
|
18
|
+
"exclude": ["node_modules", "dist"]
|
|
19
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { MemoryManager } from '@strands-agents/sdk';
|
|
3
|
+
import { createAgentCoreMemoryStores } from 'bedrock-agentcore/experimental/memory/strands';
|
|
4
|
+
|
|
5
|
+
const MEMORY_ID = process.env.{{memoryProviders.[0].envVarName}};
|
|
6
|
+
|
|
7
|
+
const CUSTOM_ACTOR_ID_HEADER = 'x-amzn-bedrock-agentcore-runtime-custom-actor-id';
|
|
8
|
+
|
|
9
|
+
export function getActorId(payload: any, context: any): string {
|
|
10
|
+
const raw =
|
|
11
|
+
context?.headers?.[CUSTOM_ACTOR_ID_HEADER] ||
|
|
12
|
+
payload?.userId ||
|
|
13
|
+
context?.sessionId;
|
|
14
|
+
return typeof raw === 'string' && raw.trim().length > 0 ? raw.trim() : randomUUID();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const memoryManagerCache = new Map<string, MemoryManager>();
|
|
18
|
+
|
|
19
|
+
export function getOrCreateMemoryManager(sessionId: string, actorId: string): MemoryManager | null {
|
|
20
|
+
if (!MEMORY_ID) return null;
|
|
21
|
+
|
|
22
|
+
const key = `${actorId}:${sessionId}`;
|
|
23
|
+
let manager = memoryManagerCache.get(key);
|
|
24
|
+
if (manager) return manager;
|
|
25
|
+
|
|
26
|
+
const stores = createAgentCoreMemoryStores({
|
|
27
|
+
memoryId: MEMORY_ID,
|
|
28
|
+
actorId,
|
|
29
|
+
sessionId,
|
|
30
|
+
namespaces: [
|
|
31
|
+
{{#if (includes memoryProviders.[0].strategies "SEMANTIC")}}
|
|
32
|
+
{ namespace: '/users/{actorId}/facts' },
|
|
33
|
+
{{/if}}
|
|
34
|
+
{{#if (includes memoryProviders.[0].strategies "USER_PREFERENCE")}}
|
|
35
|
+
{ namespace: '/users/{actorId}/preferences' },
|
|
36
|
+
{{/if}}
|
|
37
|
+
{{#if (includes memoryProviders.[0].strategies "EPISODIC")}}
|
|
38
|
+
{ namespace: '/episodes/{actorId}/{sessionId}' },
|
|
39
|
+
{{/if}}
|
|
40
|
+
{{#if (includes memoryProviders.[0].strategies "SUMMARIZATION")}}
|
|
41
|
+
{ namespace: '/summaries/{actorId}/{sessionId}' },
|
|
42
|
+
{{/if}}
|
|
43
|
+
],
|
|
44
|
+
// readMode defaults to 'per-namespace' (one retrieve call per namespace).
|
|
45
|
+
// Switch to 'subtree' to consolidate to a single hierarchical recall call.
|
|
46
|
+
extraction: true,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
manager = new MemoryManager({ stores });
|
|
50
|
+
memoryManagerCache.set(key, manager);
|
|
51
|
+
return manager;
|
|
52
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
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.ts`. Using the AgentCore SDK `BedrockAgentCoreApp`, this file
|
|
12
|
+
defines an HTTP app that streams tokens using the Vercel AI SDK's `streamText` API.
|
|
13
|
+
|
|
14
|
+
`model/load.ts` instantiates your chosen model provider.
|
|
15
|
+
|
|
16
|
+
## Input Validation
|
|
17
|
+
|
|
18
|
+
The generated Zod request schema keeps plain prompts typed as strings before forwarding them to the agent framework.
|
|
19
|
+
Retain this validation when extending the request shape, and pass only prompt text to the agent.
|
|
20
|
+
|
|
21
|
+
## Environment Variables
|
|
22
|
+
|
|
23
|
+
| Variable | Required | Description |
|
|
24
|
+
| --- | --- | --- |
|
|
25
|
+
{{#if hasIdentity}}| `{{identityProviders.[0].envVarName}}` | Yes | {{modelProvider}} API key (local) or Identity provider name (deployed) |
|
|
26
|
+
{{/if}}| `LOCAL_DEV` | No | Set to `1` to use `.env.local` instead of AgentCore Identity |
|
|
27
|
+
|
|
28
|
+
# Developing locally
|
|
29
|
+
|
|
30
|
+
If installation was successful, `node_modules/` is already populated with dependencies.
|
|
31
|
+
|
|
32
|
+
`agentcore dev` will start a local server using `npx tsx watch main.ts` for hot reload. The port is logged to the terminal (default `8080`).
|
|
33
|
+
|
|
34
|
+
In a new terminal, you can invoke that server with:
|
|
35
|
+
|
|
36
|
+
`agentcore invoke --dev "What can you do"`
|
|
37
|
+
|
|
38
|
+
# Deployment
|
|
39
|
+
|
|
40
|
+
After providing credentials, `agentcore deploy` will deploy your project into Amazon Bedrock AgentCore.
|
|
41
|
+
|
|
42
|
+
Use `agentcore invoke` to invoke your deployed agent.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { BedrockAgentCoreApp } from 'bedrock-agentcore/runtime';
|
|
2
|
+
import { streamText, type ModelMessage } from 'ai';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { loadModel } from './model/load.js';
|
|
5
|
+
|
|
6
|
+
const SYSTEM_PROMPT = `You are a helpful assistant.`;
|
|
7
|
+
|
|
8
|
+
const requestSchema = z.object({
|
|
9
|
+
prompt: z.string().default(''),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const HISTORY_LIMIT = 128;
|
|
13
|
+
|
|
14
|
+
// Keeps one message history per sessionId so each session remembers its own
|
|
15
|
+
// turns (best-effort; resets on cold start). A Map preserves insertion order,
|
|
16
|
+
// so it doubles as an LRU bounded to 128 sessions — a local dev process serving
|
|
17
|
+
// many sessions cannot leak history between them or grow without bound. On
|
|
18
|
+
// AgentCore Runtime each microVM serves a single session, so this holds one
|
|
19
|
+
// entry. For durable history, persist messages to an external store.
|
|
20
|
+
const histories = new Map<string, ModelMessage[]>();
|
|
21
|
+
|
|
22
|
+
function getHistory(sessionId: string): ModelMessage[] {
|
|
23
|
+
const existing = histories.get(sessionId);
|
|
24
|
+
if (existing) {
|
|
25
|
+
histories.delete(sessionId);
|
|
26
|
+
histories.set(sessionId, existing);
|
|
27
|
+
return existing;
|
|
28
|
+
}
|
|
29
|
+
if (histories.size >= HISTORY_LIMIT) {
|
|
30
|
+
const oldest = histories.keys().next().value;
|
|
31
|
+
if (oldest !== undefined) histories.delete(oldest);
|
|
32
|
+
}
|
|
33
|
+
const fresh: ModelMessage[] = [];
|
|
34
|
+
histories.set(sessionId, fresh);
|
|
35
|
+
return fresh;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const app = new BedrockAgentCoreApp({
|
|
39
|
+
invocationHandler: {
|
|
40
|
+
requestSchema,
|
|
41
|
+
async *process(payload, context) {
|
|
42
|
+
const sessionId = context?.sessionId ?? 'default-session';
|
|
43
|
+
const history = getHistory(sessionId);
|
|
44
|
+
const userMessage: ModelMessage = { role: 'user', content: payload.prompt };
|
|
45
|
+
|
|
46
|
+
const model = await loadModel();
|
|
47
|
+
const result = streamText({
|
|
48
|
+
model,
|
|
49
|
+
system: SYSTEM_PROMPT,
|
|
50
|
+
messages: [...history, userMessage],
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
let assistant = '';
|
|
54
|
+
for await (const chunk of result.textStream) {
|
|
55
|
+
assistant += chunk;
|
|
56
|
+
yield { data: chunk };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Commit the exchange to history only after a non-empty reply. On a failed
|
|
60
|
+
// or empty stream the turn is dropped instead of leaving a dangling user
|
|
61
|
+
// (or empty assistant) message — consecutive same-role or empty-content
|
|
62
|
+
// messages would otherwise be rejected on the next turn for this session.
|
|
63
|
+
if (assistant.length > 0) {
|
|
64
|
+
history.push(userMessage, { role: 'assistant', content: assistant });
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
app.run({ port: parseInt(process.env.PORT ?? '8080') });
|