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,365 @@
|
|
|
1
|
+
"""Online eval config add/remove (port of src/cli/primitives/OnlineEvalConfigPrimitive.ts)."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
import typer
|
|
7
|
+
|
|
8
|
+
from agentcore.aws import agentcore_control as control
|
|
9
|
+
from agentcore.aws import region as _region
|
|
10
|
+
from agentcore.aws.account import validate_aws_credentials
|
|
11
|
+
from agentcore.cli import interactive
|
|
12
|
+
from agentcore.cli.commands.add._common import first_issue
|
|
13
|
+
from agentcore.cli.errors import get_error_message
|
|
14
|
+
from agentcore.cli.naming import generate_unique_name
|
|
15
|
+
from agentcore.cli.run_command import run_cli_command
|
|
16
|
+
from agentcore.cli.variadic import variadic
|
|
17
|
+
from agentcore.lib import ResourceNotFoundError, find_config_root, serialize_result
|
|
18
|
+
from agentcore.lib.errors.types import to_error
|
|
19
|
+
from agentcore.lib.result import Err, Ok
|
|
20
|
+
from agentcore.lib.schemas.io.config_io import to_jsonable
|
|
21
|
+
from agentcore.operations.jobs.shared.format import parse_float
|
|
22
|
+
from agentcore.primitives.base import BasePrimitive, RemovableResource, RemovalPreview, SchemaChange, emit_json
|
|
23
|
+
from agentcore.schema import OnlineEvalConfigName
|
|
24
|
+
|
|
25
|
+
DEFAULT_SAMPLING_RATE = 10
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def validate_sampling_rate_text(value: str) -> str | None:
|
|
29
|
+
rate = parse_float(value)
|
|
30
|
+
if rate is None:
|
|
31
|
+
return "Must be a number"
|
|
32
|
+
if rate < 0.01 or rate > 100:
|
|
33
|
+
return "Must be between 0.01 and 100"
|
|
34
|
+
return None
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def check_endpoint(project: dict[str, Any], agent: str, endpoint: str) -> None:
|
|
38
|
+
runtime = next((r for r in project.get("runtimes") or [] if r.get("name") == agent), None)
|
|
39
|
+
if runtime is None:
|
|
40
|
+
raise Exception(f'Runtime "{agent}" not found in project.')
|
|
41
|
+
endpoints = runtime.get("endpoints")
|
|
42
|
+
if not (endpoints or {}).get(endpoint):
|
|
43
|
+
available = ", ".join(endpoints) if endpoints else "(none)"
|
|
44
|
+
raise Exception(f'Endpoint "{endpoint}" not found on runtime "{agent}". Available endpoints: {available}')
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def format_number(value: float) -> str:
|
|
48
|
+
return str(int(value)) if float(value).is_integer() else str(value)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@dataclass
|
|
52
|
+
class AddOnlineEvalConfigOptions:
|
|
53
|
+
name: str
|
|
54
|
+
agent: str
|
|
55
|
+
evaluators: list[str]
|
|
56
|
+
sampling_rate: float
|
|
57
|
+
enable_on_create: bool | None = None
|
|
58
|
+
endpoint: str | None = None
|
|
59
|
+
log_group_names: list[str] | None = None
|
|
60
|
+
service_names: list[str] | None = field(default=None)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class OnlineEvalConfigPrimitive(BasePrimitive):
|
|
64
|
+
kind = "online-eval"
|
|
65
|
+
label = "Online Eval Config"
|
|
66
|
+
article = "an"
|
|
67
|
+
|
|
68
|
+
def _project(self) -> dict[str, Any]:
|
|
69
|
+
return to_jsonable(self.read_project_spec())
|
|
70
|
+
|
|
71
|
+
def add(self, options: AddOnlineEvalConfigOptions) -> Ok | Err:
|
|
72
|
+
try:
|
|
73
|
+
project = self._project()
|
|
74
|
+
self.check_duplicate(
|
|
75
|
+
[RemovableResource(c["name"]) for c in project["onlineEvalConfigs"]], options.name, "Online eval config"
|
|
76
|
+
)
|
|
77
|
+
if options.endpoint and options.agent:
|
|
78
|
+
check_endpoint(project, options.agent, options.endpoint)
|
|
79
|
+
config: dict[str, Any] = {"name": options.name}
|
|
80
|
+
if options.agent:
|
|
81
|
+
config["agent"] = options.agent
|
|
82
|
+
config["evaluators"] = options.evaluators
|
|
83
|
+
config["samplingRate"] = options.sampling_rate
|
|
84
|
+
if options.enable_on_create is not None:
|
|
85
|
+
config["enableOnCreate"] = options.enable_on_create
|
|
86
|
+
if options.endpoint:
|
|
87
|
+
config["endpoint"] = options.endpoint
|
|
88
|
+
if options.log_group_names:
|
|
89
|
+
config["logGroupNames"] = options.log_group_names
|
|
90
|
+
if options.service_names:
|
|
91
|
+
config["serviceNames"] = options.service_names
|
|
92
|
+
project["onlineEvalConfigs"].append(config)
|
|
93
|
+
self.write_project_spec(project)
|
|
94
|
+
return Ok({"configName": options.name})
|
|
95
|
+
except Exception as exc: # noqa: BLE001
|
|
96
|
+
return Err(to_error(exc))
|
|
97
|
+
|
|
98
|
+
def remove(self, name: str) -> Ok | Err:
|
|
99
|
+
try:
|
|
100
|
+
project = self._project()
|
|
101
|
+
index = next((i for i, c in enumerate(project["onlineEvalConfigs"]) if c["name"] == name), -1)
|
|
102
|
+
if index == -1:
|
|
103
|
+
return Err(ResourceNotFoundError(f'Online eval config "{name}" not found.'))
|
|
104
|
+
project["onlineEvalConfigs"].pop(index)
|
|
105
|
+
self.write_project_spec(project)
|
|
106
|
+
return Ok(None)
|
|
107
|
+
except Exception as exc: # noqa: BLE001
|
|
108
|
+
return Err(to_error(exc))
|
|
109
|
+
|
|
110
|
+
def preview_remove(self, name: str) -> RemovalPreview:
|
|
111
|
+
project = self._project()
|
|
112
|
+
config = next((c for c in project["onlineEvalConfigs"] if c["name"] == name), None)
|
|
113
|
+
if config is None:
|
|
114
|
+
raise Exception(f'Online eval config "{name}" not found.')
|
|
115
|
+
summary = [f"Removing online eval config: {name}"]
|
|
116
|
+
if config.get("evaluators"):
|
|
117
|
+
summary.append(f"Uses evaluators: {', '.join(config['evaluators'])}")
|
|
118
|
+
if config.get("insights"):
|
|
119
|
+
summary.append(f"Uses insights: {', '.join(config['insights'])}")
|
|
120
|
+
after = {**project, "onlineEvalConfigs": [c for c in project["onlineEvalConfigs"] if c["name"] != name]}
|
|
121
|
+
return RemovalPreview(summary, [], [SchemaChange("agentcore/agentcore.json", project, after)])
|
|
122
|
+
|
|
123
|
+
def get_removable(self) -> list[RemovableResource]:
|
|
124
|
+
try:
|
|
125
|
+
return [RemovableResource(c["name"]) for c in self._project()["onlineEvalConfigs"]]
|
|
126
|
+
except Exception: # noqa: BLE001
|
|
127
|
+
return []
|
|
128
|
+
|
|
129
|
+
def get_all_names(self) -> list[str]:
|
|
130
|
+
return [r.name for r in self.get_removable()]
|
|
131
|
+
|
|
132
|
+
def register_commands(self, add_app: typer.Typer, remove_app: typer.Typer) -> None:
|
|
133
|
+
@add_app.command(
|
|
134
|
+
"online-eval",
|
|
135
|
+
help="Add an online eval config to the project",
|
|
136
|
+
cls=variadic("-e", "--evaluator", "--evaluator-arn", "--log-group-name", "--service-name"),
|
|
137
|
+
)
|
|
138
|
+
def add_online_eval(
|
|
139
|
+
name: str | None = typer.Option(None, "--name", help="Config name [non-interactive]"),
|
|
140
|
+
runtime: str | None = typer.Option(None, "-r", "--runtime", help="Runtime to monitor [non-interactive]"),
|
|
141
|
+
evaluator: list[str] | None = typer.Option(
|
|
142
|
+
None, "-e", "--evaluator", help="Evaluator name(s), Builtin.* IDs, or ARNs [non-interactive]"
|
|
143
|
+
),
|
|
144
|
+
evaluator_arn: list[str] | None = typer.Option(
|
|
145
|
+
None, "--evaluator-arn", help="Evaluator ARN(s) [non-interactive]"
|
|
146
|
+
),
|
|
147
|
+
sampling_rate: str | None = typer.Option(
|
|
148
|
+
None, "--sampling-rate", help="Sampling percentage (0.01-100) [non-interactive]"
|
|
149
|
+
),
|
|
150
|
+
endpoint: str | None = typer.Option(
|
|
151
|
+
None, "--endpoint", help="Runtime endpoint name to scope monitoring [non-interactive]"
|
|
152
|
+
),
|
|
153
|
+
log_group_name: list[str] | None = typer.Option(
|
|
154
|
+
None,
|
|
155
|
+
"--log-group-name",
|
|
156
|
+
help="CloudWatch log group name(s) for custom data sources (1-5) [non-interactive]",
|
|
157
|
+
),
|
|
158
|
+
service_name: list[str] | None = typer.Option(
|
|
159
|
+
None,
|
|
160
|
+
"--service-name",
|
|
161
|
+
help="Service name(s) to filter traces for custom data sources [non-interactive]",
|
|
162
|
+
),
|
|
163
|
+
enable_on_create: bool = typer.Option(
|
|
164
|
+
False, "--enable-on-create", help="Enable evaluation immediately after deploy [non-interactive]"
|
|
165
|
+
),
|
|
166
|
+
as_json: bool = typer.Option(False, "--json", help="Output as JSON [non-interactive]"),
|
|
167
|
+
) -> None:
|
|
168
|
+
if not find_config_root():
|
|
169
|
+
typer.echo("No agentcore project found. Run `agentcore create` first.", err=True)
|
|
170
|
+
raise typer.Exit(1)
|
|
171
|
+
if not (name or as_json):
|
|
172
|
+
try:
|
|
173
|
+
interactive.require_tty()
|
|
174
|
+
self.add_interactive()
|
|
175
|
+
except typer.Exit:
|
|
176
|
+
raise
|
|
177
|
+
except Exception as exc: # noqa: BLE001
|
|
178
|
+
typer.echo(get_error_message(exc), err=True)
|
|
179
|
+
raise typer.Exit(1) from None
|
|
180
|
+
raise typer.Exit(0)
|
|
181
|
+
|
|
182
|
+
all_evaluators = [*(evaluator or []), *(evaluator_arn or [])]
|
|
183
|
+
|
|
184
|
+
def run() -> None:
|
|
185
|
+
if runtime and log_group_name:
|
|
186
|
+
raise Exception(
|
|
187
|
+
"Error: --runtime and --log-group-name are mutually exclusive. Use --runtime (+ optional "
|
|
188
|
+
"--endpoint) for AgentCore agents, or --log-group-name/--service-name for custom data sources."
|
|
189
|
+
)
|
|
190
|
+
if log_group_name:
|
|
191
|
+
if not name or not all_evaluators or not sampling_rate:
|
|
192
|
+
raise Exception(
|
|
193
|
+
"--name, --log-group-name, --evaluator (and/or --evaluator-arn), and --sampling-rate are "
|
|
194
|
+
"all required in non-interactive mode"
|
|
195
|
+
)
|
|
196
|
+
if len(log_group_name) > 5:
|
|
197
|
+
raise Exception("--log-group-name accepts at most 5 log group names")
|
|
198
|
+
elif not name or not runtime or not all_evaluators or not sampling_rate:
|
|
199
|
+
raise Exception(
|
|
200
|
+
"--name, --runtime, --evaluator (and/or --evaluator-arn), and --sampling-rate are all "
|
|
201
|
+
"required in non-interactive mode"
|
|
202
|
+
)
|
|
203
|
+
rate = parse_float(sampling_rate)
|
|
204
|
+
if rate is None or rate < 0.01 or rate > 100:
|
|
205
|
+
raise Exception(
|
|
206
|
+
f'Invalid --sampling-rate "{sampling_rate}". Must be a percentage between 0.01 and 100'
|
|
207
|
+
)
|
|
208
|
+
result = self.add(
|
|
209
|
+
AddOnlineEvalConfigOptions(
|
|
210
|
+
name=name,
|
|
211
|
+
agent=runtime or "",
|
|
212
|
+
evaluators=all_evaluators,
|
|
213
|
+
sampling_rate=rate,
|
|
214
|
+
enable_on_create=True if enable_on_create else None,
|
|
215
|
+
endpoint=endpoint,
|
|
216
|
+
log_group_names=log_group_name or None,
|
|
217
|
+
service_names=service_name or None,
|
|
218
|
+
)
|
|
219
|
+
)
|
|
220
|
+
if not result.success:
|
|
221
|
+
raise result.error
|
|
222
|
+
if as_json:
|
|
223
|
+
emit_json(serialize_result(result))
|
|
224
|
+
else:
|
|
225
|
+
typer.echo(f"Added online eval config '{result.value['configName']}'")
|
|
226
|
+
|
|
227
|
+
run_cli_command(as_json, run)
|
|
228
|
+
|
|
229
|
+
self.register_remove_subcommand(remove_app)
|
|
230
|
+
|
|
231
|
+
def add_interactive(self) -> None:
|
|
232
|
+
"""Prompt flow mirroring tui/screens/online-eval/AddOnlineEvalFlow + AddOnlineEvalScreen."""
|
|
233
|
+
try:
|
|
234
|
+
validate_aws_credentials()
|
|
235
|
+
except Exception as exc: # noqa: BLE001
|
|
236
|
+
typer.echo("AWS credentials required", err=True)
|
|
237
|
+
typer.echo(get_error_message(exc), err=True)
|
|
238
|
+
raise typer.Exit(1) from None
|
|
239
|
+
region = _region.detect_region().region
|
|
240
|
+
project = self._project()
|
|
241
|
+
evaluators = control.list_evaluators(region=region)["evaluators"]
|
|
242
|
+
runtimes = project.get("runtimes") or []
|
|
243
|
+
agent_names = [r["name"] for r in runtimes]
|
|
244
|
+
existing = self.get_all_names()
|
|
245
|
+
choice = interactive.Choice
|
|
246
|
+
|
|
247
|
+
def validate_name(value: str) -> str | None:
|
|
248
|
+
issue = first_issue(OnlineEvalConfigName, value)
|
|
249
|
+
if issue:
|
|
250
|
+
return issue
|
|
251
|
+
return "Config name already exists" if value in existing else None
|
|
252
|
+
|
|
253
|
+
name = interactive.text(
|
|
254
|
+
"Config name", default=generate_unique_name("MyOnlineEval", existing), validate=validate_name
|
|
255
|
+
)
|
|
256
|
+
source = interactive.select(
|
|
257
|
+
"Select data source type",
|
|
258
|
+
[
|
|
259
|
+
choice("AgentCore Runtime", "agentcore-runtime", "Monitor a managed AgentCore agent"),
|
|
260
|
+
choice("CloudWatch Logs", "cloudwatch-logs", "Provide custom log groups for 3rd-party agents"),
|
|
261
|
+
],
|
|
262
|
+
)
|
|
263
|
+
agent = ""
|
|
264
|
+
endpoint = None
|
|
265
|
+
log_groups: list[str] | None = None
|
|
266
|
+
services: list[str] | None = None
|
|
267
|
+
if source == "agentcore-runtime":
|
|
268
|
+
if len(agent_names) == 1:
|
|
269
|
+
agent = agent_names[0]
|
|
270
|
+
elif agent_names:
|
|
271
|
+
agent = interactive.select("Select agent to monitor", [choice(n, n) for n in agent_names])
|
|
272
|
+
runtime = next((r for r in runtimes if r["name"] == agent), {})
|
|
273
|
+
endpoints = runtime.get("endpoints") or {}
|
|
274
|
+
if endpoints:
|
|
275
|
+
picked = interactive.select(
|
|
276
|
+
"Select endpoint to monitor",
|
|
277
|
+
[choice("DEFAULT", "DEFAULT")]
|
|
278
|
+
+ [choice(ep, ep, f"v{info.get('version')}") for ep, info in endpoints.items()],
|
|
279
|
+
)
|
|
280
|
+
endpoint = None if picked == "DEFAULT" else picked
|
|
281
|
+
else:
|
|
282
|
+
typer.echo(
|
|
283
|
+
"Enter CloudWatch log group names (1-5). Press Enter to add each name. Submit an empty value when done."
|
|
284
|
+
)
|
|
285
|
+
log_groups = []
|
|
286
|
+
while len(log_groups) < 5:
|
|
287
|
+
entry = interactive.text(
|
|
288
|
+
f"Log group name {len(log_groups) + 1}",
|
|
289
|
+
validate=lambda v: (
|
|
290
|
+
"At least one log group name is required" if v == "" and not log_groups else None
|
|
291
|
+
),
|
|
292
|
+
)
|
|
293
|
+
if entry == "":
|
|
294
|
+
break
|
|
295
|
+
log_groups.append(entry)
|
|
296
|
+
typer.echo("Enter service names separated by spaces (optional). Leave empty to skip.")
|
|
297
|
+
raw = interactive.text("Service names (space-separated)")
|
|
298
|
+
services = raw.split() if raw.strip() else None
|
|
299
|
+
|
|
300
|
+
selected = interactive.checkbox(
|
|
301
|
+
"Select evaluators",
|
|
302
|
+
[
|
|
303
|
+
choice(
|
|
304
|
+
e["evaluatorName"],
|
|
305
|
+
e["evaluatorArn"],
|
|
306
|
+
"Built-in evaluator"
|
|
307
|
+
if e.get("evaluatorType") == "Builtin"
|
|
308
|
+
else (e.get("description") or "Custom evaluator"),
|
|
309
|
+
)
|
|
310
|
+
for e in evaluators
|
|
311
|
+
],
|
|
312
|
+
)
|
|
313
|
+
typer.echo(
|
|
314
|
+
"Percentage of agent requests that will be evaluated. Higher rates give better coverage but increase LLM "
|
|
315
|
+
"costs from evaluator invocations."
|
|
316
|
+
)
|
|
317
|
+
rate_text = interactive.text(
|
|
318
|
+
"Sampling rate (0.01-100%)", default=str(DEFAULT_SAMPLING_RATE), validate=validate_sampling_rate_text
|
|
319
|
+
)
|
|
320
|
+
rate = parse_float(rate_text)
|
|
321
|
+
enable = interactive.select(
|
|
322
|
+
"Enable on deploy?",
|
|
323
|
+
[
|
|
324
|
+
choice("Yes", True, "Enable evaluation immediately after deploy"),
|
|
325
|
+
choice("No", False, "Deploy paused — enable later with `agentcore resume online-eval`"),
|
|
326
|
+
],
|
|
327
|
+
)
|
|
328
|
+
rows = [("Name", name)]
|
|
329
|
+
if agent:
|
|
330
|
+
rows.append(("Agent", agent))
|
|
331
|
+
if endpoint:
|
|
332
|
+
rows.append(("Endpoint", endpoint))
|
|
333
|
+
if log_groups:
|
|
334
|
+
rows.append(("Log Groups", ", ".join(log_groups)))
|
|
335
|
+
rows += [
|
|
336
|
+
("Evaluators", ", ".join(selected) or "None"),
|
|
337
|
+
("Rate", f"{format_number(rate or 0)}%"),
|
|
338
|
+
("Enable", "Yes" if enable else "No"),
|
|
339
|
+
]
|
|
340
|
+
for label, value in rows:
|
|
341
|
+
typer.echo(f" {label}: {value}")
|
|
342
|
+
if not interactive.confirm("Add this online eval config?", default=True):
|
|
343
|
+
typer.echo("Cancelled.")
|
|
344
|
+
return
|
|
345
|
+
result = self.add(
|
|
346
|
+
AddOnlineEvalConfigOptions(
|
|
347
|
+
name=name,
|
|
348
|
+
agent=agent,
|
|
349
|
+
evaluators=selected,
|
|
350
|
+
sampling_rate=rate or DEFAULT_SAMPLING_RATE,
|
|
351
|
+
enable_on_create=enable,
|
|
352
|
+
endpoint=endpoint,
|
|
353
|
+
log_group_names=log_groups or None,
|
|
354
|
+
service_names=services,
|
|
355
|
+
)
|
|
356
|
+
)
|
|
357
|
+
if not result.success:
|
|
358
|
+
typer.echo("Failed to add online eval config", err=True)
|
|
359
|
+
typer.echo(get_error_message(result.error), err=True)
|
|
360
|
+
raise typer.Exit(1)
|
|
361
|
+
typer.echo(f"Added online eval config: {name}")
|
|
362
|
+
typer.echo("Online eval config added to project in `agentcore/agentcore.json`. Deploy with `agentcore deploy`.")
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
PRIMITIVE = OnlineEvalConfigPrimitive()
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
"""Online insights config add/remove (port of src/cli/primitives/OnlineInsightsPrimitive.ts).
|
|
2
|
+
|
|
3
|
+
Online insights configs are online eval configs that use ``insights`` instead of evaluators.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
import typer
|
|
10
|
+
|
|
11
|
+
from agentcore.cli import interactive
|
|
12
|
+
from agentcore.cli.commands.add._common import first_issue
|
|
13
|
+
from agentcore.cli.errors import get_error_message
|
|
14
|
+
from agentcore.cli.naming import generate_unique_name
|
|
15
|
+
from agentcore.cli.run_command import run_cli_command
|
|
16
|
+
from agentcore.cli.variadic import variadic
|
|
17
|
+
from agentcore.lib import ResourceNotFoundError, ValidationError, find_config_root, serialize_result
|
|
18
|
+
from agentcore.lib.errors.types import to_error
|
|
19
|
+
from agentcore.lib.result import Err, Ok
|
|
20
|
+
from agentcore.lib.schemas.io.config_io import to_jsonable
|
|
21
|
+
from agentcore.operations.jobs.shared.format import parse_float
|
|
22
|
+
from agentcore.primitives.base import BasePrimitive, RemovableResource, RemovalPreview, SchemaChange, emit_json
|
|
23
|
+
from agentcore.primitives.online_eval_config import check_endpoint, format_number
|
|
24
|
+
from agentcore.schema import OnlineEvalConfigName
|
|
25
|
+
|
|
26
|
+
DEFAULT_INSIGHTS_SAMPLING_RATE = 100
|
|
27
|
+
AVAILABLE_INSIGHTS = (
|
|
28
|
+
("Builtin.Insight.FailureAnalysis", "Failure Analysis", "Analyze failure patterns and root causes across sessions"),
|
|
29
|
+
("Builtin.Insight.UserIntent", "User Intent", "Classify and cluster user intents from session transcripts"),
|
|
30
|
+
(
|
|
31
|
+
"Builtin.Insight.ExecutionSummary",
|
|
32
|
+
"Execution Summary",
|
|
33
|
+
"Summarize execution patterns and tool usage across sessions",
|
|
34
|
+
),
|
|
35
|
+
)
|
|
36
|
+
CLUSTERING_FREQUENCIES = (("DAILY", "Daily"), ("WEEKLY", "Weekly"), ("MONTHLY", "Monthly"))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def validate_insight_ids(insights: list[str]) -> None:
|
|
40
|
+
"""Each insight must be a Builtin.Insight.* identifier or a full ARN."""
|
|
41
|
+
for insight in insights:
|
|
42
|
+
if not insight.startswith("Builtin.Insight.") and not insight.startswith("arn:"):
|
|
43
|
+
raise ValidationError(
|
|
44
|
+
f'Invalid insight "{insight}". Must be a Builtin.Insight.* identifier '
|
|
45
|
+
"(e.g. Builtin.Insight.FailureAnalysis) or a full ARN."
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _has_insights(config: dict[str, Any]) -> bool:
|
|
50
|
+
return bool(config.get("insights"))
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@dataclass
|
|
54
|
+
class AddOnlineInsightsOptions:
|
|
55
|
+
name: str
|
|
56
|
+
agent: str
|
|
57
|
+
insights: list[str]
|
|
58
|
+
sampling_rate: float
|
|
59
|
+
clustering_frequencies: list[str] | None = None
|
|
60
|
+
enable_on_create: bool | None = None
|
|
61
|
+
endpoint: str | None = None
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class OnlineInsightsPrimitive(BasePrimitive):
|
|
65
|
+
kind = "online-insights"
|
|
66
|
+
label = "Online Insights Config"
|
|
67
|
+
article = "an"
|
|
68
|
+
|
|
69
|
+
def _project(self) -> dict[str, Any]:
|
|
70
|
+
return to_jsonable(self.read_project_spec())
|
|
71
|
+
|
|
72
|
+
def add(self, options: AddOnlineInsightsOptions) -> Ok | Err:
|
|
73
|
+
try:
|
|
74
|
+
project = self._project()
|
|
75
|
+
self.check_duplicate(
|
|
76
|
+
[RemovableResource(c["name"]) for c in project["onlineEvalConfigs"]],
|
|
77
|
+
options.name,
|
|
78
|
+
"Online insights config",
|
|
79
|
+
)
|
|
80
|
+
validate_insight_ids(options.insights)
|
|
81
|
+
if options.endpoint:
|
|
82
|
+
check_endpoint(project, options.agent, options.endpoint)
|
|
83
|
+
config: dict[str, Any] = {
|
|
84
|
+
"name": options.name,
|
|
85
|
+
"agent": options.agent,
|
|
86
|
+
"insights": options.insights,
|
|
87
|
+
"samplingRate": options.sampling_rate,
|
|
88
|
+
}
|
|
89
|
+
if options.clustering_frequencies:
|
|
90
|
+
config["clusteringConfig"] = {"frequencies": options.clustering_frequencies}
|
|
91
|
+
if options.enable_on_create is not None:
|
|
92
|
+
config["enableOnCreate"] = options.enable_on_create
|
|
93
|
+
if options.endpoint:
|
|
94
|
+
config["endpoint"] = options.endpoint
|
|
95
|
+
project["onlineEvalConfigs"].append(config)
|
|
96
|
+
self.write_project_spec(project)
|
|
97
|
+
return Ok({"configName": options.name})
|
|
98
|
+
except Exception as exc: # noqa: BLE001
|
|
99
|
+
return Err(to_error(exc))
|
|
100
|
+
|
|
101
|
+
def remove(self, name: str) -> Ok | Err:
|
|
102
|
+
try:
|
|
103
|
+
project = self._project()
|
|
104
|
+
index = next(
|
|
105
|
+
(i for i, c in enumerate(project["onlineEvalConfigs"]) if c["name"] == name and _has_insights(c)), -1
|
|
106
|
+
)
|
|
107
|
+
if index == -1:
|
|
108
|
+
return Err(ResourceNotFoundError(f'Online insights config "{name}" not found.'))
|
|
109
|
+
project["onlineEvalConfigs"].pop(index)
|
|
110
|
+
self.write_project_spec(project)
|
|
111
|
+
return Ok(None)
|
|
112
|
+
except Exception as exc: # noqa: BLE001
|
|
113
|
+
return Err(to_error(exc))
|
|
114
|
+
|
|
115
|
+
def preview_remove(self, name: str) -> RemovalPreview:
|
|
116
|
+
project = self._project()
|
|
117
|
+
config = next((c for c in project["onlineEvalConfigs"] if c["name"] == name and _has_insights(c)), None)
|
|
118
|
+
if config is None:
|
|
119
|
+
raise Exception(f'Online insights config "{name}" not found.')
|
|
120
|
+
summary = [f"Removing online insights config: {name}", f"Uses insights: {', '.join(config['insights'])}"]
|
|
121
|
+
after = {**project, "onlineEvalConfigs": [c for c in project["onlineEvalConfigs"] if c["name"] != name]}
|
|
122
|
+
return RemovalPreview(summary, [], [SchemaChange("agentcore/agentcore.json", project, after)])
|
|
123
|
+
|
|
124
|
+
def get_removable(self) -> list[RemovableResource]:
|
|
125
|
+
try:
|
|
126
|
+
return [RemovableResource(c["name"]) for c in self._project()["onlineEvalConfigs"] if _has_insights(c)]
|
|
127
|
+
except Exception: # noqa: BLE001
|
|
128
|
+
return []
|
|
129
|
+
|
|
130
|
+
def get_all_names(self) -> list[str]:
|
|
131
|
+
return [r.name for r in self.get_removable()]
|
|
132
|
+
|
|
133
|
+
def register_commands(self, add_app: typer.Typer, remove_app: typer.Typer) -> None:
|
|
134
|
+
@add_app.command(
|
|
135
|
+
"online-insights",
|
|
136
|
+
help="Add an online insights config to the project",
|
|
137
|
+
cls=variadic("--insights", "--clustering-frequency"),
|
|
138
|
+
)
|
|
139
|
+
def add_online_insights(
|
|
140
|
+
name: str | None = typer.Option(None, "--name", help="Config name [non-interactive]"),
|
|
141
|
+
runtime: str | None = typer.Option(None, "-r", "--runtime", help="Runtime to monitor [non-interactive]"),
|
|
142
|
+
insights: list[str] | None = typer.Option(
|
|
143
|
+
None, "--insights", help="Insight IDs (e.g. Builtin.Insight.FailureAnalysis) [non-interactive]"
|
|
144
|
+
),
|
|
145
|
+
sampling_rate: str | None = typer.Option(
|
|
146
|
+
None, "--sampling-rate", help="Sampling percentage (0.01-100) [non-interactive]"
|
|
147
|
+
),
|
|
148
|
+
clustering_frequency: list[str] | None = typer.Option(
|
|
149
|
+
None, "--clustering-frequency", help="Clustering frequencies: DAILY, WEEKLY, MONTHLY [non-interactive]"
|
|
150
|
+
),
|
|
151
|
+
endpoint: str | None = typer.Option(
|
|
152
|
+
None, "--endpoint", help="Runtime endpoint name to scope monitoring [non-interactive]"
|
|
153
|
+
),
|
|
154
|
+
enable_on_create: bool = typer.Option(
|
|
155
|
+
False, "--enable-on-create", help="Enable insights immediately after deploy [non-interactive]"
|
|
156
|
+
),
|
|
157
|
+
as_json: bool = typer.Option(False, "--json", help="Output as JSON [non-interactive]"),
|
|
158
|
+
) -> None:
|
|
159
|
+
if not find_config_root():
|
|
160
|
+
typer.echo("No agentcore project found. Run `agentcore create` first.", err=True)
|
|
161
|
+
raise typer.Exit(1)
|
|
162
|
+
if not (name or as_json):
|
|
163
|
+
try:
|
|
164
|
+
interactive.require_tty()
|
|
165
|
+
self.add_interactive()
|
|
166
|
+
except typer.Exit:
|
|
167
|
+
raise
|
|
168
|
+
except Exception as exc: # noqa: BLE001
|
|
169
|
+
typer.echo(get_error_message(exc), err=True)
|
|
170
|
+
raise typer.Exit(1) from None
|
|
171
|
+
raise typer.Exit(0)
|
|
172
|
+
|
|
173
|
+
def run() -> None:
|
|
174
|
+
if not name or not runtime or not insights or not sampling_rate:
|
|
175
|
+
raise Exception(
|
|
176
|
+
"--name, --runtime, --insights, and --sampling-rate are all required in non-interactive mode"
|
|
177
|
+
)
|
|
178
|
+
rate = parse_float(sampling_rate)
|
|
179
|
+
if rate is None or rate < 0.01 or rate > 100:
|
|
180
|
+
raise Exception(
|
|
181
|
+
f'Invalid --sampling-rate "{sampling_rate}". Must be a percentage between 0.01 and 100'
|
|
182
|
+
)
|
|
183
|
+
result = self.add(
|
|
184
|
+
AddOnlineInsightsOptions(
|
|
185
|
+
name=name,
|
|
186
|
+
agent=runtime,
|
|
187
|
+
insights=insights,
|
|
188
|
+
sampling_rate=rate,
|
|
189
|
+
clustering_frequencies=clustering_frequency or None,
|
|
190
|
+
enable_on_create=True if enable_on_create else None,
|
|
191
|
+
endpoint=endpoint,
|
|
192
|
+
)
|
|
193
|
+
)
|
|
194
|
+
if not result.success:
|
|
195
|
+
raise result.error
|
|
196
|
+
if as_json:
|
|
197
|
+
emit_json(serialize_result(result))
|
|
198
|
+
else:
|
|
199
|
+
typer.echo(f"Added online insights config '{result.value['configName']}'")
|
|
200
|
+
|
|
201
|
+
run_cli_command(as_json, run)
|
|
202
|
+
|
|
203
|
+
self.register_remove_subcommand(remove_app)
|
|
204
|
+
|
|
205
|
+
def add_interactive(self) -> None:
|
|
206
|
+
"""Prompt flow mirroring tui/screens/online-insights (agent, insights, rate, clustering, name)."""
|
|
207
|
+
project = self._project()
|
|
208
|
+
agent_names = [r["name"] for r in project.get("runtimes") or []]
|
|
209
|
+
if not agent_names:
|
|
210
|
+
typer.echo("No runtimes found in project. Add an agent first with `agentcore add agent`.", err=True)
|
|
211
|
+
raise typer.Exit(1)
|
|
212
|
+
choice = interactive.Choice
|
|
213
|
+
agent = interactive.select("Select agent to monitor", [choice(n, n) for n in agent_names])
|
|
214
|
+
insights = interactive.checkbox("Select insights", [choice(t, i, d) for i, t, d in AVAILABLE_INSIGHTS])
|
|
215
|
+
while not insights:
|
|
216
|
+
typer.echo("Select at least one insight.", err=True)
|
|
217
|
+
insights = interactive.checkbox("Select insights", [choice(t, i, d) for i, t, d in AVAILABLE_INSIGHTS])
|
|
218
|
+
|
|
219
|
+
def validate_rate(value: str) -> str | None:
|
|
220
|
+
rate = parse_float(value)
|
|
221
|
+
if rate is None:
|
|
222
|
+
return "Must be a number"
|
|
223
|
+
return None if 0.01 <= rate <= 100 else "Must be between 0.01 and 100"
|
|
224
|
+
|
|
225
|
+
rate = parse_float(
|
|
226
|
+
interactive.text(
|
|
227
|
+
"Sampling rate (0.01–100%)", default=str(DEFAULT_INSIGHTS_SAMPLING_RATE), validate=validate_rate
|
|
228
|
+
)
|
|
229
|
+
)
|
|
230
|
+
frequencies = interactive.checkbox(
|
|
231
|
+
"Select clustering frequencies (optional)", [choice(t, i) for i, t in CLUSTERING_FREQUENCIES]
|
|
232
|
+
)
|
|
233
|
+
existing = [c["name"] for c in project["onlineEvalConfigs"]]
|
|
234
|
+
|
|
235
|
+
def validate_name(value: str) -> str | None:
|
|
236
|
+
issue = first_issue(OnlineEvalConfigName, value)
|
|
237
|
+
if issue:
|
|
238
|
+
return issue
|
|
239
|
+
return "Config name already exists" if value in existing else None
|
|
240
|
+
|
|
241
|
+
name = interactive.text(
|
|
242
|
+
"Config name", default=generate_unique_name("MyInsights", existing), validate=validate_name
|
|
243
|
+
)
|
|
244
|
+
for label, value in (
|
|
245
|
+
("Agent", agent),
|
|
246
|
+
("Insights", ", ".join(insights)),
|
|
247
|
+
("Rate", f"{format_number(rate or 0)}%"),
|
|
248
|
+
("Clustering", ", ".join(frequencies) or "None"),
|
|
249
|
+
("Name", name),
|
|
250
|
+
):
|
|
251
|
+
typer.echo(f" {label}: {value}")
|
|
252
|
+
if not interactive.confirm("Add this online insights config?", default=True):
|
|
253
|
+
typer.echo("Cancelled.")
|
|
254
|
+
return
|
|
255
|
+
result = self.add(
|
|
256
|
+
AddOnlineInsightsOptions(
|
|
257
|
+
name=name,
|
|
258
|
+
agent=agent,
|
|
259
|
+
insights=insights,
|
|
260
|
+
sampling_rate=rate or DEFAULT_INSIGHTS_SAMPLING_RATE,
|
|
261
|
+
clustering_frequencies=frequencies or None,
|
|
262
|
+
enable_on_create=True,
|
|
263
|
+
)
|
|
264
|
+
)
|
|
265
|
+
if not result.success:
|
|
266
|
+
typer.echo("Failed to add online insights config", err=True)
|
|
267
|
+
typer.echo(get_error_message(result.error), err=True)
|
|
268
|
+
raise typer.Exit(1)
|
|
269
|
+
typer.echo(f"Added online insights config: {name}")
|
|
270
|
+
typer.echo(
|
|
271
|
+
"Online insights config added to project in `agentcore/agentcore.json`. Deploy with `agentcore deploy`."
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
PRIMITIVE = OnlineInsightsPrimitive()
|