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,37 @@
|
|
|
1
|
+
"""`agentcore add` shell (port of src/cli/commands/add/command.tsx).
|
|
2
|
+
|
|
3
|
+
Subcommands come from the primitives. With no subcommand, upstream opens the Add TUI; here the
|
|
4
|
+
user picks a resource kind and that primitive's interactive add flow runs.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
from agentcore.cli import interactive
|
|
10
|
+
from agentcore.cli.tree import RESOURCE_KINDS
|
|
11
|
+
from agentcore.lib import find_config_root
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _require_project() -> None:
|
|
15
|
+
"""Port of tui/guards requireProject."""
|
|
16
|
+
if not find_config_root():
|
|
17
|
+
typer.echo("No agentcore project found. Run `agentcore create` first.", err=True)
|
|
18
|
+
raise typer.Exit(1)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def install_add_shell(add_app: typer.Typer) -> None:
|
|
22
|
+
add_app.info.no_args_is_help = False
|
|
23
|
+
|
|
24
|
+
@add_app.callback(invoke_without_command=True)
|
|
25
|
+
def add_root(ctx: typer.Context) -> None:
|
|
26
|
+
if ctx.invoked_subcommand is not None:
|
|
27
|
+
return
|
|
28
|
+
_require_project()
|
|
29
|
+
interactive.require_tty()
|
|
30
|
+
from agentcore.primitives.registry import all_primitives
|
|
31
|
+
|
|
32
|
+
primitives = {p.kind: p for p in all_primitives()}
|
|
33
|
+
kind = interactive.select(
|
|
34
|
+
"What would you like to add?",
|
|
35
|
+
[interactive.Choice(RESOURCE_KINDS.get(k, k).capitalize(), k) for k in primitives],
|
|
36
|
+
)
|
|
37
|
+
primitives[kind].add_interactive()
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Commander-style argument checks for commands that upstream declares with ``requiredOption``."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def require_options(*pairs: tuple[str, object]) -> None:
|
|
11
|
+
"""``error: required option '<flags>' not specified`` (exit 1) for the first missing option, in order."""
|
|
12
|
+
for flags, value in pairs:
|
|
13
|
+
if value is None:
|
|
14
|
+
sys.stderr.write(f"error: required option '{flags}' not specified\n")
|
|
15
|
+
raise typer.Exit(1)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def require_project() -> None:
|
|
19
|
+
from agentcore.lib.schemas.io.path_resolver import find_config_root
|
|
20
|
+
|
|
21
|
+
if not find_config_root():
|
|
22
|
+
typer.echo("No agentcore project found. Run `agentcore create` first.", err=True)
|
|
23
|
+
raise typer.Exit(1)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# Commander's optional-value options (`--aws-skills [paths]`): bare flag -> True.
|
|
27
|
+
OPTIONAL_VALUE_SENTINEL = "\x00true"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def optional_value_command(*flags: str) -> type:
|
|
31
|
+
"""A Typer command class that lets ``flags`` be given without a value (like Commander's ``[value]``).
|
|
32
|
+
|
|
33
|
+
A bare flag (end of argv, or followed by another option) receives ``OPTIONAL_VALUE_SENTINEL``.
|
|
34
|
+
"""
|
|
35
|
+
from typer.core import TyperCommand
|
|
36
|
+
|
|
37
|
+
names = set(flags)
|
|
38
|
+
|
|
39
|
+
class OptionalValueCommand(TyperCommand):
|
|
40
|
+
def parse_args(self, ctx, args): # type: ignore[no-untyped-def]
|
|
41
|
+
out: list[str] = []
|
|
42
|
+
for i, arg in enumerate(args):
|
|
43
|
+
out.append(arg)
|
|
44
|
+
if arg in names and (i + 1 == len(args) or args[i + 1].startswith("-")):
|
|
45
|
+
out.append(OPTIONAL_VALUE_SENTINEL)
|
|
46
|
+
return super().parse_args(ctx, out)
|
|
47
|
+
|
|
48
|
+
return OptionalValueCommand
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def optional_value(value: str | None) -> str | bool | None:
|
|
52
|
+
return True if value == OPTIONAL_VALUE_SENTINEL else value
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""Small helpers shared by the add/create validators."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from functools import cache
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from pydantic import TypeAdapter, ValidationError
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclass
|
|
12
|
+
class ValidationResult:
|
|
13
|
+
valid: bool
|
|
14
|
+
error: str | None = None
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@cache
|
|
18
|
+
def _adapter(schema: Any) -> TypeAdapter[Any]:
|
|
19
|
+
return TypeAdapter(schema)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def first_issue(schema: Any, value: Any) -> str | None:
|
|
23
|
+
"""Zod ``safeParse(...).error.issues[0].message`` equivalent; None when the value is valid."""
|
|
24
|
+
try:
|
|
25
|
+
if isinstance(schema, type) and hasattr(schema, "model_validate"):
|
|
26
|
+
schema.model_validate(value)
|
|
27
|
+
else:
|
|
28
|
+
_adapter(schema).validate_python(value)
|
|
29
|
+
except ValidationError as exc:
|
|
30
|
+
errors = exc.errors()
|
|
31
|
+
return errors[0]["msg"] if errors else str(exc)
|
|
32
|
+
return None
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def parse_json(text: str) -> tuple[bool, Any]:
|
|
36
|
+
"""JSON.parse: (True, value) or (False, None) on a syntax error."""
|
|
37
|
+
try:
|
|
38
|
+
return True, json.loads(text)
|
|
39
|
+
except ValueError:
|
|
40
|
+
return False, None
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def js_url_ok(value: str) -> bool:
|
|
44
|
+
"""``new URL(value)`` succeeds."""
|
|
45
|
+
from agentcore.schema._zod import is_js_url
|
|
46
|
+
|
|
47
|
+
return is_js_url(value)
|
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
"""Interactive add-agent wizard: prompt-based port of tui/screens/agent/AddAgentScreen.tsx and the
|
|
2
|
+
generate wizard (tui/screens/generate/useGenerateWizard.ts + GenerateWizardUI.tsx).
|
|
3
|
+
|
|
4
|
+
Questions are asked in the upstream step order:
|
|
5
|
+
|
|
6
|
+
* name -> agent type
|
|
7
|
+
* create: language -> build -> protocol -> framework -> model -> API key -> memory (Strands only)
|
|
8
|
+
-> advanced settings (+ their sub-steps) -> confirm
|
|
9
|
+
* byo: code location (+ entrypoint) -> build -> model -> API key -> advanced -> confirm
|
|
10
|
+
* import: region -> Bedrock agent -> alias -> framework -> memory -> inbound auth (+ JWT) -> confirm
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
import os
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
17
|
+
import typer
|
|
18
|
+
|
|
19
|
+
from agentcore.cli import interactive
|
|
20
|
+
from agentcore.cli.commands.add._common import first_issue, js_url_ok
|
|
21
|
+
from agentcore.cli.commands.add.validate import session_storage_mount_path_issue
|
|
22
|
+
from agentcore.cli.commands.shared.header_utils import parse_and_normalize_headers, validate_header_allowlist
|
|
23
|
+
from agentcore.cli.commands.shared.lifecycle_utils import parse_and_validate_lifecycle_options
|
|
24
|
+
from agentcore.cli.commands.shared.vpc_utils import (
|
|
25
|
+
validate_security_group_ids,
|
|
26
|
+
validate_subnet_ids,
|
|
27
|
+
validate_vpc_id,
|
|
28
|
+
)
|
|
29
|
+
from agentcore.cli.naming import generate_unique_name
|
|
30
|
+
from agentcore.operations.agent.generate.types import (
|
|
31
|
+
ADVANCED_SETTING_OPTIONS,
|
|
32
|
+
BUILD_TYPE_OPTIONS,
|
|
33
|
+
LANGUAGE_OPTIONS,
|
|
34
|
+
MEMORY_OPTIONS,
|
|
35
|
+
NETWORK_MODE_OPTIONS,
|
|
36
|
+
Option,
|
|
37
|
+
get_model_provider_options_for_sdk,
|
|
38
|
+
get_protocol_options_for_language,
|
|
39
|
+
get_sdk_options_for_protocol,
|
|
40
|
+
validate_dockerfile_input,
|
|
41
|
+
)
|
|
42
|
+
from agentcore.primitives.auth_utils import JwtConfigOptions
|
|
43
|
+
from agentcore.schema import (
|
|
44
|
+
LIFECYCLE_TIMEOUT_MAX,
|
|
45
|
+
LIFECYCLE_TIMEOUT_MIN,
|
|
46
|
+
MAX_EFS_MOUNTS,
|
|
47
|
+
MAX_S3_MOUNTS,
|
|
48
|
+
AgentName,
|
|
49
|
+
CustomClaimValidation,
|
|
50
|
+
)
|
|
51
|
+
from agentcore.templates import get_template_profile, template_uses_model
|
|
52
|
+
|
|
53
|
+
AGENT_TYPE_OPTIONS = (
|
|
54
|
+
Option("create", "Create new agent"),
|
|
55
|
+
Option("byo", "Bring my own code"),
|
|
56
|
+
Option("import", "Import from Bedrock Agents"),
|
|
57
|
+
)
|
|
58
|
+
RUNTIME_AUTHORIZER_TYPE_OPTIONS = (
|
|
59
|
+
Option("AWS_IAM", "AWS IAM (default)", "Standard AWS IAM authentication"),
|
|
60
|
+
Option("CUSTOM_JWT", "Custom JWT", "OIDC-based token validation for inbound requests"),
|
|
61
|
+
)
|
|
62
|
+
JWT_CONSTRAINT_OPTIONS = (
|
|
63
|
+
Option("audience", "Allowed Audiences", "Validate token audience claims"),
|
|
64
|
+
Option("clients", "Allowed Clients", "Validate client identifiers in the token"),
|
|
65
|
+
Option("scopes", "Allowed Scopes", "Validate token scopes"),
|
|
66
|
+
Option("customClaims", "Custom Claims", "Validate custom claims in the token"),
|
|
67
|
+
)
|
|
68
|
+
PRIVATE_ENDPOINT_OPTIONS = (
|
|
69
|
+
Option("none", "None", "The IdP discovery endpoint is publicly reachable"),
|
|
70
|
+
Option("lattice", "VPC Lattice", "Reach the IdP through a VPC Lattice resource configuration"),
|
|
71
|
+
Option("vpc", "Managed VPC endpoint", "Reach the IdP through a managed VPC endpoint"),
|
|
72
|
+
)
|
|
73
|
+
PROVIDER_INFO = {
|
|
74
|
+
"OpenAI": ("OpenAI", "OPENAI_API_KEY"),
|
|
75
|
+
"Anthropic": ("Anthropic", "ANTHROPIC_API_KEY"),
|
|
76
|
+
"Gemini": ("Google Gemini", "GEMINI_API_KEY"),
|
|
77
|
+
"Bedrock": ("Amazon Bedrock", ""),
|
|
78
|
+
"LiteLLM": ("LiteLLM", "LITELLM_API_KEY"),
|
|
79
|
+
}
|
|
80
|
+
_STEP_LABELS = {
|
|
81
|
+
"language": "Target Language",
|
|
82
|
+
"buildType": "Build",
|
|
83
|
+
"protocol": "Protocol",
|
|
84
|
+
"sdk": "Framework",
|
|
85
|
+
"modelProvider": "Model",
|
|
86
|
+
"memory": "Memory",
|
|
87
|
+
"networkMode": "Network",
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _choices(options: Any) -> list[interactive.Choice]:
|
|
92
|
+
return [interactive.Choice(o.title, o.id, o.description) for o in options]
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _err(check: Any) -> str | None:
|
|
96
|
+
"""`true | string` validator result -> prompt validator result."""
|
|
97
|
+
return None if check is True else check
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _csv(value: str) -> list[str]:
|
|
101
|
+
return [s.strip() for s in value.split(",") if s.strip()]
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def prompt_api_key(model_provider: str) -> str | None:
|
|
105
|
+
"""Port of ApiKeySecretInput: the key may be skipped and filled into .env.local later."""
|
|
106
|
+
name, _ = PROVIDER_INFO.get(model_provider, (model_provider, ""))
|
|
107
|
+
value = interactive.text(f"{name} API key (press Enter to skip)", secret=True)
|
|
108
|
+
return value.strip() or None
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def prompt_jwt_config() -> JwtConfigOptions:
|
|
112
|
+
"""Port of components/jwt-config (discovery URL, constraints, private endpoint, client credentials)."""
|
|
113
|
+
|
|
114
|
+
def validate_url(value: str) -> str | None:
|
|
115
|
+
if not js_url_ok(value):
|
|
116
|
+
return "Discovery URL must be a valid URL"
|
|
117
|
+
if not value.lower().startswith("https:"):
|
|
118
|
+
return "Discovery URL must use HTTPS"
|
|
119
|
+
if not value.endswith("/.well-known/openid-configuration"):
|
|
120
|
+
return "Discovery URL must end with /.well-known/openid-configuration"
|
|
121
|
+
return None
|
|
122
|
+
|
|
123
|
+
jwt = JwtConfigOptions(discovery_url=interactive.text("Discovery URL", validate=validate_url))
|
|
124
|
+
constraints: list[str] = []
|
|
125
|
+
while not constraints:
|
|
126
|
+
constraints = interactive.checkbox(
|
|
127
|
+
"Select JWT constraints to configure (at least one required)", _choices(JWT_CONSTRAINT_OPTIONS)
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
def required(v: str) -> str | None:
|
|
131
|
+
return None if _csv(v) else "At least one value is required"
|
|
132
|
+
|
|
133
|
+
if "audience" in constraints:
|
|
134
|
+
jwt.allowed_audience = _csv(interactive.text("Allowed Audiences (comma-separated)", validate=required))
|
|
135
|
+
if "clients" in constraints:
|
|
136
|
+
jwt.allowed_clients = _csv(interactive.text("Allowed Clients (comma-separated)", validate=required))
|
|
137
|
+
if "scopes" in constraints:
|
|
138
|
+
jwt.allowed_scopes = _csv(interactive.text("Allowed Scopes (comma-separated)", validate=required))
|
|
139
|
+
if "customClaims" in constraints:
|
|
140
|
+
|
|
141
|
+
def validate_claims(value: str) -> str | None:
|
|
142
|
+
try:
|
|
143
|
+
parsed = json.loads(value)
|
|
144
|
+
except ValueError:
|
|
145
|
+
return "Must be valid JSON"
|
|
146
|
+
if not isinstance(parsed, list) or not parsed:
|
|
147
|
+
return "Must be a non-empty JSON array"
|
|
148
|
+
for i, entry in enumerate(parsed):
|
|
149
|
+
issue = first_issue(CustomClaimValidation, entry)
|
|
150
|
+
if issue:
|
|
151
|
+
return f"Invalid custom claim at index {i}: {issue}"
|
|
152
|
+
return None
|
|
153
|
+
|
|
154
|
+
jwt.custom_claims = json.loads(
|
|
155
|
+
interactive.text("Custom claims (JSON array of claim validations)", validate=validate_claims)
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
endpoint = interactive.select(
|
|
159
|
+
"Private network access to the IdP discovery endpoint (PrivateLink)", _choices(PRIVATE_ENDPOINT_OPTIONS)
|
|
160
|
+
)
|
|
161
|
+
if endpoint == "lattice":
|
|
162
|
+
resource = interactive.text(
|
|
163
|
+
"VPC Lattice resource-config id or ARN", validate=lambda v: None if v.strip() else "Required"
|
|
164
|
+
)
|
|
165
|
+
jwt.private_endpoint = {"selfManagedLatticeResource": {"resourceConfigurationIdentifier": resource.strip()}}
|
|
166
|
+
elif endpoint == "vpc":
|
|
167
|
+
vpc = interactive.text("VPC id", validate=lambda v: _err(validate_vpc_id(v)))
|
|
168
|
+
subnets = interactive.text("Subnet IDs (comma-separated)", validate=lambda v: _err(validate_subnet_ids(v)))
|
|
169
|
+
ip_type = interactive.select(
|
|
170
|
+
"Endpoint IP address type",
|
|
171
|
+
[
|
|
172
|
+
interactive.Choice("IPV4", "IPV4", "IPv4 addressing"),
|
|
173
|
+
interactive.Choice("IPV6", "IPV6", "IPv6 addressing"),
|
|
174
|
+
],
|
|
175
|
+
)
|
|
176
|
+
sgs = interactive.text(
|
|
177
|
+
"Security group IDs (comma-separated, max 5; press Enter to skip)",
|
|
178
|
+
validate=lambda v: None if not v.strip() else _err(validate_security_group_ids(v)),
|
|
179
|
+
)
|
|
180
|
+
routing = interactive.text("Routing domain (press Enter to skip)")
|
|
181
|
+
resource_spec: dict[str, Any] = {
|
|
182
|
+
"vpcIdentifier": vpc.strip(),
|
|
183
|
+
"subnetIds": _csv(subnets),
|
|
184
|
+
"endpointIpAddressType": ip_type,
|
|
185
|
+
}
|
|
186
|
+
if sgs.strip():
|
|
187
|
+
resource_spec["securityGroupIds"] = _csv(sgs)
|
|
188
|
+
if routing.strip():
|
|
189
|
+
resource_spec["routingDomain"] = routing.strip()
|
|
190
|
+
jwt.private_endpoint = {"managedVpcResource": resource_spec}
|
|
191
|
+
|
|
192
|
+
client_id = interactive.text("OAuth Client ID (press Enter to skip)", secret=True).strip()
|
|
193
|
+
if client_id:
|
|
194
|
+
jwt.client_id = client_id
|
|
195
|
+
jwt.client_secret = interactive.text(
|
|
196
|
+
"OAuth Client Secret", secret=True, validate=lambda v: None if v.strip() else "Client secret is required"
|
|
197
|
+
)
|
|
198
|
+
return jwt
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def _prompt_mounts(kind: str, maximum: int, arn_validator: Any, network_mode: str | None) -> list[dict[str, str]]:
|
|
202
|
+
from agentcore.cli.commands.shared.filesystem_utils import validate_byo_mount_path
|
|
203
|
+
|
|
204
|
+
mounts: list[dict[str, str]] = []
|
|
205
|
+
example = "/mnt/efs-data" if kind == "EFS" else "/mnt/s3-data"
|
|
206
|
+
while len(mounts) < maximum:
|
|
207
|
+
|
|
208
|
+
def validate_arn(value: str) -> str | None:
|
|
209
|
+
if not value:
|
|
210
|
+
return None
|
|
211
|
+
if network_mode != "VPC":
|
|
212
|
+
return f"{kind} mounts require VPC network mode"
|
|
213
|
+
return _err(arn_validator(value))
|
|
214
|
+
|
|
215
|
+
arn = interactive.text(
|
|
216
|
+
f"{kind} access point ARN {len(mounts) + 1}/{maximum} (press Enter to skip):", validate=validate_arn
|
|
217
|
+
).strip()
|
|
218
|
+
if not arn:
|
|
219
|
+
break
|
|
220
|
+
path = interactive.text(
|
|
221
|
+
f"{kind} mount path for ...{arn[-30:]} (e.g. {example}):",
|
|
222
|
+
validate=lambda v: _err(validate_byo_mount_path(v)),
|
|
223
|
+
)
|
|
224
|
+
mounts.append({"accessPointArn": arn, "mountPath": path.strip()})
|
|
225
|
+
return mounts
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def _prompt_advanced(options: Any, settings: list[str], capacity_provider_names: list[str], project_root: str) -> None:
|
|
229
|
+
"""Advanced sub-steps, in upstream order. ``options`` is an AddAgentOptions."""
|
|
230
|
+
from agentcore.cli.commands.shared import filesystem_utils as fs
|
|
231
|
+
|
|
232
|
+
if "dockerfile" in settings and options.build_type == "Container":
|
|
233
|
+
|
|
234
|
+
def validate_dockerfile(value: str) -> str | None:
|
|
235
|
+
check = validate_dockerfile_input(value)
|
|
236
|
+
if check is not True:
|
|
237
|
+
return check # type: ignore[return-value]
|
|
238
|
+
if "/" in value.strip() and not os.path.exists(os.path.join(project_root, value.strip())):
|
|
239
|
+
return f"File not found: {value.strip()}"
|
|
240
|
+
return None
|
|
241
|
+
|
|
242
|
+
dockerfile = interactive.text(
|
|
243
|
+
"Custom Dockerfile path (press Enter to use the default Dockerfile)", validate=validate_dockerfile
|
|
244
|
+
).strip()
|
|
245
|
+
options.dockerfile = dockerfile or None
|
|
246
|
+
|
|
247
|
+
if "network" in settings and "capacityProvider" not in settings:
|
|
248
|
+
options.network_mode = interactive.select(_STEP_LABELS["networkMode"], _choices(NETWORK_MODE_OPTIONS))
|
|
249
|
+
if options.network_mode == "VPC":
|
|
250
|
+
options.subnets = ",".join(
|
|
251
|
+
_csv(interactive.text("Subnet IDs (comma-separated)", validate=lambda v: _err(validate_subnet_ids(v))))
|
|
252
|
+
)
|
|
253
|
+
options.security_groups = ",".join(
|
|
254
|
+
_csv(
|
|
255
|
+
interactive.text(
|
|
256
|
+
"Security group IDs (comma-separated)", validate=lambda v: _err(validate_security_group_ids(v))
|
|
257
|
+
)
|
|
258
|
+
)
|
|
259
|
+
)
|
|
260
|
+
if options.build_type == "Container":
|
|
261
|
+
options.vpc_id = interactive.text("VPC ID", validate=lambda v: _err(validate_vpc_id(v))).strip()
|
|
262
|
+
|
|
263
|
+
if "headers" in settings:
|
|
264
|
+
typer.echo(
|
|
265
|
+
"Enter header names (e.g. Authorization, X-Api-Key, X-Custom-Signature). Bare names without X- prefix "
|
|
266
|
+
"are auto-prefixed with X-Amzn-Bedrock-AgentCore-Runtime-Custom- for backward compatibility."
|
|
267
|
+
)
|
|
268
|
+
headers = interactive.text(
|
|
269
|
+
"Allowed request headers (comma-separated, or press Enter to skip)",
|
|
270
|
+
validate=lambda v: validate_header_allowlist(v).error,
|
|
271
|
+
)
|
|
272
|
+
options.request_header_allowlist = parse_and_normalize_headers(headers) if headers.strip() else None
|
|
273
|
+
|
|
274
|
+
if "auth" in settings:
|
|
275
|
+
options.authorizer_type = interactive.select(
|
|
276
|
+
"Select inbound auth type", _choices(RUNTIME_AUTHORIZER_TYPE_OPTIONS)
|
|
277
|
+
)
|
|
278
|
+
if options.authorizer_type == "CUSTOM_JWT":
|
|
279
|
+
options.jwt_config = prompt_jwt_config()
|
|
280
|
+
else:
|
|
281
|
+
options.authorizer_type = None # AWS_IAM is the default and is not written
|
|
282
|
+
|
|
283
|
+
if "lifecycle" in settings:
|
|
284
|
+
|
|
285
|
+
def lifecycle_validator(key: str):
|
|
286
|
+
def check(value: str) -> str | None:
|
|
287
|
+
if not value.strip():
|
|
288
|
+
return None
|
|
289
|
+
result = parse_and_validate_lifecycle_options({key: value.strip()})
|
|
290
|
+
return result.error
|
|
291
|
+
|
|
292
|
+
return check
|
|
293
|
+
|
|
294
|
+
rng = f"{LIFECYCLE_TIMEOUT_MIN}-{LIFECYCLE_TIMEOUT_MAX}"
|
|
295
|
+
idle = interactive.text(
|
|
296
|
+
f"Idle session timeout in seconds ({rng}, or press Enter to skip)",
|
|
297
|
+
validate=lifecycle_validator("idleTimeout"),
|
|
298
|
+
).strip()
|
|
299
|
+
options.idle_timeout = int(idle) if idle else None
|
|
300
|
+
|
|
301
|
+
def max_validator(value: str) -> str | None:
|
|
302
|
+
if not value.strip():
|
|
303
|
+
return None
|
|
304
|
+
result = parse_and_validate_lifecycle_options(
|
|
305
|
+
{"idleTimeout": options.idle_timeout, "maxLifetime": value.strip()}
|
|
306
|
+
)
|
|
307
|
+
return result.error
|
|
308
|
+
|
|
309
|
+
max_life = interactive.text(
|
|
310
|
+
f"Max instance lifetime in seconds ({rng}, or press Enter to skip)", validate=max_validator
|
|
311
|
+
).strip()
|
|
312
|
+
options.max_lifetime = int(max_life) if max_life else None
|
|
313
|
+
|
|
314
|
+
if "filesystem" in settings:
|
|
315
|
+
storage = interactive.text(
|
|
316
|
+
"Session storage mount path (e.g. /mnt/session-storage, or press Enter to skip)",
|
|
317
|
+
validate=lambda v: None if not v.strip() else session_storage_mount_path_issue(v.strip()),
|
|
318
|
+
).strip()
|
|
319
|
+
options.session_storage_mount_path = storage or None
|
|
320
|
+
options.efs_access_points = _prompt_mounts(
|
|
321
|
+
"EFS", MAX_EFS_MOUNTS, fs.validate_efs_access_point_arn, options.network_mode
|
|
322
|
+
)
|
|
323
|
+
options.s3_access_points = _prompt_mounts(
|
|
324
|
+
"S3 Files", MAX_S3_MOUNTS, fs.validate_s3_files_access_point_arn, options.network_mode
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
if "capacityProvider" in settings:
|
|
328
|
+
choices = [interactive.Choice("None", "__none__", "Use AgentCore-managed compute (default)")]
|
|
329
|
+
choices += [interactive.Choice(n, n, "Capacity provider in this project") for n in capacity_provider_names]
|
|
330
|
+
choices.append(interactive.Choice("Enter an ARN…", "__arn__", "Attach to an external capacity provider by ARN"))
|
|
331
|
+
picked = interactive.select(_STEP_LABELS.get("capacityProvider", "Capacity Provider"), choices)
|
|
332
|
+
if picked == "__arn__":
|
|
333
|
+
picked = interactive.text(
|
|
334
|
+
"Capacity provider ARN (arn:...:capacity-provider/...):",
|
|
335
|
+
validate=lambda v: None if v.startswith("arn:") else "Must be a capacity provider ARN",
|
|
336
|
+
).strip()
|
|
337
|
+
if picked != "__none__":
|
|
338
|
+
options.capacity_provider = picked
|
|
339
|
+
options.network_mode = options.subnets = options.security_groups = options.vpc_id = None
|
|
340
|
+
|
|
341
|
+
def validate_volumes(value: str) -> str | None:
|
|
342
|
+
if not value.strip():
|
|
343
|
+
return None
|
|
344
|
+
pairs = [p.split(":", 1) for p in _csv(value)]
|
|
345
|
+
if any(len(p) != 2 or not p[0] or not p[1] for p in pairs):
|
|
346
|
+
return "Use name:path pairs, e.g. model-weights:/mnt/models"
|
|
347
|
+
check = fs.validate_capacity_provider_volume_mounts(
|
|
348
|
+
[{"volumeName": n, "mountPath": m} for n, m in pairs]
|
|
349
|
+
)
|
|
350
|
+
return None if check.success else check.error
|
|
351
|
+
|
|
352
|
+
volumes = interactive.text(
|
|
353
|
+
"Capacity provider volume mounts as name:path, comma-separated (e.g. model-weights:/mnt/models) — "
|
|
354
|
+
"press Enter to skip:",
|
|
355
|
+
validate=validate_volumes,
|
|
356
|
+
)
|
|
357
|
+
options.capacity_provider_volumes = [
|
|
358
|
+
{"volumeName": n, "mountPath": m} for n, m in (p.split(":", 1) for p in _csv(volumes))
|
|
359
|
+
]
|
|
360
|
+
|
|
361
|
+
if "configBundle" in settings:
|
|
362
|
+
options.with_config_bundle = True
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
def _advanced_choices(build_type: str, framework: str | None, language: str, include_config_bundle: bool) -> list:
|
|
366
|
+
profile = get_template_profile(framework)
|
|
367
|
+
items = [
|
|
368
|
+
o
|
|
369
|
+
for o in ADVANCED_SETTING_OPTIONS
|
|
370
|
+
if (
|
|
371
|
+
o.id != "dockerfile"
|
|
372
|
+
or (build_type == "Container" and not (profile and profile.runtime and profile.runtime.dockerfile))
|
|
373
|
+
)
|
|
374
|
+
and (o.id != "filesystem" or language != "TypeScript")
|
|
375
|
+
and (o.id != "configBundle" or include_config_bundle)
|
|
376
|
+
]
|
|
377
|
+
return _choices(items)
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
def _confirm(rows: list[tuple[str, Any]]) -> bool:
|
|
381
|
+
for label, value in rows:
|
|
382
|
+
if value not in (None, "", []):
|
|
383
|
+
typer.echo(f" {label}: {value}")
|
|
384
|
+
return interactive.confirm("Create this agent?", default=True)
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
def run_add_agent_wizard(
|
|
388
|
+
existing_agent_names: list[str],
|
|
389
|
+
project_name: str,
|
|
390
|
+
capacity_provider_names: list[str],
|
|
391
|
+
project_root: str,
|
|
392
|
+
) -> Any:
|
|
393
|
+
"""Return an AddAgentOptions built from the answers, or None when the user declines."""
|
|
394
|
+
from agentcore.primitives.agent import AddAgentOptions
|
|
395
|
+
|
|
396
|
+
name = interactive.text(
|
|
397
|
+
"Agent name",
|
|
398
|
+
default=generate_unique_name("MyAgent", existing_agent_names),
|
|
399
|
+
validate=lambda v: (
|
|
400
|
+
first_issue(AgentName, v) or ("Agent name already exists" if v in existing_agent_names else None)
|
|
401
|
+
),
|
|
402
|
+
)
|
|
403
|
+
agent_type = interactive.select("Select agent type", _choices(AGENT_TYPE_OPTIONS))
|
|
404
|
+
options = AddAgentOptions(name=name, type=agent_type)
|
|
405
|
+
|
|
406
|
+
if agent_type == "import":
|
|
407
|
+
return _import_flow(options)
|
|
408
|
+
if agent_type == "byo":
|
|
409
|
+
return _byo_flow(options, capacity_provider_names, project_root)
|
|
410
|
+
|
|
411
|
+
# create: the generate wizard
|
|
412
|
+
options.language = interactive.select(_STEP_LABELS["language"], _choices(LANGUAGE_OPTIONS))
|
|
413
|
+
options.build_type = interactive.select(_STEP_LABELS["buildType"], _choices(BUILD_TYPE_OPTIONS))
|
|
414
|
+
options.protocol = interactive.select(
|
|
415
|
+
_STEP_LABELS["protocol"], _choices(get_protocol_options_for_language(options.language))
|
|
416
|
+
)
|
|
417
|
+
options.memory = "none"
|
|
418
|
+
if options.protocol == "MCP":
|
|
419
|
+
options.framework, options.model_provider = "Strands", "Bedrock"
|
|
420
|
+
else:
|
|
421
|
+
options.framework = interactive.select(
|
|
422
|
+
_STEP_LABELS["sdk"], _choices(get_sdk_options_for_protocol(options.protocol, options.language))
|
|
423
|
+
)
|
|
424
|
+
profile = get_template_profile(options.framework)
|
|
425
|
+
if profile:
|
|
426
|
+
options.build_type = profile.required_options.get("build", options.build_type)
|
|
427
|
+
options.model_provider = profile.default_options.get("modelProvider", options.model_provider)
|
|
428
|
+
if template_uses_model(options.framework):
|
|
429
|
+
options.model_provider = interactive.select(
|
|
430
|
+
_STEP_LABELS["modelProvider"], _choices(get_model_provider_options_for_sdk(options.framework))
|
|
431
|
+
)
|
|
432
|
+
if options.model_provider != "Bedrock":
|
|
433
|
+
options.api_key = prompt_api_key(options.model_provider)
|
|
434
|
+
if options.framework == "Strands":
|
|
435
|
+
memory_options = [
|
|
436
|
+
o for o in MEMORY_OPTIONS if not (options.language == "TypeScript" and o.id == "shortTerm")
|
|
437
|
+
]
|
|
438
|
+
options.memory = interactive.select(_STEP_LABELS["memory"], _choices(memory_options))
|
|
439
|
+
|
|
440
|
+
settings = interactive.checkbox(
|
|
441
|
+
"Customize advanced settings (select settings to configure; unselected items use defaults)",
|
|
442
|
+
_advanced_choices(options.build_type, options.framework, options.language, include_config_bundle=True),
|
|
443
|
+
)
|
|
444
|
+
_prompt_advanced(options, settings, capacity_provider_names, project_root)
|
|
445
|
+
|
|
446
|
+
rows = [
|
|
447
|
+
("Name", options.name),
|
|
448
|
+
("Language", options.language),
|
|
449
|
+
("Build", options.build_type),
|
|
450
|
+
("Protocol", options.protocol),
|
|
451
|
+
("Framework", None if options.protocol == "MCP" else options.framework),
|
|
452
|
+
("Model", None if options.protocol == "MCP" else options.model_provider),
|
|
453
|
+
("Memory", options.memory if options.framework == "Strands" else None),
|
|
454
|
+
]
|
|
455
|
+
return options if _confirm(rows) else None
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
def _byo_flow(options: Any, capacity_provider_names: list[str], project_root: str) -> Any:
|
|
459
|
+
from agentcore.lib import APP_DIR
|
|
460
|
+
|
|
461
|
+
code_location = interactive.text(
|
|
462
|
+
"Code location (relative to the project root)", default=f"{APP_DIR}/{options.name}/"
|
|
463
|
+
).strip()
|
|
464
|
+
options.code_location = code_location if code_location.endswith("/") else f"{code_location}/"
|
|
465
|
+
options.entrypoint = interactive.text("Entrypoint file", default="main.py").strip() or "main.py"
|
|
466
|
+
options.build_type = interactive.select("Select build type", _choices(BUILD_TYPE_OPTIONS))
|
|
467
|
+
options.model_provider = interactive.select(
|
|
468
|
+
"Select model provider", _choices(get_model_provider_options_for_sdk("Strands"))
|
|
469
|
+
)
|
|
470
|
+
if options.model_provider != "Bedrock":
|
|
471
|
+
options.api_key = prompt_api_key(options.model_provider)
|
|
472
|
+
options.language = "Python"
|
|
473
|
+
options.framework = "Strands"
|
|
474
|
+
settings = interactive.checkbox(
|
|
475
|
+
"Customize advanced settings (select settings to configure; unselected items use defaults)",
|
|
476
|
+
_advanced_choices(options.build_type, None, "Python", include_config_bundle=False),
|
|
477
|
+
)
|
|
478
|
+
_prompt_advanced(options, settings, capacity_provider_names, project_root)
|
|
479
|
+
rows = [
|
|
480
|
+
("Name", options.name),
|
|
481
|
+
("Type", "Bring my own code"),
|
|
482
|
+
("Code", options.code_location),
|
|
483
|
+
("Entrypoint", options.entrypoint),
|
|
484
|
+
("Build", options.build_type),
|
|
485
|
+
("Model", options.model_provider),
|
|
486
|
+
]
|
|
487
|
+
return options if _confirm(rows) else None
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
def _import_flow(options: Any) -> Any:
|
|
491
|
+
from agentcore.aws.bedrock_import import list_bedrock_agent_aliases, list_bedrock_agents
|
|
492
|
+
from agentcore.operations.agent.import_ import BEDROCK_REGIONS, IMPORT_FRAMEWORK_OPTIONS
|
|
493
|
+
|
|
494
|
+
region = interactive.select(
|
|
495
|
+
"Select AWS region", [interactive.Choice(f"{r.id} — {r.title}", r.id) for r in BEDROCK_REGIONS]
|
|
496
|
+
)
|
|
497
|
+
agents = list_bedrock_agents(region)
|
|
498
|
+
if not agents:
|
|
499
|
+
raise Exception(f"No Bedrock Agents found in {region}.")
|
|
500
|
+
agent_id = interactive.select(
|
|
501
|
+
"Select Bedrock Agent",
|
|
502
|
+
[interactive.Choice(a["agentName"], a["agentId"], a.get("description")) for a in agents],
|
|
503
|
+
)
|
|
504
|
+
aliases = list_bedrock_agent_aliases(region, agent_id)
|
|
505
|
+
if not aliases:
|
|
506
|
+
raise Exception("No aliases found for this agent.")
|
|
507
|
+
alias_id = interactive.select(
|
|
508
|
+
"Select Agent Alias",
|
|
509
|
+
[interactive.Choice(a["aliasName"], a["aliasId"], a.get("description")) for a in aliases],
|
|
510
|
+
)
|
|
511
|
+
options.framework = interactive.select("Select framework", _choices(IMPORT_FRAMEWORK_OPTIONS))
|
|
512
|
+
options.memory = interactive.select("Select memory configuration", _choices(MEMORY_OPTIONS))
|
|
513
|
+
auth = interactive.select("Select inbound auth mode", _choices(RUNTIME_AUTHORIZER_TYPE_OPTIONS))
|
|
514
|
+
if auth == "CUSTOM_JWT":
|
|
515
|
+
options.authorizer_type = auth
|
|
516
|
+
options.jwt_config = prompt_jwt_config()
|
|
517
|
+
options.bedrock_region, options.bedrock_agent_id, options.bedrock_alias_id = region, agent_id, alias_id
|
|
518
|
+
options.language, options.model_provider = "Python", "Bedrock"
|
|
519
|
+
rows = [
|
|
520
|
+
("Name", options.name),
|
|
521
|
+
("Type", "Import from Bedrock Agents"),
|
|
522
|
+
("Region", region),
|
|
523
|
+
("Agent", agent_id),
|
|
524
|
+
("Alias", alias_id),
|
|
525
|
+
("Framework", options.framework),
|
|
526
|
+
("Memory", options.memory),
|
|
527
|
+
]
|
|
528
|
+
return options if _confirm(rows) else None
|