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,65 @@
|
|
|
1
|
+
"""Presentation helpers for insights jobs (port of operations/jobs/insights/format.ts)."""
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from agentcore.operations.jobs.batch_evaluation.format import summary_line
|
|
8
|
+
from agentcore.operations.jobs.shared.format import format_job_date
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def print_insights_history(records: list[dict[str, Any]]) -> None:
|
|
12
|
+
if not records:
|
|
13
|
+
typer.echo("No insights jobs found. Run `agentcore run insights` to create one.")
|
|
14
|
+
return
|
|
15
|
+
typer.echo(f"\n{'Date'.ljust(22)} {'Status'.ljust(22)} {'Insights'.ljust(28)} ID")
|
|
16
|
+
typer.echo("─" * 100)
|
|
17
|
+
for r in records:
|
|
18
|
+
typer.echo(
|
|
19
|
+
f"{format_job_date(r.get('createdAt')).ljust(22)} {str(r.get('status')).ljust(22)} "
|
|
20
|
+
f"{', '.join(r.get('insights') or []).ljust(28)} {r['id']}"
|
|
21
|
+
)
|
|
22
|
+
typer.echo("")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def print_insights_detail(record: dict[str, Any]) -> None:
|
|
26
|
+
typer.echo(f"\nInsights job: {record['id']}")
|
|
27
|
+
typer.echo(f"Name: {record.get('name')}")
|
|
28
|
+
typer.echo(f"Status: {record.get('status')}")
|
|
29
|
+
typer.echo(f"Agent: {record.get('agent')}")
|
|
30
|
+
typer.echo(f"Insights: {', '.join(record.get('insights') or [])}")
|
|
31
|
+
if record.get("evaluators"):
|
|
32
|
+
typer.echo(f"Evaluators: {', '.join(record['evaluators'])}")
|
|
33
|
+
typer.echo(f"Started: {format_job_date(record.get('createdAt'))}")
|
|
34
|
+
if record.get("completedAt"):
|
|
35
|
+
typer.echo(f"Completed: {format_job_date(record['completedAt'])}")
|
|
36
|
+
|
|
37
|
+
categories = (record.get("failureAnalysisResult") or {}).get("failureCategories")
|
|
38
|
+
if categories:
|
|
39
|
+
typer.echo("\nFailure Analysis:")
|
|
40
|
+
for cat in categories:
|
|
41
|
+
typer.echo(f"\n Category: {cat.get('failureCategoryName') or 'Unknown'}")
|
|
42
|
+
if cat.get("failureCategoryDescription"):
|
|
43
|
+
typer.echo(f" Description: {cat['failureCategoryDescription']}")
|
|
44
|
+
if cat.get("categoryGroupName"):
|
|
45
|
+
typer.echo(f" Group: {cat['categoryGroupName']}")
|
|
46
|
+
for rc in cat.get("rootCauses") or []:
|
|
47
|
+
typer.echo(f" Root cause: {rc.get('rootCauseCategory') or 'Unknown'}")
|
|
48
|
+
if rc.get("rootCauseDescription"):
|
|
49
|
+
typer.echo(f" {rc['rootCauseDescription']}")
|
|
50
|
+
if rc.get("recommendation"):
|
|
51
|
+
typer.echo(f" Recommendation: {rc['recommendation']}")
|
|
52
|
+
if rc.get("relatedSessions"):
|
|
53
|
+
sessions = ", ".join(str(s.get("sessionId") or "") for s in rc["relatedSessions"])
|
|
54
|
+
typer.echo(f" Sessions: {sessions}")
|
|
55
|
+
else:
|
|
56
|
+
summaries = (record.get("evaluationResults") or {}).get("evaluatorSummaries")
|
|
57
|
+
if summaries:
|
|
58
|
+
typer.echo("\nEvaluation Results:")
|
|
59
|
+
for s in summaries:
|
|
60
|
+
typer.echo(summary_line(s))
|
|
61
|
+
else:
|
|
62
|
+
typer.echo("\nResults not yet available.")
|
|
63
|
+
if record.get("logFilePath"):
|
|
64
|
+
typer.echo(f"\nLog: {record['logFilePath']}")
|
|
65
|
+
typer.echo("")
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"""Insights job handler (port of operations/jobs/insights/handler.ts). Insights jobs are not stoppable."""
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
import time
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from agentcore.aws import agentcore_batch_evaluation as api
|
|
8
|
+
from agentcore.aws.cloudwatch import resolve_endpoint_name, runtime_log_group
|
|
9
|
+
from agentcore.lib import ConfigIO, JobNotFoundError, ResourceNotFoundError, ValidationError
|
|
10
|
+
from agentcore.lib.errors.types import to_error
|
|
11
|
+
from agentcore.lib.result import Err, Ok
|
|
12
|
+
from agentcore.lib.schemas.io.config_io import to_jsonable
|
|
13
|
+
from agentcore.lib.utils.json_format import to_json_string
|
|
14
|
+
from agentcore.operations.jobs.batch_evaluation.build_source import resolve_batch_evaluator_ids
|
|
15
|
+
from agentcore.operations.jobs.batch_evaluation.handler import new_logger
|
|
16
|
+
from agentcore.operations.jobs.shared.constants import NOT_FOUND_STATUS
|
|
17
|
+
from agentcore.operations.jobs.shared.format import iso_from_ms, iso_now
|
|
18
|
+
from agentcore.operations.jobs.shared.region import region_of, resolve_job_region
|
|
19
|
+
from agentcore.operations.jobs.shared.resolve_agent_state import deployed_dict, resolve_agent_state
|
|
20
|
+
from agentcore.operations.jobs.shared.storage import drop_undefined
|
|
21
|
+
|
|
22
|
+
NAME_PATTERN = re.compile(r"^[a-zA-Z][a-zA-Z0-9_]{0,47}$")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def validate_lookback_days(lookback_days: Any) -> None:
|
|
26
|
+
if not isinstance(lookback_days, int) or isinstance(lookback_days, bool) or lookback_days < 1:
|
|
27
|
+
raise ValidationError("--lookback-days must be a positive integer (at least 1).")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def resolve_insights_name(name: str | None, project_name: str, agent: str) -> str:
|
|
31
|
+
if name:
|
|
32
|
+
if not NAME_PATTERN.match(name):
|
|
33
|
+
raise ValidationError(
|
|
34
|
+
f'Job name "{name}" is invalid. Must begin with a letter and contain only alphanumeric characters '
|
|
35
|
+
"and underscores (max 48 chars)."
|
|
36
|
+
)
|
|
37
|
+
return name
|
|
38
|
+
return re.sub(r"[^a-zA-Z0-9_]", "_", f"{project_name}_{agent}_insights_{int(time.time() * 1000)}")[:48]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def build_filter_config(
|
|
42
|
+
session_ids: list[str] | None, lookback_days: int | None, start_time: str | None, end_time: str | None
|
|
43
|
+
) -> dict[str, Any] | None:
|
|
44
|
+
effective = list(dict.fromkeys(session_ids or []))
|
|
45
|
+
if effective:
|
|
46
|
+
return {"sessionIds": effective}
|
|
47
|
+
if start_time or end_time:
|
|
48
|
+
return {"timeRange": drop_undefined({"startTime": start_time, "endTime": end_time})}
|
|
49
|
+
if lookback_days is not None:
|
|
50
|
+
validate_lookback_days(lookback_days)
|
|
51
|
+
return {
|
|
52
|
+
"timeRange": {
|
|
53
|
+
"startTime": iso_from_ms(time.time() * 1000 - lookback_days * 24 * 60 * 60 * 1000),
|
|
54
|
+
"endTime": iso_now(),
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return None
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def create(opts: dict[str, Any], config_io: ConfigIO) -> Ok | Err:
|
|
61
|
+
logger = new_logger("insights")
|
|
62
|
+
try:
|
|
63
|
+
if logger:
|
|
64
|
+
logger.start_step("Load project config")
|
|
65
|
+
project = to_jsonable(config_io.read_project_spec())
|
|
66
|
+
deployed_state = deployed_dict(config_io.read_deployed_state())
|
|
67
|
+
aws_targets = config_io.resolve_aws_deployment_targets()
|
|
68
|
+
region = resolve_job_region(opts.get("region"), aws_targets)
|
|
69
|
+
if logger:
|
|
70
|
+
logger.end_step("success")
|
|
71
|
+
|
|
72
|
+
runtimes = project.get("runtimes") or []
|
|
73
|
+
agent_name = opts.get("agent") or (runtimes[0]["name"] if runtimes else "")
|
|
74
|
+
online_arn = opts.get("onlineEvalConfigArn")
|
|
75
|
+
|
|
76
|
+
if online_arn:
|
|
77
|
+
if logger:
|
|
78
|
+
logger.start_step("Use online eval config source")
|
|
79
|
+
data_source: dict[str, Any] = {"onlineEvaluationConfigSource": {"onlineEvaluationConfigArn": online_arn}}
|
|
80
|
+
if logger:
|
|
81
|
+
logger.end_step("success")
|
|
82
|
+
else:
|
|
83
|
+
if logger:
|
|
84
|
+
logger.start_step("Resolve agent")
|
|
85
|
+
agent_state = resolve_agent_state(deployed_state, agent_name)
|
|
86
|
+
if not agent_state:
|
|
87
|
+
err = ResourceNotFoundError(f'Agent "{agent_name}" not deployed. Run `agentcore deploy` first.')
|
|
88
|
+
if logger:
|
|
89
|
+
logger.end_step("error", err.message)
|
|
90
|
+
logger.finalize(False)
|
|
91
|
+
return Err(err)
|
|
92
|
+
service_name = f"{project['name']}_{agent_name}.{resolve_endpoint_name(opts.get('endpoint'))}"
|
|
93
|
+
log_group = runtime_log_group(agent_state["runtimeId"], opts.get("endpoint"))
|
|
94
|
+
if logger:
|
|
95
|
+
logger.log(f"Service name: {service_name}")
|
|
96
|
+
logger.log(f"Log group: {log_group}")
|
|
97
|
+
logger.end_step("success")
|
|
98
|
+
filter_config = build_filter_config(
|
|
99
|
+
opts.get("sessionIds"), opts.get("lookbackDays"), opts.get("startTime"), opts.get("endTime")
|
|
100
|
+
)
|
|
101
|
+
cw: dict[str, Any] = {"serviceNames": [service_name], "logGroupNames": [log_group]}
|
|
102
|
+
if filter_config:
|
|
103
|
+
cw["filterConfig"] = filter_config
|
|
104
|
+
data_source = {"cloudWatchLogs": cw}
|
|
105
|
+
|
|
106
|
+
eval_name = resolve_insights_name(opts.get("name"), project["name"], agent_name)
|
|
107
|
+
resolved = (
|
|
108
|
+
resolve_batch_evaluator_ids(deployed_state, agent_name, opts["evaluators"])
|
|
109
|
+
if opts.get("evaluators")
|
|
110
|
+
else None
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
if logger:
|
|
114
|
+
logger.start_step("Start insights job")
|
|
115
|
+
on_progress = opts.get("onProgress")
|
|
116
|
+
if on_progress:
|
|
117
|
+
on_progress("starting", f'Starting insights job "{eval_name}"...')
|
|
118
|
+
start = api.start_batch_evaluation(
|
|
119
|
+
region=region,
|
|
120
|
+
name=eval_name,
|
|
121
|
+
insights=None if online_arn else [{"insightId": i} for i in opts.get("insights") or []],
|
|
122
|
+
evaluators=[{"evaluatorId": i} for i in resolved] if (not online_arn and resolved) else None,
|
|
123
|
+
data_source_config=data_source, # type: ignore[arg-type]
|
|
124
|
+
client_token=api.generate_client_token(),
|
|
125
|
+
kms_key_arn=opts.get("kmsKeyArn"),
|
|
126
|
+
)
|
|
127
|
+
if logger:
|
|
128
|
+
logger.log(f"Response: {to_json_string(start)}")
|
|
129
|
+
logger.end_step("success")
|
|
130
|
+
if on_progress:
|
|
131
|
+
on_progress("started", f"Insights job created: {start['batchEvaluationId']} ({start['status']})")
|
|
132
|
+
if logger:
|
|
133
|
+
logger.finalize(True)
|
|
134
|
+
|
|
135
|
+
record = {
|
|
136
|
+
"type": "insights",
|
|
137
|
+
"id": start["batchEvaluationId"],
|
|
138
|
+
"arn": start["batchEvaluationArn"],
|
|
139
|
+
"status": start["status"],
|
|
140
|
+
"createdAt": start.get("createdAt") or iso_now(),
|
|
141
|
+
"agent": agent_name,
|
|
142
|
+
"logFilePath": logger.log_file_path if logger else None,
|
|
143
|
+
"name": eval_name,
|
|
144
|
+
"insights": opts.get("insights") or [],
|
|
145
|
+
"evaluators": resolved,
|
|
146
|
+
}
|
|
147
|
+
return Ok(drop_undefined(record))
|
|
148
|
+
except Exception as exc: # noqa: BLE001
|
|
149
|
+
if logger:
|
|
150
|
+
logger.finalize(False)
|
|
151
|
+
return Err(to_error(exc))
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def refresh(record: dict[str, Any]) -> Ok | Err:
|
|
155
|
+
try:
|
|
156
|
+
response = api.get_batch_evaluation(region=region_of(record["arn"]), batch_evaluation_id=record["id"])
|
|
157
|
+
except JobNotFoundError:
|
|
158
|
+
return Ok({**record, "status": NOT_FOUND_STATUS})
|
|
159
|
+
except Exception as exc: # noqa: BLE001
|
|
160
|
+
return Err(to_error(exc))
|
|
161
|
+
updated = {
|
|
162
|
+
**record,
|
|
163
|
+
"status": response["status"],
|
|
164
|
+
"completedAt": response.get("updatedAt") or record.get("completedAt"),
|
|
165
|
+
"evaluationResults": response.get("evaluationResults") or record.get("evaluationResults"),
|
|
166
|
+
"failureAnalysisResult": response.get("failureAnalysisResult") or record.get("failureAnalysisResult"),
|
|
167
|
+
}
|
|
168
|
+
return Ok(drop_undefined(updated))
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def archive(record: dict[str, Any]) -> Ok | Err:
|
|
172
|
+
try:
|
|
173
|
+
api.delete_batch_evaluation(region=region_of(record["arn"]), batch_evaluation_id=record["id"])
|
|
174
|
+
return Ok(None)
|
|
175
|
+
except JobNotFoundError:
|
|
176
|
+
return Ok(None)
|
|
177
|
+
except Exception as exc: # noqa: BLE001
|
|
178
|
+
return Err(to_error(exc))
|
|
File without changes
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""Sync agentcore.json after the server applies a recommendation to a config bundle
|
|
2
|
+
(port of operations/jobs/recommendation/apply-to-bundle.ts)."""
|
|
3
|
+
|
|
4
|
+
import re
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from agentcore.aws import agentcore_config_bundles as bundles_api
|
|
8
|
+
from agentcore.lib import ConfigIO, ResourceNotFoundError
|
|
9
|
+
from agentcore.lib.result import Err, Ok
|
|
10
|
+
from agentcore.lib.schemas.io.config_io import to_jsonable
|
|
11
|
+
from agentcore.operations.jobs.shared.resolve_agent_state import deployed_dict
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _bundle_id_from_arn(arn: str) -> str | None:
|
|
15
|
+
m = re.search(r"configuration-bundle/(.+)$", arn)
|
|
16
|
+
return m.group(1) if m else None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def apply_recommendation_to_bundle(
|
|
20
|
+
*,
|
|
21
|
+
result: dict[str, Any],
|
|
22
|
+
region: str,
|
|
23
|
+
bundle_name: str | None = None,
|
|
24
|
+
bundle_arn: str | None = None,
|
|
25
|
+
config_io: ConfigIO | None = None,
|
|
26
|
+
) -> Ok | Err:
|
|
27
|
+
"""Ok({"newVersionId": ...}) after syncing local components to the new bundle version."""
|
|
28
|
+
config_io = config_io or ConfigIO()
|
|
29
|
+
result_bundle = (result.get("systemPromptRecommendationResult") or {}).get("configurationBundle") or (
|
|
30
|
+
result.get("toolDescriptionRecommendationResult") or {}
|
|
31
|
+
).get("configurationBundle")
|
|
32
|
+
if not result_bundle:
|
|
33
|
+
return Err(
|
|
34
|
+
Exception(
|
|
35
|
+
"Recommendation result does not contain a new config bundle version. The server may not have "
|
|
36
|
+
"applied the recommendation to the bundle."
|
|
37
|
+
)
|
|
38
|
+
)
|
|
39
|
+
bundle_id = _bundle_id_from_arn(result_bundle["bundleArn"])
|
|
40
|
+
if not bundle_id:
|
|
41
|
+
return Err(Exception(f"Could not extract bundle ID from ARN: {result_bundle['bundleArn']}"))
|
|
42
|
+
|
|
43
|
+
new_version = bundles_api.get_configuration_bundle_version(
|
|
44
|
+
region=region, bundle_id=bundle_id, version_id=result_bundle["versionId"]
|
|
45
|
+
)
|
|
46
|
+
spec = to_jsonable(config_io.read_project_spec())
|
|
47
|
+
deployed_state = deployed_dict(config_io.read_deployed_state())
|
|
48
|
+
|
|
49
|
+
name = bundle_name
|
|
50
|
+
if not name and bundle_arn:
|
|
51
|
+
for target in (deployed_state.get("targets") or {}).values():
|
|
52
|
+
for n, state in (((target or {}).get("resources") or {}).get("configBundles") or {}).items():
|
|
53
|
+
if state.get("bundleArn") == bundle_arn:
|
|
54
|
+
name = n
|
|
55
|
+
break
|
|
56
|
+
if name:
|
|
57
|
+
break
|
|
58
|
+
|
|
59
|
+
identifier = name or bundle_arn or "unknown"
|
|
60
|
+
bundle = next((b for b in spec.get("configBundles") or [] if b.get("name") == name), None) if name else None
|
|
61
|
+
if not bundle:
|
|
62
|
+
return Err(ResourceNotFoundError(f'Config bundle "{identifier}" not found in agentcore.json.'))
|
|
63
|
+
|
|
64
|
+
bundle["components"] = new_version.get("components")
|
|
65
|
+
commit_message = (new_version.get("lineageMetadata") or {}).get("commitMessage")
|
|
66
|
+
if commit_message:
|
|
67
|
+
bundle["commitMessage"] = commit_message
|
|
68
|
+
config_io.write_project_spec(spec)
|
|
69
|
+
|
|
70
|
+
for target in (deployed_state.get("targets") or {}).values():
|
|
71
|
+
state = (((target or {}).get("resources") or {}).get("configBundles") or {}).get(identifier)
|
|
72
|
+
if state:
|
|
73
|
+
state["versionId"] = result_bundle["versionId"]
|
|
74
|
+
break
|
|
75
|
+
config_io.write_deployed_state(deployed_state)
|
|
76
|
+
return Ok({"newVersionId": result_bundle["versionId"]})
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
"""Recommendation start-time pipeline (port of operations/jobs/recommendation/build-config.ts).
|
|
2
|
+
|
|
3
|
+
Evaluator name -> ARN resolution, account-id extraction, config-bundle JSONPath component
|
|
4
|
+
resolution, failure extraction, and the recommendationConfig builder (incl. the span fetch).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
import re
|
|
9
|
+
import time
|
|
10
|
+
from collections.abc import Callable
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
from agentcore.aws.cloudwatch import runtime_log_group
|
|
14
|
+
from agentcore.aws.partition import arn_prefix
|
|
15
|
+
from agentcore.lib import ValidationError
|
|
16
|
+
from agentcore.operations.jobs.recommendation import fetch_session_spans as _spans
|
|
17
|
+
from agentcore.operations.jobs.shared.constants import MAX_INLINE_SPANS, MAX_TOOL_NAME_LENGTH, TOOL_NAME_REGEX
|
|
18
|
+
from agentcore.operations.jobs.shared.format import iso_from_ms, iso_now
|
|
19
|
+
from agentcore.operations.jobs.shared.resolve_agent_state import iter_target_resources
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def resolve_evaluator_id(deployed_state: dict[str, Any], evaluator: str, region: str) -> str | None:
|
|
23
|
+
"""ARN passthrough, Builtin.* expansion to a full ARN, or deployed custom-evaluator lookup."""
|
|
24
|
+
if evaluator.startswith("arn:"):
|
|
25
|
+
return evaluator
|
|
26
|
+
if evaluator.startswith("Builtin."):
|
|
27
|
+
return f"{arn_prefix(region)}:bedrock-agentcore:::evaluator/{evaluator}"
|
|
28
|
+
for resources in iter_target_resources(deployed_state):
|
|
29
|
+
state = (resources.get("evaluators") or {}).get(evaluator)
|
|
30
|
+
if state:
|
|
31
|
+
return state.get("evaluatorArn")
|
|
32
|
+
return None
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def extract_account_id_from_arn(arn: str) -> str:
|
|
36
|
+
parts = arn.split(":")
|
|
37
|
+
return parts[4] if len(parts) > 4 and re.fullmatch(r"\d{12}", parts[4]) else "*"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def resolve_component_key_for_json_path(key: str, deployed_state: dict[str, Any]) -> str:
|
|
41
|
+
"""Resolve ``{{runtime:...}}`` / ``{{gateway:...}}`` component keys to deployed ARNs."""
|
|
42
|
+
if key.startswith("arn:"):
|
|
43
|
+
return key
|
|
44
|
+
rt = re.fullmatch(r"\{\{runtime:(.+)\}\}", key)
|
|
45
|
+
if rt:
|
|
46
|
+
for resources in iter_target_resources(deployed_state):
|
|
47
|
+
runtime = (resources.get("runtimes") or {}).get(rt.group(1))
|
|
48
|
+
if runtime:
|
|
49
|
+
return runtime["runtimeArn"]
|
|
50
|
+
gw = re.fullmatch(r"\{\{gateway:(.+)\}\}", key)
|
|
51
|
+
if gw:
|
|
52
|
+
for resources in iter_target_resources(deployed_state):
|
|
53
|
+
http_gw = (resources.get("gateways") or {}).get(gw.group(1))
|
|
54
|
+
if http_gw:
|
|
55
|
+
return http_gw["gatewayArn"]
|
|
56
|
+
mcp_gw = (((resources.get("mcp") or {}).get("gateways")) or {}).get(gw.group(1))
|
|
57
|
+
if mcp_gw:
|
|
58
|
+
return mcp_gw["gatewayArn"]
|
|
59
|
+
return key
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def resolve_bundle_version_id(bundle_arn: str, version_ref: str, deployed_state: dict[str, Any]) -> str | None:
|
|
63
|
+
"""Expand 'LATEST' to the deployed versionId; explicit versions are returned verbatim."""
|
|
64
|
+
if version_ref != "LATEST":
|
|
65
|
+
return version_ref
|
|
66
|
+
for resources in iter_target_resources(deployed_state):
|
|
67
|
+
for bundle in (resources.get("configBundles") or {}).values():
|
|
68
|
+
if bundle.get("bundleArn") == bundle_arn and bundle.get("versionId"):
|
|
69
|
+
return bundle["versionId"]
|
|
70
|
+
return None
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def extract_failure_details(status_reasons: list[str] | None, recommendation_result: dict | None) -> str | None:
|
|
74
|
+
parts: list[str] = []
|
|
75
|
+
if status_reasons:
|
|
76
|
+
parts.append("; ".join(status_reasons))
|
|
77
|
+
if recommendation_result:
|
|
78
|
+
source = recommendation_result.get("systemPromptRecommendationResult") or recommendation_result.get(
|
|
79
|
+
"toolDescriptionRecommendationResult"
|
|
80
|
+
)
|
|
81
|
+
if source:
|
|
82
|
+
if source.get("errorCode"):
|
|
83
|
+
parts.append(f"[{source['errorCode']}]")
|
|
84
|
+
if source.get("errorMessage"):
|
|
85
|
+
parts.append(source["errorMessage"])
|
|
86
|
+
return " ".join(parts) if parts else None
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _days_ago_iso(days: float) -> str:
|
|
90
|
+
return iso_from_ms(time.time() * 1000 - days * 24 * 60 * 60 * 1000)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def build_recommendation_config(
|
|
94
|
+
*,
|
|
95
|
+
type: str,
|
|
96
|
+
input_source: str,
|
|
97
|
+
trace_source: str,
|
|
98
|
+
runtime_id: str,
|
|
99
|
+
account_id: str,
|
|
100
|
+
region: str,
|
|
101
|
+
evaluator_ids: list[str],
|
|
102
|
+
inline_content: str | None = None,
|
|
103
|
+
bundle_arn: str | None = None,
|
|
104
|
+
bundle_version: str | None = None,
|
|
105
|
+
system_prompt_json_path: str | None = None,
|
|
106
|
+
tool_desc_json_paths: list[dict[str, str]] | None = None,
|
|
107
|
+
tools: list[str] | None = None,
|
|
108
|
+
lookback_days: int | None = None,
|
|
109
|
+
session_ids: list[str] | None = None,
|
|
110
|
+
spans_file: str | None = None,
|
|
111
|
+
from_insights: str | None = None,
|
|
112
|
+
batch_evaluation_arn: str | None = None,
|
|
113
|
+
online_evaluation_arn: str | None = None,
|
|
114
|
+
on_progress: Callable[[str, str], None] | None = None,
|
|
115
|
+
logger: Any = None,
|
|
116
|
+
) -> dict[str, Any]:
|
|
117
|
+
"""Build the recommendationConfig request body (may fetch spans for 'sessions')."""
|
|
118
|
+
progress = on_progress or (lambda _s, _m: None)
|
|
119
|
+
if trace_source == "batch-evaluation":
|
|
120
|
+
if batch_evaluation_arn:
|
|
121
|
+
batch_eval_arn = batch_evaluation_arn
|
|
122
|
+
elif from_insights:
|
|
123
|
+
from agentcore.operations.jobs.shared.storage import load_record
|
|
124
|
+
|
|
125
|
+
record = load_record("insights", from_insights)
|
|
126
|
+
if not record:
|
|
127
|
+
raise Exception(f'Insights run "{from_insights}" not found.')
|
|
128
|
+
if record.get("status") not in ("COMPLETED", "COMPLETED_WITH_ERRORS"):
|
|
129
|
+
raise Exception(
|
|
130
|
+
f'Insights run "{from_insights}" has status {record.get("status")}. '
|
|
131
|
+
"Only COMPLETED runs can be used as recommendation source."
|
|
132
|
+
)
|
|
133
|
+
batch_eval_arn = record["arn"]
|
|
134
|
+
else:
|
|
135
|
+
raise Exception(
|
|
136
|
+
"Either --from-insights or --batch-evaluation-arn is required for batch-evaluation trace source."
|
|
137
|
+
)
|
|
138
|
+
agent_traces: dict[str, Any] = {"batchEvaluation": {"batchEvaluationArn": batch_eval_arn}}
|
|
139
|
+
elif trace_source == "online-evaluation":
|
|
140
|
+
if not online_evaluation_arn:
|
|
141
|
+
raise Exception("--online-evaluation-arn is required for online-evaluation trace source.")
|
|
142
|
+
days = lookback_days if lookback_days is not None else 7
|
|
143
|
+
agent_traces = {
|
|
144
|
+
"onlineEvaluation": {
|
|
145
|
+
"onlineEvaluationConfigArn": online_evaluation_arn,
|
|
146
|
+
"startTime": _days_ago_iso(days),
|
|
147
|
+
"endTime": iso_now(),
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
elif trace_source == "spans-file" and spans_file:
|
|
151
|
+
with open(spans_file, encoding="utf-8") as fh:
|
|
152
|
+
session_spans = json.load(fh)
|
|
153
|
+
spans_list = session_spans if isinstance(session_spans, list) else [session_spans]
|
|
154
|
+
if len(spans_list) > MAX_INLINE_SPANS:
|
|
155
|
+
raise ValidationError(
|
|
156
|
+
f"Spans file contains {len(spans_list)} spans, which exceeds the maximum of {MAX_INLINE_SPANS}. "
|
|
157
|
+
"Reduce the number of spans or use CloudWatch-based trace collection instead."
|
|
158
|
+
)
|
|
159
|
+
agent_traces = {"sessionSpans": spans_list}
|
|
160
|
+
elif trace_source == "sessions" and session_ids:
|
|
161
|
+
progress("fetching-spans", "Fetching session spans from CloudWatch...")
|
|
162
|
+
if logger:
|
|
163
|
+
logger.log(
|
|
164
|
+
"Auto-fetching spans for selected sessions (CloudWatch config does not support session ID filtering)"
|
|
165
|
+
)
|
|
166
|
+
all_spans: list[Any] = []
|
|
167
|
+
|
|
168
|
+
def on_span_progress(msg: str) -> None:
|
|
169
|
+
if logger:
|
|
170
|
+
logger.log(msg)
|
|
171
|
+
progress("fetching-spans", msg)
|
|
172
|
+
|
|
173
|
+
for session_id in session_ids:
|
|
174
|
+
result = _spans.fetch_session_spans(
|
|
175
|
+
region=region,
|
|
176
|
+
runtime_id=runtime_id,
|
|
177
|
+
session_id=session_id,
|
|
178
|
+
lookback_days=lookback_days if lookback_days is not None else 7,
|
|
179
|
+
on_progress=on_span_progress,
|
|
180
|
+
)
|
|
181
|
+
all_spans.extend(result["spans"])
|
|
182
|
+
if not all_spans:
|
|
183
|
+
raise Exception(
|
|
184
|
+
"No spans found for the specified session(s). Ensure the agent has been invoked and traces have "
|
|
185
|
+
"propagated to CloudWatch (may take 5-10 minutes)."
|
|
186
|
+
)
|
|
187
|
+
if len(all_spans) > MAX_INLINE_SPANS:
|
|
188
|
+
raise ValidationError(
|
|
189
|
+
f"Fetched {len(all_spans)} spans across the specified sessions, which exceeds the maximum of "
|
|
190
|
+
f"{MAX_INLINE_SPANS}. Reduce the number of sessions or use CloudWatch-based trace collection instead."
|
|
191
|
+
)
|
|
192
|
+
if logger:
|
|
193
|
+
logger.log(f"Total spans fetched: {len(all_spans)}")
|
|
194
|
+
progress("fetching-spans", f"Fetched {len(all_spans)} spans")
|
|
195
|
+
agent_traces = {"sessionSpans": all_spans}
|
|
196
|
+
else:
|
|
197
|
+
prefix = f"{arn_prefix(region)}:logs:{region}:{account_id}:log-group:"
|
|
198
|
+
service_name = re.sub(r"-[^-]+$", ".DEFAULT", runtime_id, count=1)
|
|
199
|
+
days = lookback_days if lookback_days is not None else 7
|
|
200
|
+
agent_traces = {
|
|
201
|
+
"cloudwatchLogs": {
|
|
202
|
+
"logGroupArns": [f"{prefix}{runtime_log_group(runtime_id)}", f"{prefix}aws/spans"],
|
|
203
|
+
"serviceNames": [service_name],
|
|
204
|
+
"startTime": _days_ago_iso(days),
|
|
205
|
+
"endTime": iso_now(),
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
evaluation_config = {"evaluators": [{"evaluatorArn": evaluator_ids[0]}]} if evaluator_ids else None
|
|
210
|
+
|
|
211
|
+
if input_source == "config-bundle" and bundle_arn and not bundle_version:
|
|
212
|
+
raise Exception("Config bundle version is required. Provide --bundle-version or deploy the bundle first.")
|
|
213
|
+
if input_source == "config-bundle" and bundle_arn:
|
|
214
|
+
if type == "SYSTEM_PROMPT_RECOMMENDATION" and not system_prompt_json_path:
|
|
215
|
+
raise Exception(
|
|
216
|
+
"Config bundle requires --system-prompt-json-path to locate the system prompt field.\n"
|
|
217
|
+
"Use the field name (e.g. --system-prompt-json-path 'systemPrompt') and it will be resolved from "
|
|
218
|
+
"agentcore.json.\n"
|
|
219
|
+
"Or provide the full JSONPath (e.g. '$.ARN.configuration.systemPrompt')."
|
|
220
|
+
)
|
|
221
|
+
if type == "TOOL_DESCRIPTION_RECOMMENDATION" and not tool_desc_json_paths:
|
|
222
|
+
raise Exception(
|
|
223
|
+
"Config bundle requires --tool-desc-json-path to locate tool description fields.\n"
|
|
224
|
+
"Example: --tool-desc-json-path 'toolName:$.ARN.configuration.toolDescription'"
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
if type == "SYSTEM_PROMPT_RECOMMENDATION":
|
|
228
|
+
if input_source == "config-bundle" and bundle_arn:
|
|
229
|
+
bundle_ref: dict[str, Any] = {"bundleArn": bundle_arn, "versionId": bundle_version}
|
|
230
|
+
if system_prompt_json_path is not None:
|
|
231
|
+
bundle_ref["systemPromptJsonPath"] = system_prompt_json_path
|
|
232
|
+
system_prompt: dict[str, Any] = {"configurationBundle": bundle_ref}
|
|
233
|
+
else:
|
|
234
|
+
system_prompt = {"text": inline_content or ""}
|
|
235
|
+
config: dict[str, Any] = {"systemPrompt": system_prompt, "agentTraces": agent_traces}
|
|
236
|
+
if evaluation_config:
|
|
237
|
+
config["evaluationConfig"] = evaluation_config
|
|
238
|
+
return {"systemPromptRecommendationConfig": config}
|
|
239
|
+
|
|
240
|
+
if input_source == "config-bundle" and bundle_arn and tool_desc_json_paths:
|
|
241
|
+
return {
|
|
242
|
+
"toolDescriptionRecommendationConfig": {
|
|
243
|
+
"toolDescription": {
|
|
244
|
+
"configurationBundle": {
|
|
245
|
+
"bundleArn": bundle_arn,
|
|
246
|
+
"versionId": bundle_version,
|
|
247
|
+
"tools": tool_desc_json_paths,
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
"agentTraces": agent_traces,
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
tool_entries = []
|
|
255
|
+
for t in tools or []:
|
|
256
|
+
colon = t.find(":")
|
|
257
|
+
tool_name = t[:colon] if colon > 0 else t
|
|
258
|
+
if not TOOL_NAME_REGEX.match(tool_name) or len(tool_name) > MAX_TOOL_NAME_LENGTH:
|
|
259
|
+
raise ValidationError(
|
|
260
|
+
f'Tool name "{tool_name}" is invalid. Must contain only alphanumeric characters, underscores, '
|
|
261
|
+
f"hyphens, or dots (max {MAX_TOOL_NAME_LENGTH} chars)."
|
|
262
|
+
)
|
|
263
|
+
text = t[colon + 1 :] if colon > 0 else (inline_content or "")
|
|
264
|
+
tool_entries.append({"toolName": tool_name, "toolDescription": {"text": text}})
|
|
265
|
+
|
|
266
|
+
return {
|
|
267
|
+
"toolDescriptionRecommendationConfig": {
|
|
268
|
+
"toolDescription": {"toolDescriptionText": {"tools": tool_entries}},
|
|
269
|
+
"agentTraces": agent_traces,
|
|
270
|
+
}
|
|
271
|
+
}
|