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,28 @@
|
|
|
1
|
+
"""Port of operations/dev/server.ts: dev server barrel + factory."""
|
|
2
|
+
|
|
3
|
+
from agentcore.operations.dev.codezip_dev_server import CodeZipDevServer
|
|
4
|
+
from agentcore.operations.dev.config import DevConfig
|
|
5
|
+
from agentcore.operations.dev.container_dev_server import ContainerDevServer
|
|
6
|
+
from agentcore.operations.dev.dev_server import DevServer, DevServerCallbacks, DevServerOptions, LogLevel
|
|
7
|
+
from agentcore.operations.dev.utils import find_available_port, wait_for_port, wait_for_server_ready
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def create_dev_server(config: DevConfig, options: DevServerOptions) -> DevServer:
|
|
11
|
+
"""Container builds run in Docker/Podman/Finch; everything else runs as a local process."""
|
|
12
|
+
if config.build_type == "Container":
|
|
13
|
+
return ContainerDevServer(config, options)
|
|
14
|
+
return CodeZipDevServer(config, options)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"CodeZipDevServer",
|
|
19
|
+
"ContainerDevServer",
|
|
20
|
+
"DevServer",
|
|
21
|
+
"DevServerCallbacks",
|
|
22
|
+
"DevServerOptions",
|
|
23
|
+
"LogLevel",
|
|
24
|
+
"create_dev_server",
|
|
25
|
+
"find_available_port",
|
|
26
|
+
"wait_for_port",
|
|
27
|
+
"wait_for_server_ready",
|
|
28
|
+
]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""Port of operations/dev/sse-transform.ts: normalize an agent SSE stream for the browser."""
|
|
2
|
+
|
|
3
|
+
import codecs
|
|
4
|
+
import json
|
|
5
|
+
from collections.abc import Callable, Iterable
|
|
6
|
+
|
|
7
|
+
from agentcore.operations.dev.invoke import parse_sse_line
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _emit(line: str, write: Callable[[str], None]) -> None:
|
|
11
|
+
content, error = parse_sse_line(line)
|
|
12
|
+
if error:
|
|
13
|
+
write(f"data: {json.dumps({'error': error}, ensure_ascii=False, separators=(',', ':'))}\n\n")
|
|
14
|
+
elif content:
|
|
15
|
+
write(f"data: {json.dumps(content, ensure_ascii=False)}\n\n")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def pipe_sse_transformed(chunks: Iterable[bytes], write: Callable[[str], None], end: Callable[[], None]) -> None:
|
|
19
|
+
"""Re-emit each ``data:`` event as ``data: "text"`` (or ``data: {"error": ...}``), then end."""
|
|
20
|
+
decoder = codecs.getincrementaldecoder("utf-8")(errors="replace")
|
|
21
|
+
buffer = ""
|
|
22
|
+
for chunk in chunks:
|
|
23
|
+
buffer += decoder.decode(chunk)
|
|
24
|
+
lines = buffer.split("\n")
|
|
25
|
+
buffer = lines.pop()
|
|
26
|
+
for line in lines:
|
|
27
|
+
_emit(line, write)
|
|
28
|
+
if buffer:
|
|
29
|
+
_emit(buffer, write)
|
|
30
|
+
end()
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"""Port of operations/dev/utils.ts: port probing, readiness polling and display helpers."""
|
|
2
|
+
|
|
3
|
+
import signal
|
|
4
|
+
import socket
|
|
5
|
+
import threading
|
|
6
|
+
import time
|
|
7
|
+
import webbrowser
|
|
8
|
+
from collections.abc import Callable
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _check_port(port: int, host: str) -> bool:
|
|
13
|
+
"""True if ``port`` can be bound on ``host`` (mirrors net.createServer().listen)."""
|
|
14
|
+
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
15
|
+
try:
|
|
16
|
+
# Node's listen() sets SO_REUSEADDR on POSIX; do the same so TIME_WAIT sockets don't count.
|
|
17
|
+
if hasattr(socket, "SO_REUSEADDR"):
|
|
18
|
+
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
19
|
+
sock.bind((host, port))
|
|
20
|
+
sock.listen(1)
|
|
21
|
+
return True
|
|
22
|
+
except OSError:
|
|
23
|
+
return False
|
|
24
|
+
finally:
|
|
25
|
+
sock.close()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def is_port_available(port: int) -> bool:
|
|
29
|
+
"""Available on both 127.0.0.1 and 0.0.0.0 (checked sequentially, as upstream)."""
|
|
30
|
+
if not _check_port(port, "127.0.0.1"):
|
|
31
|
+
return False
|
|
32
|
+
return _check_port(port, "0.0.0.0")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def find_available_port(start_port: int) -> int:
|
|
36
|
+
port = start_port
|
|
37
|
+
while not is_port_available(port):
|
|
38
|
+
port += 1
|
|
39
|
+
return port
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def wait_for_port(port: int, timeout_ms: int = 3000) -> bool:
|
|
43
|
+
"""Wait for ``port`` to become free."""
|
|
44
|
+
start = time.monotonic()
|
|
45
|
+
while (time.monotonic() - start) * 1000 < timeout_ms:
|
|
46
|
+
if is_port_available(port):
|
|
47
|
+
return True
|
|
48
|
+
time.sleep(0.1)
|
|
49
|
+
return False
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _is_listening(port: int) -> bool:
|
|
53
|
+
try:
|
|
54
|
+
with socket.create_connection(("127.0.0.1", port), timeout=1):
|
|
55
|
+
return True
|
|
56
|
+
except OSError:
|
|
57
|
+
return False
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def wait_for_server_ready(port: int, timeout_ms: int = 60000) -> bool:
|
|
61
|
+
"""Wait until something accepts connections on 127.0.0.1:``port``."""
|
|
62
|
+
start = time.monotonic()
|
|
63
|
+
while (time.monotonic() - start) * 1000 < timeout_ms:
|
|
64
|
+
if _is_listening(port):
|
|
65
|
+
return True
|
|
66
|
+
time.sleep(0.5)
|
|
67
|
+
return False
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def sleep(ms: float) -> None:
|
|
71
|
+
time.sleep(ms / 1000)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def get_endpoint_url(port: int, protocol: str) -> str:
|
|
75
|
+
if protocol == "MCP":
|
|
76
|
+
return f"http://localhost:{port}/mcp"
|
|
77
|
+
if protocol == "A2A":
|
|
78
|
+
return f"http://localhost:{port}/"
|
|
79
|
+
return f"http://localhost:{port}/invocations"
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def format_mcp_tool_list(tools: list[dict[str, Any]]) -> str:
|
|
83
|
+
lines = []
|
|
84
|
+
for t in tools:
|
|
85
|
+
props = (t.get("inputSchema") or {}).get("properties")
|
|
86
|
+
params = (
|
|
87
|
+
", ".join(f"{name}: {(schema or {}).get('type') or 'any'}" for name, schema in props.items())
|
|
88
|
+
if props
|
|
89
|
+
else ""
|
|
90
|
+
)
|
|
91
|
+
desc = f" - {t['description']}" if t.get("description") else ""
|
|
92
|
+
lines.append(f" {t['name']}({params}){desc}")
|
|
93
|
+
joined = "\n".join(lines)
|
|
94
|
+
return (
|
|
95
|
+
f"Available tools ({len(tools)}):\n{joined}\n\n"
|
|
96
|
+
'Type: tool_name {"arg": "value"} to call a tool. Type "list" to refresh.'
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class FetchFailedError(ConnectionError):
|
|
101
|
+
"""Raised when a local HTTP request cannot connect (Node's ``TypeError: fetch failed``)."""
|
|
102
|
+
|
|
103
|
+
def __init__(self, cause: BaseException | None = None):
|
|
104
|
+
super().__init__("fetch failed")
|
|
105
|
+
self.__cause__ = cause
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def is_connection_error(error: BaseException) -> bool:
|
|
109
|
+
"""Only network-level failures (connection refused / fetch failed), not application errors."""
|
|
110
|
+
message = str(error)
|
|
111
|
+
return (
|
|
112
|
+
isinstance(error, (FetchFailedError, ConnectionRefusedError))
|
|
113
|
+
or "ECONNREFUSED" in message
|
|
114
|
+
or (message == "fetch failed")
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def convert_entrypoint_to_module(entrypoint: str) -> str:
|
|
119
|
+
if ":" in entrypoint:
|
|
120
|
+
return entrypoint
|
|
121
|
+
path = entrypoint.removesuffix(".py")
|
|
122
|
+
return f"{path.replace('/', '.')}:app"
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def on_shutdown_signal(handler: Callable[[], None]) -> None:
|
|
126
|
+
"""Run ``handler`` once on the first SIGINT/SIGTERM (``process.once`` semantics)."""
|
|
127
|
+
fired = threading.Event()
|
|
128
|
+
previous: dict[int, Any] = {}
|
|
129
|
+
|
|
130
|
+
def _handle(signum: int, _frame: Any) -> None:
|
|
131
|
+
for sig, prev in previous.items():
|
|
132
|
+
try:
|
|
133
|
+
signal.signal(sig, prev)
|
|
134
|
+
except (ValueError, OSError):
|
|
135
|
+
pass
|
|
136
|
+
if not fired.is_set():
|
|
137
|
+
fired.set()
|
|
138
|
+
handler()
|
|
139
|
+
|
|
140
|
+
for sig in (signal.SIGINT, signal.SIGTERM):
|
|
141
|
+
try:
|
|
142
|
+
previous[sig] = signal.getsignal(sig)
|
|
143
|
+
signal.signal(sig, _handle)
|
|
144
|
+
except (ValueError, OSError): # not the main thread
|
|
145
|
+
pass
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def open_browser(url: str) -> None:
|
|
149
|
+
try:
|
|
150
|
+
webbrowser.open(url)
|
|
151
|
+
except Exception: # noqa: BLE001 - best effort, like the detached spawn upstream
|
|
152
|
+
pass
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Local web UI server for `agentcore dev` (port of operations/dev/web-ui)."""
|
|
2
|
+
|
|
3
|
+
from agentcore.operations.dev.web_ui.constants import (
|
|
4
|
+
WEB_UI_DEFAULT_PORT,
|
|
5
|
+
WEB_UI_LOCAL_URL,
|
|
6
|
+
AgentError,
|
|
7
|
+
AgentInfo,
|
|
8
|
+
HarnessInfo,
|
|
9
|
+
)
|
|
10
|
+
from agentcore.operations.dev.web_ui.run_web_ui import run_web_ui
|
|
11
|
+
from agentcore.operations.dev.web_ui.web_server import (
|
|
12
|
+
CSP_HEADER,
|
|
13
|
+
RunningAgent,
|
|
14
|
+
WebUIOptions,
|
|
15
|
+
WebUIServer,
|
|
16
|
+
resolve_ui_dist_dir,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"CSP_HEADER",
|
|
21
|
+
"WEB_UI_DEFAULT_PORT",
|
|
22
|
+
"WEB_UI_LOCAL_URL",
|
|
23
|
+
"AgentError",
|
|
24
|
+
"AgentInfo",
|
|
25
|
+
"HarnessInfo",
|
|
26
|
+
"RunningAgent",
|
|
27
|
+
"WebUIOptions",
|
|
28
|
+
"WebUIServer",
|
|
29
|
+
"resolve_ui_dist_dir",
|
|
30
|
+
"run_web_ui",
|
|
31
|
+
]
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""Port of operations/dev/web-ui/constants.ts."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
WEB_UI_LOCAL_URL = "http://localhost:5173"
|
|
7
|
+
|
|
8
|
+
# Default port for the web UI proxy server. Agent ports start above this.
|
|
9
|
+
WEB_UI_DEFAULT_PORT = 8081
|
|
10
|
+
|
|
11
|
+
# Metadata about an available agent: {"name", "buildType", "protocol", "runtimeIndex"?} (StatusAgent).
|
|
12
|
+
AgentInfo = dict[str, Any]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
class AgentError:
|
|
17
|
+
message: str
|
|
18
|
+
timestamp: int
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class HarnessInfo:
|
|
23
|
+
name: str
|
|
24
|
+
harness_arn: str
|
|
25
|
+
region: str
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""Web UI route handlers (port of operations/dev/web-ui/handlers). The RouteContext is the WebUIServer."""
|
|
2
|
+
|
|
3
|
+
from agentcore.operations.dev.web_ui.handlers.a2a_proxy import handle_a2a_agent_card
|
|
4
|
+
from agentcore.operations.dev.web_ui.handlers.cloudwatch_traces import (
|
|
5
|
+
handle_get_cloud_watch_trace,
|
|
6
|
+
handle_list_cloud_watch_traces,
|
|
7
|
+
)
|
|
8
|
+
from agentcore.operations.dev.web_ui.handlers.harness_invocation import (
|
|
9
|
+
handle_harness_invocation,
|
|
10
|
+
handle_harness_tool_response,
|
|
11
|
+
)
|
|
12
|
+
from agentcore.operations.dev.web_ui.handlers.invocations import handle_invocations
|
|
13
|
+
from agentcore.operations.dev.web_ui.handlers.mcp_proxy import handle_mcp_proxy
|
|
14
|
+
from agentcore.operations.dev.web_ui.handlers.memory import handle_list_memory_records, handle_retrieve_memory_records
|
|
15
|
+
from agentcore.operations.dev.web_ui.handlers.resources import handle_resources
|
|
16
|
+
from agentcore.operations.dev.web_ui.handlers.start import handle_start, resolve_agent_target_port
|
|
17
|
+
from agentcore.operations.dev.web_ui.handlers.status import handle_status
|
|
18
|
+
from agentcore.operations.dev.web_ui.handlers.traces import handle_get_trace, handle_list_traces
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"handle_a2a_agent_card",
|
|
22
|
+
"handle_get_cloud_watch_trace",
|
|
23
|
+
"handle_get_trace",
|
|
24
|
+
"handle_harness_invocation",
|
|
25
|
+
"handle_harness_tool_response",
|
|
26
|
+
"handle_invocations",
|
|
27
|
+
"handle_list_cloud_watch_traces",
|
|
28
|
+
"handle_list_memory_records",
|
|
29
|
+
"handle_list_traces",
|
|
30
|
+
"handle_mcp_proxy",
|
|
31
|
+
"handle_resources",
|
|
32
|
+
"handle_retrieve_memory_records",
|
|
33
|
+
"handle_start",
|
|
34
|
+
"handle_status",
|
|
35
|
+
"resolve_agent_target_port",
|
|
36
|
+
]
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""Shared helpers for web UI route handlers (RouteContext is the WebUIServer)."""
|
|
2
|
+
|
|
3
|
+
import math
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from agentcore.operations.dev._server import Response, js_dumps
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def send_json(ctx: Any, res: Response, origin: str | None, status: int, body: Any, cors: bool = True) -> None:
|
|
10
|
+
if cors:
|
|
11
|
+
ctx.set_cors_headers(res, origin)
|
|
12
|
+
res.write_head(status, {"Content-Type": "application/json"})
|
|
13
|
+
res.end(js_dumps(body))
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def parse_time_params(
|
|
17
|
+
ctx: Any, res: Response, origin: str | None, param: Any
|
|
18
|
+
) -> tuple[bool, float | None, float | None]:
|
|
19
|
+
"""Optional startTime/endTime epoch-ms query params; sends a 400 and returns ok=False if invalid."""
|
|
20
|
+
values: list[float | None] = []
|
|
21
|
+
for key in ("startTime", "endTime"):
|
|
22
|
+
raw = param(key)
|
|
23
|
+
if not raw:
|
|
24
|
+
values.append(None)
|
|
25
|
+
continue
|
|
26
|
+
try:
|
|
27
|
+
number = float(raw)
|
|
28
|
+
if math.isnan(number):
|
|
29
|
+
raise ValueError
|
|
30
|
+
except ValueError:
|
|
31
|
+
send_json(
|
|
32
|
+
ctx, res, origin, 400, {"success": False, "error": f"{key} must be a number (epoch milliseconds)"}
|
|
33
|
+
)
|
|
34
|
+
return False, None, None
|
|
35
|
+
values.append(int(number) if number.is_integer() else number)
|
|
36
|
+
return True, values[0], values[1]
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""Shared config loading + target resolution for ``?target=deployed`` routes."""
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from agentcore.lib.schemas.io.config_io import ConfigIO
|
|
6
|
+
from agentcore.operations.dev._server import Response
|
|
7
|
+
from agentcore.operations.dev.web_ui.handlers._common import send_json
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def resolve_deployed(
|
|
11
|
+
ctx: Any, res: Response, origin: str | None, agent_name: str | None, target_name: str | None, session_id: str | None
|
|
12
|
+
) -> Any | None:
|
|
13
|
+
"""Return the resolved invoke target, or None after sending the error response."""
|
|
14
|
+
config_io = ConfigIO(base_dir=ctx.options.config_root)
|
|
15
|
+
try:
|
|
16
|
+
project = config_io.read_project_spec()
|
|
17
|
+
deployed_state = config_io.read_deployed_state()
|
|
18
|
+
aws_targets = config_io.read_aws_deployment_targets()
|
|
19
|
+
except Exception as err: # noqa: BLE001
|
|
20
|
+
send_json(ctx, res, origin, 500, {"success": False, "error": f"Failed to load config: {err}"})
|
|
21
|
+
return None
|
|
22
|
+
|
|
23
|
+
from agentcore.cli.commands.invoke.resolve import resolve_invoke_target
|
|
24
|
+
|
|
25
|
+
resolved = resolve_invoke_target(
|
|
26
|
+
project=project,
|
|
27
|
+
deployed_state=deployed_state,
|
|
28
|
+
aws_targets=aws_targets,
|
|
29
|
+
agent_name=agent_name,
|
|
30
|
+
target_name=target_name,
|
|
31
|
+
session_id=session_id,
|
|
32
|
+
config_io=config_io,
|
|
33
|
+
)
|
|
34
|
+
if not resolved.success:
|
|
35
|
+
send_json(ctx, res, origin, 400, {"success": False, "error": str(resolved.error)})
|
|
36
|
+
return None
|
|
37
|
+
return resolved
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""GET /api/a2a/agent-card (port of handlers/a2a-proxy.ts)."""
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from agentcore.operations.dev._http import fetch
|
|
6
|
+
from agentcore.operations.dev._server import Request, Response
|
|
7
|
+
from agentcore.operations.dev.web_ui.handlers._common import send_json
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def handle_a2a_agent_card(ctx: Any, req: Request, res: Response, origin: str | None = None) -> None:
|
|
11
|
+
from agentcore.operations.dev.web_ui.web_server import parse_request_url
|
|
12
|
+
|
|
13
|
+
ctx.set_cors_headers(res, origin)
|
|
14
|
+
_, param = parse_request_url(req)
|
|
15
|
+
agent_name = param("agentName")
|
|
16
|
+
if not agent_name:
|
|
17
|
+
send_json(ctx, res, origin, 400, {"success": False, "error": "agentName query parameter is required"}, False)
|
|
18
|
+
return
|
|
19
|
+
running = ctx.running_agents.get(agent_name)
|
|
20
|
+
if not running:
|
|
21
|
+
send_json(ctx, res, origin, 400, {"success": False, "error": f'Agent "{agent_name}" is not running'}, False)
|
|
22
|
+
return
|
|
23
|
+
try:
|
|
24
|
+
headers = {"Accept": "application/json"}
|
|
25
|
+
card_res = fetch(f"http://localhost:{running.port}/.well-known/agent-card.json", headers=headers)
|
|
26
|
+
if card_res.status == 404:
|
|
27
|
+
card_res.close()
|
|
28
|
+
card_res = fetch(f"http://localhost:{running.port}/.well-known/agent.json", headers=headers)
|
|
29
|
+
if not card_res.ok:
|
|
30
|
+
card_res.close()
|
|
31
|
+
error = f"Agent card not available ({card_res.status})"
|
|
32
|
+
send_json(ctx, res, origin, 502, {"success": False, "error": error}, False)
|
|
33
|
+
return
|
|
34
|
+
card = card_res.json()
|
|
35
|
+
send_json(ctx, res, origin, 200, {"success": True, "card": card}, False)
|
|
36
|
+
except Exception as err: # noqa: BLE001
|
|
37
|
+
send_json(ctx, res, origin, 502, {"success": False, "error": f"Failed to fetch agent card: {err}"}, False)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""GET /api/cloudwatch-traces[/:traceId] (port of handlers/cloudwatch-traces.ts)."""
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from agentcore.operations.dev._server import Request, Response
|
|
7
|
+
from agentcore.operations.dev.web_ui.handlers._common import parse_time_params, send_json
|
|
8
|
+
|
|
9
|
+
_ONE_OF = "Either agentName or harnessName query parameter is required"
|
|
10
|
+
_NOT_BOTH = "Provide either agentName or harnessName, not both"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _check_target(ctx: Any, res: Response, origin: str | None, agent: str | None, harness: str | None) -> bool:
|
|
14
|
+
if not agent and not harness:
|
|
15
|
+
send_json(ctx, res, origin, 400, {"success": False, "error": _ONE_OF})
|
|
16
|
+
return False
|
|
17
|
+
if agent and harness:
|
|
18
|
+
send_json(ctx, res, origin, 400, {"success": False, "error": _NOT_BOTH})
|
|
19
|
+
return False
|
|
20
|
+
return True
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def handle_list_cloud_watch_traces(ctx: Any, req: Request, res: Response, origin: str | None = None) -> None:
|
|
24
|
+
from agentcore.operations.dev.web_ui.web_server import parse_request_url
|
|
25
|
+
|
|
26
|
+
_, param = parse_request_url(req)
|
|
27
|
+
handler = ctx.options.on_list_cloud_watch_traces
|
|
28
|
+
if not handler:
|
|
29
|
+
send_json(ctx, res, origin, 404, {"success": False, "error": "CloudWatch traces are not available"})
|
|
30
|
+
return
|
|
31
|
+
agent, harness = param("agentName"), param("harnessName")
|
|
32
|
+
if not _check_target(ctx, res, origin, agent, harness):
|
|
33
|
+
return
|
|
34
|
+
ok, start, end = parse_time_params(ctx, res, origin, param)
|
|
35
|
+
if not ok:
|
|
36
|
+
return
|
|
37
|
+
try:
|
|
38
|
+
result = handler(agent, harness, start, end)
|
|
39
|
+
send_json(ctx, res, origin, 200 if result.get("success") else 500, result)
|
|
40
|
+
except Exception as err: # noqa: BLE001
|
|
41
|
+
ctx.log("error", f"List CloudWatch traces error: {err}")
|
|
42
|
+
send_json(ctx, res, origin, 500, {"success": False, "error": "Failed to list CloudWatch traces"})
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def handle_get_cloud_watch_trace(ctx: Any, req: Request, res: Response, origin: str | None = None) -> None:
|
|
46
|
+
from agentcore.operations.dev.web_ui.web_server import parse_request_url
|
|
47
|
+
|
|
48
|
+
pathname, param = parse_request_url(req)
|
|
49
|
+
handler = ctx.options.on_get_cloud_watch_trace
|
|
50
|
+
if not handler:
|
|
51
|
+
send_json(ctx, res, origin, 404, {"success": False, "error": "CloudWatch traces are not available"})
|
|
52
|
+
return
|
|
53
|
+
trace_id = pathname.replace("/api/cloudwatch-traces/", "", 1)
|
|
54
|
+
agent, harness = param("agentName"), param("harnessName")
|
|
55
|
+
if not trace_id:
|
|
56
|
+
send_json(ctx, res, origin, 400, {"success": False, "error": "traceId is required in the URL path"})
|
|
57
|
+
return
|
|
58
|
+
if not re.fullmatch(r"[a-fA-F0-9-]+", trace_id):
|
|
59
|
+
send_json(ctx, res, origin, 400, {"success": False, "error": "Invalid trace ID format"})
|
|
60
|
+
return
|
|
61
|
+
if not _check_target(ctx, res, origin, agent, harness):
|
|
62
|
+
return
|
|
63
|
+
ok, start, end = parse_time_params(ctx, res, origin, param)
|
|
64
|
+
if not ok:
|
|
65
|
+
return
|
|
66
|
+
try:
|
|
67
|
+
result = handler(agent, harness, trace_id, start, end)
|
|
68
|
+
send_json(ctx, res, origin, 200 if result.get("success") else 500, result)
|
|
69
|
+
except Exception as err: # noqa: BLE001
|
|
70
|
+
ctx.log("error", f"Get CloudWatch trace error: {err}")
|
|
71
|
+
send_json(ctx, res, origin, 500, {"success": False, "error": "Failed to get CloudWatch trace"})
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"""Harness invocation over SSE (port of handlers/harness-invocation.ts and harness-tool-response.ts)."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import uuid
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from agentcore.operations.dev._server import Request, Response, js_dumps
|
|
8
|
+
from agentcore.operations.dev.web_ui.handlers._common import send_json
|
|
9
|
+
from agentcore.operations.dev.web_ui.handlers.harness_utils import build_invoke_options, read_local_harness_model
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _invoke_harness(**kwargs: Any): # type: ignore[no-untyped-def]
|
|
13
|
+
from agentcore.aws import agentcore_harness
|
|
14
|
+
|
|
15
|
+
return agentcore_harness.invoke_harness(**kwargs)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _stream_harness(ctx: Any, res: Response, origin: str | None, session_id: str, invoke_opts: dict[str, Any]) -> None:
|
|
19
|
+
ctx.set_cors_headers(res, origin)
|
|
20
|
+
res.write_head(
|
|
21
|
+
200,
|
|
22
|
+
{
|
|
23
|
+
"Content-Type": "text/event-stream",
|
|
24
|
+
"Cache-Control": "no-cache",
|
|
25
|
+
"Connection": "keep-alive",
|
|
26
|
+
"x-session-id": session_id,
|
|
27
|
+
},
|
|
28
|
+
)
|
|
29
|
+
try:
|
|
30
|
+
for event in _invoke_harness(**invoke_opts):
|
|
31
|
+
res.write(f"data: {js_dumps(event)}\n\n")
|
|
32
|
+
except Exception as err: # noqa: BLE001 - surfaced to the browser as an SSE error event
|
|
33
|
+
res.write(f"data: {js_dumps({'type': 'error', 'errorType': 'invocationError', 'message': str(err)})}\n\n")
|
|
34
|
+
res.end()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _find_harness(ctx: Any, name: str) -> Any | None:
|
|
38
|
+
return next((h for h in ctx.options.harnesses or [] if h.name == name), None)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def handle_harness_invocation(ctx: Any, body: dict[str, Any], res: Response, origin: str | None = None) -> None:
|
|
42
|
+
harness_name = body.get("harnessName")
|
|
43
|
+
prompt = body.get("prompt")
|
|
44
|
+
if not harness_name or not prompt:
|
|
45
|
+
error = "harnessName is required" if not harness_name else "prompt is required"
|
|
46
|
+
send_json(ctx, res, origin, 400, {"success": False, "error": error})
|
|
47
|
+
return
|
|
48
|
+
session_id = body.get("sessionId") or str(uuid.uuid4())
|
|
49
|
+
harness = _find_harness(ctx, harness_name)
|
|
50
|
+
if harness is None:
|
|
51
|
+
send_json(ctx, res, origin, 404, {"success": False, "error": f'Harness "{harness_name}" not found'})
|
|
52
|
+
return
|
|
53
|
+
messages = [{"role": "user", "content": [{"text": prompt}]}]
|
|
54
|
+
spec_model = read_local_harness_model(ctx.options.config_root, harness_name)
|
|
55
|
+
opts = build_invoke_options(
|
|
56
|
+
harness.harness_arn, harness.region, session_id, messages, body.get("harnessOverrides"), spec_model
|
|
57
|
+
)
|
|
58
|
+
_stream_harness(ctx, res, origin, session_id, opts)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def handle_harness_tool_response(ctx: Any, req: Request, res: Response, origin: str | None = None) -> None:
|
|
62
|
+
body = ctx.read_body(req)
|
|
63
|
+
try:
|
|
64
|
+
raw = json.loads(body)
|
|
65
|
+
if not isinstance(raw, dict):
|
|
66
|
+
raise ValueError
|
|
67
|
+
except ValueError:
|
|
68
|
+
send_json(ctx, res, origin, 400, {"success": False, "error": "Invalid JSON"})
|
|
69
|
+
return
|
|
70
|
+
if not raw.get("harnessName"):
|
|
71
|
+
error = "harnessName is required"
|
|
72
|
+
elif not raw.get("messages") or not isinstance(raw.get("messages"), list):
|
|
73
|
+
error = "messages array is required"
|
|
74
|
+
elif not raw.get("sessionId"):
|
|
75
|
+
error = "sessionId is required"
|
|
76
|
+
else:
|
|
77
|
+
error = None
|
|
78
|
+
if error:
|
|
79
|
+
send_json(ctx, res, origin, 400, {"success": False, "error": error})
|
|
80
|
+
return
|
|
81
|
+
harness = _find_harness(ctx, raw["harnessName"])
|
|
82
|
+
if harness is None:
|
|
83
|
+
send_json(ctx, res, origin, 404, {"success": False, "error": f'Harness "{raw["harnessName"]}" not found'})
|
|
84
|
+
return
|
|
85
|
+
spec_model = read_local_harness_model(ctx.options.config_root, raw["harnessName"])
|
|
86
|
+
opts = build_invoke_options(
|
|
87
|
+
harness.harness_arn, harness.region, raw["sessionId"], raw["messages"], raw.get("harnessOverrides"), spec_model
|
|
88
|
+
)
|
|
89
|
+
_stream_harness(ctx, res, origin, raw["sessionId"], opts)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""Port of handlers/harness-utils.ts: build InvokeHarness kwargs for dev invocations."""
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from agentcore.lib.schemas.io.config_io import ConfigIO
|
|
6
|
+
|
|
7
|
+
DEFAULT_MAX_ITERATIONS = 75
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def build_model_override(spec_model: Any) -> dict[str, Any] | None:
|
|
11
|
+
"""Map the local harness spec's model onto the invoke API's model configuration."""
|
|
12
|
+
common: dict[str, Any] = {"modelId": spec_model.model_id}
|
|
13
|
+
if spec_model.temperature is not None:
|
|
14
|
+
common["temperature"] = spec_model.temperature
|
|
15
|
+
if spec_model.top_p is not None:
|
|
16
|
+
common["topP"] = spec_model.top_p
|
|
17
|
+
if spec_model.max_tokens is not None:
|
|
18
|
+
common["maxTokens"] = spec_model.max_tokens
|
|
19
|
+
provider = spec_model.provider
|
|
20
|
+
if provider == "bedrock":
|
|
21
|
+
return {
|
|
22
|
+
"bedrockModelConfig": {**common, **({"apiFormat": spec_model.api_format} if spec_model.api_format else {})}
|
|
23
|
+
}
|
|
24
|
+
if provider == "open_ai":
|
|
25
|
+
extra: dict[str, Any] = {}
|
|
26
|
+
if spec_model.api_key_arn:
|
|
27
|
+
extra["apiKeyArn"] = spec_model.api_key_arn
|
|
28
|
+
if spec_model.api_format and spec_model.api_format != "converse_stream":
|
|
29
|
+
extra["apiFormat"] = spec_model.api_format
|
|
30
|
+
return {"openAiModelConfig": {**common, **extra}}
|
|
31
|
+
if provider == "gemini":
|
|
32
|
+
extra = {}
|
|
33
|
+
if spec_model.api_key_arn:
|
|
34
|
+
extra["apiKeyArn"] = spec_model.api_key_arn
|
|
35
|
+
if spec_model.top_k is not None:
|
|
36
|
+
extra["topK"] = spec_model.top_k
|
|
37
|
+
return {"geminiModelConfig": {**common, **extra}}
|
|
38
|
+
if provider == "lite_llm":
|
|
39
|
+
extra = {}
|
|
40
|
+
if spec_model.api_key_arn:
|
|
41
|
+
extra["apiKeyArn"] = spec_model.api_key_arn
|
|
42
|
+
if spec_model.api_base:
|
|
43
|
+
extra["apiBase"] = spec_model.api_base
|
|
44
|
+
if spec_model.additional_params:
|
|
45
|
+
extra["additionalParams"] = spec_model.additional_params
|
|
46
|
+
return {"liteLlmModelConfig": {**common, **extra}}
|
|
47
|
+
return None
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def read_local_harness_model(config_root: str | None, harness_name: str) -> Any | None:
|
|
51
|
+
if not config_root:
|
|
52
|
+
return None
|
|
53
|
+
try:
|
|
54
|
+
return ConfigIO(base_dir=config_root).read_harness_spec(harness_name).model
|
|
55
|
+
except Exception: # noqa: BLE001 - best effort, as upstream
|
|
56
|
+
return None
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def build_invoke_options(
|
|
60
|
+
harness_arn: str,
|
|
61
|
+
region: str,
|
|
62
|
+
session_id: str,
|
|
63
|
+
messages: list[dict[str, Any]],
|
|
64
|
+
overrides: dict[str, Any] | None = None,
|
|
65
|
+
spec_model: Any | None = None,
|
|
66
|
+
) -> dict[str, Any]:
|
|
67
|
+
"""Keyword arguments for :func:`agentcore.aws.agentcore_harness.invoke_harness`."""
|
|
68
|
+
overrides = overrides or {}
|
|
69
|
+
opts: dict[str, Any] = {
|
|
70
|
+
"region": region,
|
|
71
|
+
"harness_arn": harness_arn,
|
|
72
|
+
"runtime_session_id": session_id,
|
|
73
|
+
"messages": messages,
|
|
74
|
+
}
|
|
75
|
+
if overrides.get("model"):
|
|
76
|
+
opts["model"] = overrides["model"]
|
|
77
|
+
elif spec_model is not None:
|
|
78
|
+
opts["model"] = build_model_override(spec_model)
|
|
79
|
+
if overrides.get("systemPrompt"):
|
|
80
|
+
opts["system_prompt"] = [{"text": overrides["systemPrompt"]}]
|
|
81
|
+
if overrides.get("skills"):
|
|
82
|
+
opts["skills"] = overrides["skills"]
|
|
83
|
+
if overrides.get("actorId"):
|
|
84
|
+
opts["actor_id"] = overrides["actorId"]
|
|
85
|
+
max_iterations = overrides.get("maxIterations")
|
|
86
|
+
opts["max_iterations"] = max_iterations if max_iterations is not None else DEFAULT_MAX_ITERATIONS
|
|
87
|
+
if overrides.get("maxTokens") is not None:
|
|
88
|
+
opts["max_tokens"] = overrides["maxTokens"]
|
|
89
|
+
if overrides.get("timeoutSeconds") is not None:
|
|
90
|
+
opts["timeout_seconds"] = overrides["timeoutSeconds"]
|
|
91
|
+
if overrides.get("allowedTools"):
|
|
92
|
+
opts["allowed_tools"] = overrides["allowedTools"]
|
|
93
|
+
if overrides.get("tools"):
|
|
94
|
+
opts["tools"] = overrides["tools"]
|
|
95
|
+
return opts
|