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.
Files changed (655) hide show
  1. agentcore/__init__.py +1 -0
  2. agentcore/agent_inspector/NOTICE +9 -0
  3. agentcore/agent_inspector/favicon.svg +60 -0
  4. agentcore/agent_inspector/index.css +1 -0
  5. agentcore/agent_inspector/index.html +14 -0
  6. agentcore/agent_inspector/index.js +289 -0
  7. agentcore/assets/AGENTS.md +60 -0
  8. agentcore/assets/README.md +108 -0
  9. agentcore/assets/agents/AGENTS.md +218 -0
  10. agentcore/assets/cdk/.prettierrc +8 -0
  11. agentcore/assets/cdk/README.md +26 -0
  12. agentcore/assets/cdk/bin/cdk.ts +216 -0
  13. agentcore/assets/cdk/cdk.json +88 -0
  14. agentcore/assets/cdk/gitignore.template +9 -0
  15. agentcore/assets/cdk/jest.config.js +9 -0
  16. agentcore/assets/cdk/lib/cdk-stack.ts +291 -0
  17. agentcore/assets/cdk/npmignore.template +6 -0
  18. agentcore/assets/cdk/package.json +30 -0
  19. agentcore/assets/cdk/test/cdk.test.ts +31 -0
  20. agentcore/assets/cdk/tsconfig.json +28 -0
  21. agentcore/assets/container/python/Dockerfile +47 -0
  22. agentcore/assets/container/python/dockerignore.template +27 -0
  23. agentcore/assets/container/typescript/Dockerfile +25 -0
  24. agentcore/assets/container/typescript/dockerignore.template +24 -0
  25. agentcore/assets/datasets/predefined-v1.jsonl +3 -0
  26. agentcore/assets/datasets/simulated-v1.jsonl +3 -0
  27. agentcore/assets/evaluators/autoevals-lambda/execution-role-policy.json +15 -0
  28. agentcore/assets/evaluators/autoevals-lambda/lambda_function.py +37 -0
  29. agentcore/assets/evaluators/autoevals-lambda/pyproject.toml +22 -0
  30. agentcore/assets/evaluators/deepeval-lambda/execution-role-policy.json +15 -0
  31. agentcore/assets/evaluators/deepeval-lambda/lambda_function.py +29 -0
  32. agentcore/assets/evaluators/deepeval-lambda/pyproject.toml +19 -0
  33. agentcore/assets/evaluators/python-lambda/execution-role-policy.json +10 -0
  34. agentcore/assets/evaluators/python-lambda/lambda_function.py +19 -0
  35. agentcore/assets/evaluators/python-lambda/pyproject.toml +15 -0
  36. agentcore/assets/harness/invoke.py.template +74 -0
  37. agentcore/assets/mcp/python/README.md +27 -0
  38. agentcore/assets/mcp/python/pyproject.toml +22 -0
  39. agentcore/assets/mcp/python/server.py +117 -0
  40. agentcore/assets/mcp/python-lambda/README.md +22 -0
  41. agentcore/assets/mcp/python-lambda/handler.py +144 -0
  42. agentcore/assets/mcp/python-lambda/pyproject.toml +15 -0
  43. agentcore/assets/python/a2a/googleadk/base/README.md +22 -0
  44. agentcore/assets/python/a2a/googleadk/base/gitignore.template +41 -0
  45. agentcore/assets/python/a2a/googleadk/base/main.py +124 -0
  46. agentcore/assets/python/a2a/googleadk/base/model/__init__.py +1 -0
  47. agentcore/assets/python/a2a/googleadk/base/model/load.py +41 -0
  48. agentcore/assets/python/a2a/googleadk/base/pyproject.toml +22 -0
  49. agentcore/assets/python/a2a/langchain_langgraph/base/README.md +22 -0
  50. agentcore/assets/python/a2a/langchain_langgraph/base/gitignore.template +41 -0
  51. agentcore/assets/python/a2a/langchain_langgraph/base/main.py +144 -0
  52. agentcore/assets/python/a2a/langchain_langgraph/base/model/__init__.py +1 -0
  53. agentcore/assets/python/a2a/langchain_langgraph/base/model/load.py +123 -0
  54. agentcore/assets/python/a2a/langchain_langgraph/base/pyproject.toml +26 -0
  55. agentcore/assets/python/a2a/strands/base/README.md +22 -0
  56. agentcore/assets/python/a2a/strands/base/gitignore.template +41 -0
  57. agentcore/assets/python/a2a/strands/base/main.py +113 -0
  58. agentcore/assets/python/a2a/strands/base/model/__init__.py +1 -0
  59. agentcore/assets/python/a2a/strands/base/model/load.py +123 -0
  60. agentcore/assets/python/a2a/strands/base/pyproject.toml +23 -0
  61. agentcore/assets/python/a2a/strands/capabilities/memory/__init__.py +1 -0
  62. agentcore/assets/python/a2a/strands/capabilities/memory/session.py +46 -0
  63. agentcore/assets/python/agui/googleadk/base/README.md +30 -0
  64. agentcore/assets/python/agui/googleadk/base/gitignore.template +41 -0
  65. agentcore/assets/python/agui/googleadk/base/main.py +91 -0
  66. agentcore/assets/python/agui/googleadk/base/model/__init__.py +1 -0
  67. agentcore/assets/python/agui/googleadk/base/model/load.py +41 -0
  68. agentcore/assets/python/agui/googleadk/base/pyproject.toml +25 -0
  69. agentcore/assets/python/agui/langchain_langgraph/base/README.md +22 -0
  70. agentcore/assets/python/agui/langchain_langgraph/base/gitignore.template +41 -0
  71. agentcore/assets/python/agui/langchain_langgraph/base/main.py +130 -0
  72. agentcore/assets/python/agui/langchain_langgraph/base/model/__init__.py +1 -0
  73. agentcore/assets/python/agui/langchain_langgraph/base/model/load.py +123 -0
  74. agentcore/assets/python/agui/langchain_langgraph/base/pyproject.toml +31 -0
  75. agentcore/assets/python/agui/strands/base/README.md +22 -0
  76. agentcore/assets/python/agui/strands/base/gitignore.template +41 -0
  77. agentcore/assets/python/agui/strands/base/main.py +105 -0
  78. agentcore/assets/python/agui/strands/base/model/__init__.py +1 -0
  79. agentcore/assets/python/agui/strands/base/model/load.py +123 -0
  80. agentcore/assets/python/agui/strands/base/pyproject.toml +27 -0
  81. agentcore/assets/python/agui/strands/capabilities/memory/__init__.py +1 -0
  82. agentcore/assets/python/agui/strands/capabilities/memory/session.py +46 -0
  83. agentcore/assets/python/http/autogen/base/README.md +45 -0
  84. agentcore/assets/python/http/autogen/base/gitignore.template +41 -0
  85. agentcore/assets/python/http/autogen/base/main.py +145 -0
  86. agentcore/assets/python/http/autogen/base/mcp_client/__init__.py +1 -0
  87. agentcore/assets/python/http/autogen/base/mcp_client/client.py +28 -0
  88. agentcore/assets/python/http/autogen/base/model/__init__.py +1 -0
  89. agentcore/assets/python/http/autogen/base/model/load.py +136 -0
  90. agentcore/assets/python/http/autogen/base/pyproject.toml +34 -0
  91. agentcore/assets/python/http/bma/base/Dockerfile +41 -0
  92. agentcore/assets/python/http/bma/base/README.md +178 -0
  93. agentcore/assets/python/http/bma/base/client.py +200 -0
  94. agentcore/assets/python/http/bma/base/lifecycle/server.py +641 -0
  95. agentcore/assets/python/http/bma/base/otel/collector.yaml +69 -0
  96. agentcore/assets/python/http/bma/base/plugins/acr-report/.codex-plugin/plugin.json +6 -0
  97. agentcore/assets/python/http/bma/base/plugins/acr-report/skills/acr-report/SKILL.md +16 -0
  98. agentcore/assets/python/http/bma/base/policies/bma-acr-policy.json +11 -0
  99. agentcore/assets/python/http/bma/base/policies/bma-session-policy.json +35 -0
  100. agentcore/assets/python/http/bma/base/policies/bma-session-trust.json +20 -0
  101. agentcore/assets/python/http/bma/base/pyproject.toml +21 -0
  102. agentcore/assets/python/http/googleadk/base/README.md +45 -0
  103. agentcore/assets/python/http/googleadk/base/gitignore.template +41 -0
  104. agentcore/assets/python/http/googleadk/base/main.py +207 -0
  105. agentcore/assets/python/http/googleadk/base/mcp_client/__init__.py +1 -0
  106. agentcore/assets/python/http/googleadk/base/mcp_client/client.py +75 -0
  107. agentcore/assets/python/http/googleadk/base/model/__init__.py +1 -0
  108. agentcore/assets/python/http/googleadk/base/model/load.py +41 -0
  109. agentcore/assets/python/http/googleadk/base/pyproject.toml +24 -0
  110. agentcore/assets/python/http/langchain_langgraph/base/README.md +45 -0
  111. agentcore/assets/python/http/langchain_langgraph/base/gitignore.template +41 -0
  112. agentcore/assets/python/http/langchain_langgraph/base/main.py +227 -0
  113. agentcore/assets/python/http/langchain_langgraph/base/mcp_client/__init__.py +1 -0
  114. agentcore/assets/python/http/langchain_langgraph/base/mcp_client/client.py +79 -0
  115. agentcore/assets/python/http/langchain_langgraph/base/model/__init__.py +1 -0
  116. agentcore/assets/python/http/langchain_langgraph/base/model/load.py +123 -0
  117. agentcore/assets/python/http/langchain_langgraph/base/pyproject.toml +38 -0
  118. agentcore/assets/python/http/openaiagents/base/README.md +45 -0
  119. agentcore/assets/python/http/openaiagents/base/gitignore.template +41 -0
  120. agentcore/assets/python/http/openaiagents/base/main.py +200 -0
  121. agentcore/assets/python/http/openaiagents/base/mcp_client/__init__.py +1 -0
  122. agentcore/assets/python/http/openaiagents/base/mcp_client/client.py +74 -0
  123. agentcore/assets/python/http/openaiagents/base/model/__init__.py +1 -0
  124. agentcore/assets/python/http/openaiagents/base/model/load.py +37 -0
  125. agentcore/assets/python/http/openaiagents/base/pyproject.toml +21 -0
  126. agentcore/assets/python/http/strands/base/README.md +46 -0
  127. agentcore/assets/python/http/strands/base/gitignore.template +41 -0
  128. agentcore/assets/python/http/strands/base/main.py +714 -0
  129. agentcore/assets/python/http/strands/base/mcp_client/__init__.py +1 -0
  130. agentcore/assets/python/http/strands/base/mcp_client/client.py +116 -0
  131. agentcore/assets/python/http/strands/base/model/__init__.py +1 -0
  132. agentcore/assets/python/http/strands/base/model/load.py +239 -0
  133. agentcore/assets/python/http/strands/base/model/mantle_compat.py +21 -0
  134. agentcore/assets/python/http/strands/base/pyproject.toml +31 -0
  135. agentcore/assets/python/http/strands/base/skills/fetcher.py +279 -0
  136. agentcore/assets/python/http/strands/capabilities/execution-limits/hooks/execution_limits.py +54 -0
  137. agentcore/assets/python/http/strands/capabilities/memory/__init__.py +1 -0
  138. agentcore/assets/python/http/strands/capabilities/memory/session.py +47 -0
  139. agentcore/assets/python/http/strands/capabilities/payments/__init__.py +4 -0
  140. agentcore/assets/python/http/strands/capabilities/payments/payments.py +142 -0
  141. agentcore/assets/python/mcp/standalone/base/README.md +36 -0
  142. agentcore/assets/python/mcp/standalone/base/gitignore.template +41 -0
  143. agentcore/assets/python/mcp/standalone/base/main.py +83 -0
  144. agentcore/assets/python/mcp/standalone/base/pyproject.toml +16 -0
  145. agentcore/assets/typescript/.gitkeep +0 -0
  146. agentcore/assets/typescript/http/strands/base/README.md +42 -0
  147. agentcore/assets/typescript/http/strands/base/gitignore.template +22 -0
  148. agentcore/assets/typescript/http/strands/base/main.ts +149 -0
  149. agentcore/assets/typescript/http/strands/base/mcp_client/client.ts +11 -0
  150. agentcore/assets/typescript/http/strands/base/model/load.ts +102 -0
  151. agentcore/assets/typescript/http/strands/base/package.json +38 -0
  152. agentcore/assets/typescript/http/strands/base/tsconfig.json +19 -0
  153. agentcore/assets/typescript/http/strands/capabilities/memory/memory.ts +52 -0
  154. agentcore/assets/typescript/http/vercelai/base/README.md +42 -0
  155. agentcore/assets/typescript/http/vercelai/base/gitignore.template +22 -0
  156. agentcore/assets/typescript/http/vercelai/base/main.ts +70 -0
  157. agentcore/assets/typescript/http/vercelai/base/model/load.ts +121 -0
  158. agentcore/assets/typescript/http/vercelai/base/package.json +35 -0
  159. agentcore/assets/typescript/http/vercelai/base/tsconfig.json +19 -0
  160. agentcore/aws/__init__.py +263 -0
  161. agentcore/aws/_aws_errors.py +72 -0
  162. agentcore/aws/_http.py +176 -0
  163. agentcore/aws/_util.py +37 -0
  164. agentcore/aws/account.py +165 -0
  165. agentcore/aws/agentcore.py +971 -0
  166. agentcore/aws/agentcore_ab_tests.py +230 -0
  167. agentcore/aws/agentcore_batch_evaluation.py +227 -0
  168. agentcore/aws/agentcore_config_bundles.py +220 -0
  169. agentcore/aws/agentcore_control.py +994 -0
  170. agentcore/aws/agentcore_datasets.py +222 -0
  171. agentcore/aws/agentcore_harness.py +330 -0
  172. agentcore/aws/agentcore_payments.py +430 -0
  173. agentcore/aws/agentcore_recommendation.py +140 -0
  174. agentcore/aws/agui_parser.py +131 -0
  175. agentcore/aws/agui_types.py +342 -0
  176. agentcore/aws/api_client.py +87 -0
  177. agentcore/aws/arn.py +18 -0
  178. agentcore/aws/aws_context.py +23 -0
  179. agentcore/aws/bedrock.py +44 -0
  180. agentcore/aws/bedrock_agent.py +129 -0
  181. agentcore/aws/bedrock_import.py +252 -0
  182. agentcore/aws/bedrock_import_types.py +111 -0
  183. agentcore/aws/cloudwatch.py +136 -0
  184. agentcore/aws/connect_shell.py +266 -0
  185. agentcore/aws/iam.py +41 -0
  186. agentcore/aws/partition.py +58 -0
  187. agentcore/aws/policy_generation.py +116 -0
  188. agentcore/aws/region.py +54 -0
  189. agentcore/aws/retry.py +27 -0
  190. agentcore/aws/shell_framer.py +136 -0
  191. agentcore/aws/stage_endpoint.py +39 -0
  192. agentcore/aws/target_region.py +54 -0
  193. agentcore/aws/transaction_search.py +97 -0
  194. agentcore/cdk/__init__.py +10 -0
  195. agentcore/cdk/constants.py +13 -0
  196. agentcore/cdk/local_cdk_project.py +48 -0
  197. agentcore/cdk/toolkit.py +706 -0
  198. agentcore/cli/__init__.py +0 -0
  199. agentcore/cli/commands/__init__.py +0 -0
  200. agentcore/cli/commands/_jobs_common.py +39 -0
  201. agentcore/cli/commands/_run_wizards.py +639 -0
  202. agentcore/cli/commands/add/__init__.py +37 -0
  203. agentcore/cli/commands/add/_commander.py +52 -0
  204. agentcore/cli/commands/add/_common.py +47 -0
  205. agentcore/cli/commands/add/agent_wizard.py +528 -0
  206. agentcore/cli/commands/add/auth_options.py +154 -0
  207. agentcore/cli/commands/add/skill_action.py +105 -0
  208. agentcore/cli/commands/add/skill_command.py +87 -0
  209. agentcore/cli/commands/add/tool_action.py +160 -0
  210. agentcore/cli/commands/add/tool_command.py +117 -0
  211. agentcore/cli/commands/add/validate.py +333 -0
  212. agentcore/cli/commands/capacity_provider/__init__.py +86 -0
  213. agentcore/cli/commands/capacity_provider/action.py +114 -0
  214. agentcore/cli/commands/capacity_provider/constants.py +22 -0
  215. agentcore/cli/commands/config.py +91 -0
  216. agentcore/cli/commands/config_bundle.py +251 -0
  217. agentcore/cli/commands/create/__init__.py +643 -0
  218. agentcore/cli/commands/create/action.py +406 -0
  219. agentcore/cli/commands/create/dependencies.py +91 -0
  220. agentcore/cli/commands/create/harness_validate.py +82 -0
  221. agentcore/cli/commands/create/validate.py +195 -0
  222. agentcore/cli/commands/create/wizard.py +127 -0
  223. agentcore/cli/commands/dataset.py +119 -0
  224. agentcore/cli/commands/deploy/__init__.py +31 -0
  225. agentcore/cli/commands/deploy/_guards.py +25 -0
  226. agentcore/cli/commands/deploy/actions.py +840 -0
  227. agentcore/cli/commands/deploy/command.py +349 -0
  228. agentcore/cli/commands/deploy/progress.py +115 -0
  229. agentcore/cli/commands/deploy/types.py +68 -0
  230. agentcore/cli/commands/deploy/utils.py +43 -0
  231. agentcore/cli/commands/deploy/validate.py +21 -0
  232. agentcore/cli/commands/dev/__init__.py +5 -0
  233. agentcore/cli/commands/dev/_deps.py +50 -0
  234. agentcore/cli/commands/dev/browser_mode.py +270 -0
  235. agentcore/cli/commands/dev/command.py +450 -0
  236. agentcore/cli/commands/dev/terminal_mode.py +379 -0
  237. agentcore/cli/commands/exec/__init__.py +29 -0
  238. agentcore/cli/commands/exec/action.py +442 -0
  239. agentcore/cli/commands/exec/command.py +206 -0
  240. agentcore/cli/commands/exec/types.py +35 -0
  241. agentcore/cli/commands/export/__init__.py +114 -0
  242. agentcore/cli/commands/export/constants.py +21 -0
  243. agentcore/cli/commands/export/fetch_harness_spec.py +234 -0
  244. agentcore/cli/commands/export/harness_action.py +385 -0
  245. agentcore/cli/commands/export/harness_mapper.py +868 -0
  246. agentcore/cli/commands/export/harness_resolver.py +95 -0
  247. agentcore/cli/commands/export/types.py +90 -0
  248. agentcore/cli/commands/export/wizard.py +97 -0
  249. agentcore/cli/commands/feedback/__init__.py +69 -0
  250. agentcore/cli/commands/feedback/action.py +30 -0
  251. agentcore/cli/commands/feedback/consent_prompt.py +35 -0
  252. agentcore/cli/commands/feedback/wizard.py +49 -0
  253. agentcore/cli/commands/fetch/__init__.py +69 -0
  254. agentcore/cli/commands/fetch/action.py +62 -0
  255. agentcore/cli/commands/help.py +65 -0
  256. agentcore/cli/commands/import_/__init__.py +167 -0
  257. agentcore/cli/commands/import_/_js.py +72 -0
  258. agentcore/cli/commands/import_/actions.py +457 -0
  259. agentcore/cli/commands/import_/constants.py +45 -0
  260. agentcore/cli/commands/import_/import_evaluator.py +140 -0
  261. agentcore/cli/commands/import_/import_gateway.py +520 -0
  262. agentcore/cli/commands/import_/import_memory.py +128 -0
  263. agentcore/cli/commands/import_/import_online_eval.py +165 -0
  264. agentcore/cli/commands/import_/import_pipeline.py +145 -0
  265. agentcore/cli/commands/import_/import_runtime.py +214 -0
  266. agentcore/cli/commands/import_/import_utils.py +410 -0
  267. agentcore/cli/commands/import_/phase1_update.py +110 -0
  268. agentcore/cli/commands/import_/phase2_import.py +206 -0
  269. agentcore/cli/commands/import_/resource_import.py +228 -0
  270. agentcore/cli/commands/import_/template_utils.py +148 -0
  271. agentcore/cli/commands/import_/types.py +150 -0
  272. agentcore/cli/commands/import_/yaml_parser.py +265 -0
  273. agentcore/cli/commands/init.py +196 -0
  274. agentcore/cli/commands/invoke/__init__.py +32 -0
  275. agentcore/cli/commands/invoke/_deps.py +73 -0
  276. agentcore/cli/commands/invoke/action.py +840 -0
  277. agentcore/cli/commands/invoke/command.py +490 -0
  278. agentcore/cli/commands/invoke/constants.py +40 -0
  279. agentcore/cli/commands/invoke/guards.py +23 -0
  280. agentcore/cli/commands/invoke/interactive.py +604 -0
  281. agentcore/cli/commands/invoke/resolve.py +149 -0
  282. agentcore/cli/commands/invoke/resolve_prompt.py +60 -0
  283. agentcore/cli/commands/invoke/types.py +61 -0
  284. agentcore/cli/commands/invoke/validate.py +33 -0
  285. agentcore/cli/commands/job_actions.py +239 -0
  286. agentcore/cli/commands/job_history.py +380 -0
  287. agentcore/cli/commands/logs/__init__.py +53 -0
  288. agentcore/cli/commands/logs/action.py +159 -0
  289. agentcore/cli/commands/logs/filter_pattern.py +17 -0
  290. agentcore/cli/commands/logs/guards.py +51 -0
  291. agentcore/cli/commands/logs_evals.py +42 -0
  292. agentcore/cli/commands/package.py +118 -0
  293. agentcore/cli/commands/remove/__init__.py +172 -0
  294. agentcore/cli/commands/remove/skill_command.py +131 -0
  295. agentcore/cli/commands/remove/tool_command.py +59 -0
  296. agentcore/cli/commands/run.py +808 -0
  297. agentcore/cli/commands/run_ingest.py +97 -0
  298. agentcore/cli/commands/shared/__init__.py +0 -0
  299. agentcore/cli/commands/shared/arn_utils.py +9 -0
  300. agentcore/cli/commands/shared/filesystem_utils.py +421 -0
  301. agentcore/cli/commands/shared/header_utils.py +87 -0
  302. agentcore/cli/commands/shared/indexed_key_parser.py +76 -0
  303. agentcore/cli/commands/shared/lifecycle_utils.py +72 -0
  304. agentcore/cli/commands/shared/region_utils.py +20 -0
  305. agentcore/cli/commands/shared/vpc_utils.py +99 -0
  306. agentcore/cli/commands/status/__init__.py +30 -0
  307. agentcore/cli/commands/status/_guards.py +25 -0
  308. agentcore/cli/commands/status/action.py +741 -0
  309. agentcore/cli/commands/status/command.py +321 -0
  310. agentcore/cli/commands/status/constants.py +36 -0
  311. agentcore/cli/commands/status/format_knowledge_base.py +111 -0
  312. agentcore/cli/commands/telemetry.py +79 -0
  313. agentcore/cli/commands/traces/__init__.py +155 -0
  314. agentcore/cli/commands/traces/action.py +123 -0
  315. agentcore/cli/commands/update/__init__.py +63 -0
  316. agentcore/cli/commands/update/action.py +164 -0
  317. agentcore/cli/commands/validate.py +165 -0
  318. agentcore/cli/constants.py +96 -0
  319. agentcore/cli/errors.py +118 -0
  320. agentcore/cli/external_requirements/__init__.py +67 -0
  321. agentcore/cli/external_requirements/checks.py +280 -0
  322. agentcore/cli/external_requirements/detect.py +55 -0
  323. agentcore/cli/external_requirements/versions.py +57 -0
  324. agentcore/cli/groups.py +23 -0
  325. agentcore/cli/interactive.py +85 -0
  326. agentcore/cli/main.py +137 -0
  327. agentcore/cli/naming.py +11 -0
  328. agentcore/cli/notices.py +42 -0
  329. agentcore/cli/project.py +34 -0
  330. agentcore/cli/run_command.py +27 -0
  331. agentcore/cli/tree.py +135 -0
  332. agentcore/cli/update_notifier.py +123 -0
  333. agentcore/cli/variadic.py +50 -0
  334. agentcore/cloudformation/__init__.py +84 -0
  335. agentcore/cloudformation/bootstrap.py +64 -0
  336. agentcore/cloudformation/logical_ids.py +37 -0
  337. agentcore/cloudformation/outputs.py +566 -0
  338. agentcore/cloudformation/stack_discovery.py +75 -0
  339. agentcore/cloudformation/stack_events.py +107 -0
  340. agentcore/cloudformation/stack_status.py +98 -0
  341. agentcore/cloudformation/types.py +44 -0
  342. agentcore/lib/__init__.py +68 -0
  343. agentcore/lib/constants.py +77 -0
  344. agentcore/lib/dependency_management/__init__.py +23 -0
  345. agentcore/lib/dependency_management/messages.py +92 -0
  346. agentcore/lib/dependency_management/plan.py +98 -0
  347. agentcore/lib/dependency_management/semver.py +137 -0
  348. agentcore/lib/dependency_management/sync.py +139 -0
  349. agentcore/lib/dependency_management/types.py +56 -0
  350. agentcore/lib/errors/__init__.py +5 -0
  351. agentcore/lib/errors/types.py +352 -0
  352. agentcore/lib/errors/validation.py +121 -0
  353. agentcore/lib/packaging/__init__.py +81 -0
  354. agentcore/lib/packaging/build_args.py +23 -0
  355. agentcore/lib/packaging/build_context.py +26 -0
  356. agentcore/lib/packaging/build_context_dockerignore.py +45 -0
  357. agentcore/lib/packaging/container.py +95 -0
  358. agentcore/lib/packaging/helpers.py +289 -0
  359. agentcore/lib/packaging/node.py +153 -0
  360. agentcore/lib/packaging/python.py +135 -0
  361. agentcore/lib/packaging/types.py +69 -0
  362. agentcore/lib/packaging/uv.py +45 -0
  363. agentcore/lib/result.py +104 -0
  364. agentcore/lib/schemas/__init__.py +1 -0
  365. agentcore/lib/schemas/io/__init__.py +27 -0
  366. agentcore/lib/schemas/io/config_io.py +458 -0
  367. agentcore/lib/schemas/io/global_config.py +239 -0
  368. agentcore/lib/schemas/io/path_resolver.py +132 -0
  369. agentcore/lib/secrets/__init__.py +18 -0
  370. agentcore/lib/secrets/cipher.py +70 -0
  371. agentcore/lib/secrets/key_provider.py +163 -0
  372. agentcore/lib/secrets/sensitive_keys.py +55 -0
  373. agentcore/lib/time_constants.py +4 -0
  374. agentcore/lib/utils/__init__.py +47 -0
  375. agentcore/lib/utils/aws_account.py +15 -0
  376. agentcore/lib/utils/credentials.py +68 -0
  377. agentcore/lib/utils/dotenv.py +32 -0
  378. agentcore/lib/utils/env.py +105 -0
  379. agentcore/lib/utils/json_format.py +29 -0
  380. agentcore/lib/utils/json_rpc.py +22 -0
  381. agentcore/lib/utils/platform.py +33 -0
  382. agentcore/lib/utils/polling.py +86 -0
  383. agentcore/lib/utils/subprocess.py +135 -0
  384. agentcore/lib/utils/time_parser.py +48 -0
  385. agentcore/lib/utils/validation.py +106 -0
  386. agentcore/logging/__init__.py +10 -0
  387. agentcore/logging/_common.py +77 -0
  388. agentcore/logging/cdk_io_host.py +36 -0
  389. agentcore/logging/create_logger.py +107 -0
  390. agentcore/logging/dev_logger.py +63 -0
  391. agentcore/logging/exec_logger.py +159 -0
  392. agentcore/logging/invoke_logger.py +154 -0
  393. agentcore/logging/remove_logger.py +95 -0
  394. agentcore/operations/__init__.py +0 -0
  395. agentcore/operations/agent/__init__.py +0 -0
  396. agentcore/operations/agent/config_bundle_defaults.py +31 -0
  397. agentcore/operations/agent/generate/__init__.py +28 -0
  398. agentcore/operations/agent/generate/schema_mapper.py +319 -0
  399. agentcore/operations/agent/generate/types.py +172 -0
  400. agentcore/operations/agent/generate/write_agent_to_project.py +67 -0
  401. agentcore/operations/agent/import_/__init__.py +31 -0
  402. agentcore/operations/agent/import_/base_translator.py +449 -0
  403. agentcore/operations/agent/import_/constants.py +23 -0
  404. agentcore/operations/agent/import_/execute.py +127 -0
  405. agentcore/operations/agent/import_/langgraph_translator.py +294 -0
  406. agentcore/operations/agent/import_/pyproject_generator.py +73 -0
  407. agentcore/operations/agent/import_/strands_translator.py +289 -0
  408. agentcore/operations/config_bundle/__init__.py +1 -0
  409. agentcore/operations/config_bundle/bundle_name_variants.py +9 -0
  410. agentcore/operations/config_bundle/diff_versions.py +52 -0
  411. agentcore/operations/config_bundle/resolve_bundle.py +65 -0
  412. agentcore/operations/connectors/__init__.py +3 -0
  413. agentcore/operations/connectors/translators.py +63 -0
  414. agentcore/operations/dataset/__init__.py +21 -0
  415. agentcore/operations/dataset/delete.py +7 -0
  416. agentcore/operations/dataset/publish.py +16 -0
  417. agentcore/operations/dataset/pull.py +21 -0
  418. agentcore/operations/dataset/push.py +201 -0
  419. agentcore/operations/dataset/resolve_dataset.py +65 -0
  420. agentcore/operations/dataset/status.py +18 -0
  421. agentcore/operations/dataset/wait.py +25 -0
  422. agentcore/operations/deploy/__init__.py +152 -0
  423. agentcore/operations/deploy/backfill_vpc_id.py +90 -0
  424. agentcore/operations/deploy/change_detection.py +84 -0
  425. agentcore/operations/deploy/constants.py +58 -0
  426. agentcore/operations/deploy/dependency_sync.py +105 -0
  427. agentcore/operations/deploy/ensure_target.py +30 -0
  428. agentcore/operations/deploy/gateway_status.py +44 -0
  429. agentcore/operations/deploy/managed_memory_notice.py +36 -0
  430. agentcore/operations/deploy/payment_connector_authorization.py +106 -0
  431. agentcore/operations/deploy/post_deploy_datasets.py +96 -0
  432. agentcore/operations/deploy/post_deploy_knowledge_bases.py +104 -0
  433. agentcore/operations/deploy/post_deploy_observability.py +28 -0
  434. agentcore/operations/deploy/post_deploy_online_evals.py +60 -0
  435. agentcore/operations/deploy/pre_deploy_identity.py +505 -0
  436. agentcore/operations/deploy/preflight.py +385 -0
  437. agentcore/operations/deploy/region_override.py +45 -0
  438. agentcore/operations/deploy/teardown.py +153 -0
  439. agentcore/operations/dev/__init__.py +61 -0
  440. agentcore/operations/dev/_http.py +79 -0
  441. agentcore/operations/dev/_server.py +165 -0
  442. agentcore/operations/dev/codezip_dev_server.py +151 -0
  443. agentcore/operations/dev/config.py +128 -0
  444. agentcore/operations/dev/constants.py +9 -0
  445. agentcore/operations/dev/container_dev_server.py +237 -0
  446. agentcore/operations/dev/container_runtime.py +37 -0
  447. agentcore/operations/dev/dev_server.py +244 -0
  448. agentcore/operations/dev/gateway_env.py +25 -0
  449. agentcore/operations/dev/invoke.py +214 -0
  450. agentcore/operations/dev/invoke_a2a.py +204 -0
  451. agentcore/operations/dev/invoke_agui.py +88 -0
  452. agentcore/operations/dev/invoke_mcp.py +145 -0
  453. agentcore/operations/dev/invoke_types.py +30 -0
  454. agentcore/operations/dev/load_dev_env.py +26 -0
  455. agentcore/operations/dev/memory_env.py +19 -0
  456. agentcore/operations/dev/otel/__init__.py +5 -0
  457. agentcore/operations/dev/otel/collector.py +234 -0
  458. agentcore/operations/dev/otel/transforms.py +331 -0
  459. agentcore/operations/dev/payment_env.py +50 -0
  460. agentcore/operations/dev/server.py +28 -0
  461. agentcore/operations/dev/sse_transform.py +30 -0
  462. agentcore/operations/dev/utils.py +152 -0
  463. agentcore/operations/dev/web_ui/__init__.py +31 -0
  464. agentcore/operations/dev/web_ui/constants.py +25 -0
  465. agentcore/operations/dev/web_ui/handlers/__init__.py +36 -0
  466. agentcore/operations/dev/web_ui/handlers/_common.py +36 -0
  467. agentcore/operations/dev/web_ui/handlers/_deployed.py +37 -0
  468. agentcore/operations/dev/web_ui/handlers/a2a_proxy.py +37 -0
  469. agentcore/operations/dev/web_ui/handlers/cloudwatch_traces.py +71 -0
  470. agentcore/operations/dev/web_ui/handlers/harness_invocation.py +89 -0
  471. agentcore/operations/dev/web_ui/handlers/harness_utils.py +95 -0
  472. agentcore/operations/dev/web_ui/handlers/invocations.py +327 -0
  473. agentcore/operations/dev/web_ui/handlers/mcp_proxy.py +119 -0
  474. agentcore/operations/dev/web_ui/handlers/memory.py +84 -0
  475. agentcore/operations/dev/web_ui/handlers/resources.py +351 -0
  476. agentcore/operations/dev/web_ui/handlers/start.py +182 -0
  477. agentcore/operations/dev/web_ui/handlers/status.py +25 -0
  478. agentcore/operations/dev/web_ui/handlers/traces.py +50 -0
  479. agentcore/operations/dev/web_ui/run_web_ui.py +60 -0
  480. agentcore/operations/dev/web_ui/web_server.py +297 -0
  481. agentcore/operations/eval/__init__.py +8 -0
  482. agentcore/operations/eval/list_eval_runs.py +18 -0
  483. agentcore/operations/eval/logs_eval.py +119 -0
  484. agentcore/operations/eval/pause_resume.py +90 -0
  485. agentcore/operations/eval/run_eval.py +354 -0
  486. agentcore/operations/eval/shared/__init__.py +0 -0
  487. agentcore/operations/eval/shared/dataset_loader.py +68 -0
  488. agentcore/operations/eval/shared/dataset_session_provider.py +122 -0
  489. agentcore/operations/eval/shared/evaluator_runner.py +89 -0
  490. agentcore/operations/eval/shared/scenario_executor.py +71 -0
  491. agentcore/operations/eval/shared/span_collector.py +255 -0
  492. agentcore/operations/eval/storage.py +67 -0
  493. agentcore/operations/feedback/__init__.py +21 -0
  494. agentcore/operations/feedback/aperture_client.py +98 -0
  495. agentcore/operations/feedback/build_payload.py +97 -0
  496. agentcore/operations/feedback/constants.py +26 -0
  497. agentcore/operations/feedback/submit_feedback.py +150 -0
  498. agentcore/operations/fetch_access/__init__.py +36 -0
  499. agentcore/operations/fetch_access/_target.py +17 -0
  500. agentcore/operations/fetch_access/fetch_gateway_token.py +75 -0
  501. agentcore/operations/fetch_access/fetch_harness_token.py +72 -0
  502. agentcore/operations/fetch_access/fetch_runtime_token.py +76 -0
  503. agentcore/operations/fetch_access/list_agents.py +18 -0
  504. agentcore/operations/fetch_access/list_gateways.py +26 -0
  505. agentcore/operations/fetch_access/list_harnesses.py +23 -0
  506. agentcore/operations/fetch_access/oauth_token.py +162 -0
  507. agentcore/operations/fetch_access/types.py +34 -0
  508. agentcore/operations/harness/__init__.py +1 -0
  509. agentcore/operations/harness/orphan.py +84 -0
  510. agentcore/operations/harness/skill_utils.py +56 -0
  511. agentcore/operations/identity/__init__.py +33 -0
  512. agentcore/operations/identity/api_key_credential_provider.py +68 -0
  513. agentcore/operations/identity/oauth2_credential_provider.py +95 -0
  514. agentcore/operations/ingest/__init__.py +184 -0
  515. agentcore/operations/init/__init__.py +3 -0
  516. agentcore/operations/init/files.py +59 -0
  517. agentcore/operations/insights/__init__.py +21 -0
  518. agentcore/operations/insights/insights_storage.py +67 -0
  519. agentcore/operations/insights/run_insights.py +148 -0
  520. agentcore/operations/invoke/__init__.py +5 -0
  521. agentcore/operations/invoke/resolve_agent_context.py +85 -0
  522. agentcore/operations/jobs/__init__.py +38 -0
  523. agentcore/operations/jobs/ab_test/__init__.py +0 -0
  524. agentcore/operations/jobs/ab_test/build_options.py +126 -0
  525. agentcore/operations/jobs/ab_test/format.py +121 -0
  526. agentcore/operations/jobs/ab_test/handler.py +412 -0
  527. agentcore/operations/jobs/ab_test/promote.py +142 -0
  528. agentcore/operations/jobs/ab_test/resolve.py +221 -0
  529. agentcore/operations/jobs/batch_evaluation/__init__.py +0 -0
  530. agentcore/operations/jobs/batch_evaluation/build_source.py +68 -0
  531. agentcore/operations/jobs/batch_evaluation/dataset_phase1.py +95 -0
  532. agentcore/operations/jobs/batch_evaluation/format.py +58 -0
  533. agentcore/operations/jobs/batch_evaluation/handler.py +203 -0
  534. agentcore/operations/jobs/insights/__init__.py +0 -0
  535. agentcore/operations/jobs/insights/format.py +65 -0
  536. agentcore/operations/jobs/insights/handler.py +178 -0
  537. agentcore/operations/jobs/recommendation/__init__.py +0 -0
  538. agentcore/operations/jobs/recommendation/apply_to_bundle.py +76 -0
  539. agentcore/operations/jobs/recommendation/build_config.py +271 -0
  540. agentcore/operations/jobs/recommendation/fetch_session_spans.py +93 -0
  541. agentcore/operations/jobs/recommendation/format.py +77 -0
  542. agentcore/operations/jobs/recommendation/handler.py +331 -0
  543. agentcore/operations/jobs/shared/__init__.py +0 -0
  544. agentcore/operations/jobs/shared/constants.py +85 -0
  545. agentcore/operations/jobs/shared/engine.py +187 -0
  546. agentcore/operations/jobs/shared/format.py +104 -0
  547. agentcore/operations/jobs/shared/region.py +34 -0
  548. agentcore/operations/jobs/shared/resolve_agent_state.py +30 -0
  549. agentcore/operations/jobs/shared/storage.py +117 -0
  550. agentcore/operations/jobs/shared/wait.py +30 -0
  551. agentcore/operations/knowledge_base/__init__.py +33 -0
  552. agentcore/operations/knowledge_base/connector_config.py +105 -0
  553. agentcore/operations/knowledge_base/hydrate_data_sources.py +59 -0
  554. agentcore/operations/mcp/__init__.py +4 -0
  555. agentcore/operations/memory/__init__.py +13 -0
  556. agentcore/operations/memory/_records.py +72 -0
  557. agentcore/operations/memory/list_memory_records.py +45 -0
  558. agentcore/operations/memory/retrieve_memory_records.py +52 -0
  559. agentcore/operations/node/__init__.py +15 -0
  560. agentcore/operations/node/setup.py +36 -0
  561. agentcore/operations/python/__init__.py +17 -0
  562. agentcore/operations/python/setup.py +47 -0
  563. agentcore/operations/resolve_agent.py +159 -0
  564. agentcore/operations/session/__init__.py +86 -0
  565. agentcore/operations/traces/__init__.py +29 -0
  566. agentcore/operations/traces/get_trace.py +202 -0
  567. agentcore/operations/traces/insights_query.py +74 -0
  568. agentcore/operations/traces/list_traces.py +46 -0
  569. agentcore/operations/traces/trace_url.py +25 -0
  570. agentcore/operations/traces/types.py +55 -0
  571. agentcore/primitives/__init__.py +0 -0
  572. agentcore/primitives/_gateway_target_wizard.py +293 -0
  573. agentcore/primitives/_gateway_validation.py +442 -0
  574. agentcore/primitives/_harness_cli.py +557 -0
  575. agentcore/primitives/_harness_validation.py +163 -0
  576. agentcore/primitives/_harness_wizard.py +726 -0
  577. agentcore/primitives/_knowledge_base_wizard.py +259 -0
  578. agentcore/primitives/_payment_wizard.py +331 -0
  579. agentcore/primitives/_policy_form.py +160 -0
  580. agentcore/primitives/agent.py +817 -0
  581. agentcore/primitives/auth_utils.py +77 -0
  582. agentcore/primitives/base.py +178 -0
  583. agentcore/primitives/capacity_provider.py +501 -0
  584. agentcore/primitives/config_bundle.py +329 -0
  585. agentcore/primitives/credential.py +387 -0
  586. agentcore/primitives/credential_utils.py +45 -0
  587. agentcore/primitives/dataset.py +211 -0
  588. agentcore/primitives/deployed_gateways.py +34 -0
  589. agentcore/primitives/evaluator.py +909 -0
  590. agentcore/primitives/gateway.py +496 -0
  591. agentcore/primitives/gateway_target.py +988 -0
  592. agentcore/primitives/harness.py +706 -0
  593. agentcore/primitives/knowledge_base.py +477 -0
  594. agentcore/primitives/memory.py +387 -0
  595. agentcore/primitives/online_eval_config.py +365 -0
  596. agentcore/primitives/online_insights.py +275 -0
  597. agentcore/primitives/payment_connector.py +427 -0
  598. agentcore/primitives/payment_eligible.py +20 -0
  599. agentcore/primitives/payment_manager.py +605 -0
  600. agentcore/primitives/payment_validation.py +68 -0
  601. agentcore/primitives/policy.py +622 -0
  602. agentcore/primitives/policy_engine.py +358 -0
  603. agentcore/primitives/registry.py +56 -0
  604. agentcore/primitives/runtime_endpoint.py +361 -0
  605. agentcore/primitives/secret_flag_warning.py +17 -0
  606. agentcore/schema/__init__.py +14 -0
  607. agentcore/schema/_zod.py +395 -0
  608. agentcore/schema/constants.py +306 -0
  609. agentcore/schema/schemas/__init__.py +40 -0
  610. agentcore/schema/schemas/agent_env.py +545 -0
  611. agentcore/schema/schemas/agentcore_project.py +530 -0
  612. agentcore/schema/schemas/auth.py +286 -0
  613. agentcore/schema/schemas/aws_targets.py +72 -0
  614. agentcore/schema/schemas/connections.py +187 -0
  615. agentcore/schema/schemas/deployed_state.py +322 -0
  616. agentcore/schema/schemas/mcp.py +650 -0
  617. agentcore/schema/schemas/mcp_defs.py +54 -0
  618. agentcore/schema/schemas/primitives/__init__.py +52 -0
  619. agentcore/schema/schemas/primitives/ab_test.py +162 -0
  620. agentcore/schema/schemas/primitives/capacity_provider.py +214 -0
  621. agentcore/schema/schemas/primitives/config_bundle.py +48 -0
  622. agentcore/schema/schemas/primitives/dataset.py +55 -0
  623. agentcore/schema/schemas/primitives/evaluator.py +171 -0
  624. agentcore/schema/schemas/primitives/harness.py +710 -0
  625. agentcore/schema/schemas/primitives/knowledge_base.py +90 -0
  626. agentcore/schema/schemas/primitives/memory.py +113 -0
  627. agentcore/schema/schemas/primitives/online_eval_config.py +77 -0
  628. agentcore/schema/schemas/primitives/payment.py +114 -0
  629. agentcore/schema/schemas/primitives/policy.py +83 -0
  630. agentcore/schema/schemas/primitives/tags.py +50 -0
  631. agentcore/schema/schemas/zod_util.py +5 -0
  632. agentcore/schema/types/__init__.py +3 -0
  633. agentcore/schema/types/path.py +16 -0
  634. agentcore/templates/__init__.py +115 -0
  635. agentcore/templates/_handlebars.py +782 -0
  636. agentcore/templates/_js.py +164 -0
  637. agentcore/templates/base_renderer.py +107 -0
  638. agentcore/templates/cdk_renderer.py +129 -0
  639. agentcore/templates/evaluator_renderer.py +39 -0
  640. agentcore/templates/gateway_target_renderer.py +69 -0
  641. agentcore/templates/llm_context/README.md +16 -0
  642. agentcore/templates/llm_context/agentcore.ts +685 -0
  643. agentcore/templates/llm_context/aws-targets.ts +51 -0
  644. agentcore/templates/profiles.py +151 -0
  645. agentcore/templates/render.py +92 -0
  646. agentcore/templates/renderers.py +83 -0
  647. agentcore/templates/schema_assets.py +23 -0
  648. agentcore/templates/template_root.py +28 -0
  649. agentcore/templates/types.py +192 -0
  650. agentcore_cli-0.31.1.dist-info/METADATA +84 -0
  651. agentcore_cli-0.31.1.dist-info/RECORD +655 -0
  652. agentcore_cli-0.31.1.dist-info/WHEEL +4 -0
  653. agentcore_cli-0.31.1.dist-info/entry_points.txt +2 -0
  654. agentcore_cli-0.31.1.dist-info/licenses/LICENSE +175 -0
  655. agentcore_cli-0.31.1.dist-info/licenses/NOTICE +88 -0
@@ -0,0 +1,714 @@
1
+ from typing import Any
2
+ from collections import OrderedDict
3
+ {{#if inlineFunctionTools}}
4
+ import json
5
+
6
+ from strands.tools.tools import PythonAgentTool
7
+ from strands.types.tools import ToolResult, ToolUse
8
+ {{/if}}
9
+ from strands import Agent, tool
10
+ {{#if hasSkillsFetcher}}
11
+ from strands import AgentSkills
12
+ {{#if hasFetchedSkills}}
13
+ from skills.fetcher import resolve_s3_skills, resolve_git_skills
14
+ {{/if}}
15
+ {{#if (some gitSkills "credentialArn")}}
16
+ from bedrock_agentcore.services.identity import IdentityClient
17
+ {{/if}}
18
+ {{/if}}
19
+ import asyncio
20
+ {{#if hasShell}}
21
+ import subprocess
22
+ {{/if}}
23
+ {{#if hasFileOperations}}
24
+ import os
25
+ {{/if}}
26
+ {{#if hasExecutionLimits}}
27
+ from strands.tools.executors import SequentialToolExecutor
28
+ from strands.types.exceptions import EventLoopException
29
+ from hooks.execution_limits import ExecutionLimitExceeded, ExecutionLimitsHook
30
+ {{/if}}
31
+ {{#if hasConfigBundle}}
32
+ from strands.hooks import HookProvider, HookRegistry, BeforeInvocationEvent, BeforeToolCallEvent
33
+ {{/if}}
34
+ {{#if truncationStrategy}}
35
+ {{#if (eq truncationStrategy "sliding_window")}}
36
+ from strands.agent.conversation_manager.sliding_window_conversation_manager import SlidingWindowConversationManager
37
+ {{/if}}
38
+ {{#if (eq truncationStrategy "summarization")}}
39
+ from strands.agent.conversation_manager.summarizing_conversation_manager import SummarizingConversationManager
40
+ {{/if}}
41
+ {{else}}
42
+ from strands.agent.conversation_manager.null_conversation_manager import NullConversationManager
43
+ {{/if}}
44
+ {{#if hasConfigBundle}}
45
+ from bedrock_agentcore.runtime.context import BedrockAgentCoreContext
46
+ {{/if}}
47
+ {{#if hasBrowser}}
48
+ from strands_tools.browser import AgentCoreBrowser
49
+ {{/if}}
50
+ {{#if hasCodeInterpreter}}
51
+ from strands_tools.code_interpreter import AgentCoreCodeInterpreter
52
+ {{/if}}
53
+ from bedrock_agentcore.runtime import BedrockAgentCoreApp
54
+ from model.load import load_model
55
+ {{#if hasGateway}}
56
+ from mcp_client.client import get_all_gateway_mcp_clients
57
+ {{/if}}
58
+ {{#if remoteMcpTools}}
59
+ from mcp_client.client import get_all_remote_mcp_clients
60
+ {{/if}}
61
+ {{#unless (or hasGateway remoteMcpTools)}}
62
+ {{#unless isExportHarness}}
63
+ from mcp_client.client import get_streamable_http_mcp_client
64
+ {{/unless}}
65
+ {{/unless}}
66
+ {{#if hasMemory}}
67
+ from memory.session import get_memory_session_manager
68
+ {{/if}}
69
+ {{#unless hasFileOperations}}
70
+ {{#if (or needsOs browserIdentifierEnvVar codeInterpreterIdentifierEnvVar (some gitSkills "credentialArn"))}}
71
+ import os
72
+ {{/if}}
73
+ {{/unless}}
74
+ {{#if hasPayment}}
75
+ from capabilities.payments.payments import create_payments_plugin, PAYMENT_SYSTEM_PROMPT
76
+ {{/if}}
77
+
78
+ app = BedrockAgentCoreApp()
79
+ log = app.logger
80
+
81
+ {{#if (or hasGateway remoteMcpTools)}}
82
+ # Define MCP clients for all configured MCP servers (gateways and/or remote MCP)
83
+ mcp_clients = []
84
+ {{#if hasGateway}}
85
+ mcp_clients += get_all_gateway_mcp_clients()
86
+ {{/if}}
87
+ {{#if remoteMcpTools}}
88
+ mcp_clients += get_all_remote_mcp_clients()
89
+ {{/if}}
90
+ {{else}}
91
+ {{#unless isExportHarness}}
92
+ # Define a Streamable HTTP MCP Client
93
+ mcp_clients = [get_streamable_http_mcp_client()]
94
+ {{/unless}}
95
+ {{/if}}
96
+
97
+ {{#if systemPromptText}}
98
+ DEFAULT_SYSTEM_PROMPT = """{{escapePyStr systemPromptText}}"""
99
+ {{else}}
100
+ DEFAULT_SYSTEM_PROMPT = """
101
+ You are a helpful assistant. Use tools when appropriate.
102
+ {{#if needsOs}}{{#unless isExportHarness}}
103
+ You have access to the following mounted filesystems. Use file_read, file_write, and list_files with full absolute paths:
104
+ {{#if sessionStorageMountPath}}- {{sessionStorageMountPath}}: ephemeral session storage (lost when session ends)
105
+ {{/if}}{{#each efsMounts}}- {{mountPath}}: EFS persistent storage (persists across sessions and agent restarts)
106
+ {{/each}}{{#each s3Mounts}}- {{mountPath}}: S3 Files persistent storage (durable, backed by S3)
107
+ {{/each}}{{/unless}}{{/if}}
108
+ """
109
+ {{/if}}
110
+
111
+ {{#if hasConfigBundle}}
112
+ DEFAULT_TOOL_DESC = "Return the sum of two numbers"
113
+ {{/if}}
114
+
115
+ # Define a collection of tools used by the model
116
+ tools = []
117
+
118
+ {{#if inlineFunctionTools}}
119
+ # Inline function tools — stop the agent loop so the tool call streams back to the caller
120
+ def _make_inline_tool(name: str, spec: dict) -> PythonAgentTool:
121
+ def _handler(tool: ToolUse, **kwargs: Any) -> ToolResult:
122
+ kwargs.get("request_state", {})["stop_event_loop"] = True
123
+ return {"toolUseId": tool["toolUseId"], "status": "success", "content": [{"text": " "}]}
124
+ _handler.__name__ = name
125
+ return PythonAgentTool(tool_name=name, tool_spec=spec, tool_func=_handler)
126
+
127
+ {{#each inlineFunctionTools}}
128
+ _INLINE_SPEC_{{snakeCase name}} = {
129
+ "name": "{{name}}",
130
+ "description": {{safeJson description}},
131
+ "inputSchema": {"json": json.loads({{pyJsonStr inputSchema}}) },
132
+ }
133
+ tools.append(_make_inline_tool("{{name}}", _INLINE_SPEC_{{snakeCase name}}))
134
+ {{/each}}
135
+
136
+ _INLINE_FUNCTION_NAMES = { {{#each inlineFunctionTools}}"{{name}}"{{#unless @last}}, {{/unless}}{{/each}} }
137
+
138
+ {{else}}
139
+ _INLINE_FUNCTION_NAMES = set()
140
+
141
+ {{#unless isExportHarness}}
142
+ # Define a simple function tool
143
+ {{#if hasConfigBundle}}
144
+ @tool(description=DEFAULT_TOOL_DESC)
145
+ {{else}}
146
+ @tool
147
+ {{/if}}
148
+ def add_numbers(a: int, b: int) -> int:
149
+ """Return the sum of two numbers"""
150
+ return a+b
151
+ tools.append(add_numbers)
152
+
153
+ {{/unless}}
154
+ {{/if}}
155
+ {{#if hasBrowser}}
156
+ {{#if browserIdentifierEnvVar}}
157
+ _browser_id = os.getenv("{{browserIdentifierEnvVar}}")
158
+ tools.append(AgentCoreBrowser(**({"identifier": _browser_id} if _browser_id else {})).browser)
159
+ {{else}}
160
+ tools.append(AgentCoreBrowser().browser)
161
+ {{/if}}
162
+ {{/if}}
163
+ {{#if hasCodeInterpreter}}
164
+ {{#if codeInterpreterIdentifierEnvVar}}
165
+ _code_interpreter_id = os.getenv("{{codeInterpreterIdentifierEnvVar}}")
166
+ tools.append(AgentCoreCodeInterpreter(**({"identifier": _code_interpreter_id} if _code_interpreter_id else {})).code_interpreter)
167
+ {{else}}
168
+ tools.append(AgentCoreCodeInterpreter().code_interpreter)
169
+ {{/if}}
170
+ {{/if}}
171
+ {{#if hasShell}}
172
+ @tool
173
+ def shell(command: str, timeout: int = 300) -> dict:
174
+ """Execute a bash command and return the results.
175
+
176
+ Args:
177
+ command: The bash command to execute
178
+ timeout: Timeout in seconds (default: 300)
179
+
180
+ Returns:
181
+ Dict with stdout, stderr, and exit_code
182
+ """
183
+ result = subprocess.run(
184
+ command, shell=True, capture_output=True, text=True, timeout=timeout
185
+ )
186
+ return {"stdout": result.stdout, "stderr": result.stderr, "exit_code": result.returncode}
187
+
188
+ tools.append(shell)
189
+ {{/if}}
190
+ {{#if hasFileOperations}}
191
+ @tool
192
+ def file_operations(
193
+ command: str,
194
+ path: str,
195
+ old_str: str = None,
196
+ new_str: str = None,
197
+ file_text: str = None,
198
+ insert_line: int = None,
199
+ view_range: list = None,
200
+ ) -> str:
201
+ """Text editor tool for viewing and modifying files.
202
+
203
+ Args:
204
+ command: The command to execute ("view", "str_replace", "create", "insert")
205
+ path: Path to the file or directory
206
+ old_str: Text to replace (for str_replace command)
207
+ new_str: Replacement text (for str_replace and insert commands)
208
+ file_text: Content for new file (for create command)
209
+ insert_line: Line number to insert after (for insert command)
210
+ view_range: [start_line, end_line] for viewing specific lines (for view command)
211
+
212
+ Returns:
213
+ Result of the operation
214
+ """
215
+ try:
216
+ if command == "view":
217
+ if not os.path.exists(path):
218
+ return f"Error: Path '{path}' does not exist"
219
+ if os.path.isdir(path):
220
+ return "\n".join(os.listdir(path))
221
+ with open(path) as f:
222
+ lines = f.read().splitlines()
223
+ if view_range:
224
+ start, end = view_range
225
+ start_idx = max(0, start - 1)
226
+ end_idx = len(lines) if end == -1 else min(len(lines), end)
227
+ lines = lines[start_idx:end_idx]
228
+ start_num = start_idx + 1
229
+ else:
230
+ start_num = 1
231
+ return "\n".join(f"{start_num + i}: {line}" for i, line in enumerate(lines))
232
+ elif command == "str_replace":
233
+ if old_str is None or new_str is None:
234
+ return "Error: str_replace requires both old_str and new_str parameters"
235
+ if not os.path.exists(path):
236
+ return f"Error: File '{path}' does not exist"
237
+ content = open(path).read()
238
+ if old_str not in content:
239
+ return "Error: Text not found in file"
240
+ count = content.count(old_str)
241
+ if count > 1:
242
+ return f"Error: Text appears {count} times in file. Please be more specific."
243
+ open(path, "w").write(content.replace(old_str, new_str, 1))
244
+ return f"Successfully replaced text in '{path}'"
245
+ elif command == "create":
246
+ if file_text is None:
247
+ return "Error: create requires file_text parameter"
248
+ os.makedirs(os.path.dirname(os.path.abspath(path)), exist_ok=True)
249
+ open(path, "w").write(file_text)
250
+ return f"Successfully created file '{path}'"
251
+ elif command == "insert":
252
+ if new_str is None or insert_line is None:
253
+ return "Error: insert requires both new_str and insert_line parameters"
254
+ if not os.path.exists(path):
255
+ return f"Error: File '{path}' does not exist"
256
+ lines = open(path).read().splitlines(True)
257
+ if insert_line == 0:
258
+ lines.insert(0, new_str + "\n")
259
+ elif insert_line >= len(lines):
260
+ lines.append(new_str + "\n")
261
+ else:
262
+ lines.insert(insert_line, new_str + "\n")
263
+ open(path, "w").write("".join(lines))
264
+ return f"Successfully inserted text in '{path}' at line {insert_line + 1}"
265
+ else:
266
+ return f"Error: Unknown command '{command}'"
267
+ except Exception as e:
268
+ return f"Error: {e}"
269
+
270
+ tools.append(file_operations)
271
+ {{/if}}
272
+ {{#if needsOs}}{{#unless isExportHarness}}
273
+ _MOUNT_PATHS = [
274
+ {{#if sessionStorageMountPath}}"{{sessionStorageMountPath}}",{{/if}}
275
+ {{#each efsMounts}}"{{mountPath}}",{{/each}}
276
+ {{#each s3Mounts}}"{{mountPath}}",{{/each}}
277
+ ]
278
+
279
+ def _safe_resolve(path: str) -> str:
280
+ resolved = os.path.realpath(path)
281
+ if not any(resolved == os.path.realpath(m) or resolved.startswith(os.path.realpath(m) + os.sep) for m in _MOUNT_PATHS):
282
+ raise ValueError(f"Path '{path}' is not within any configured mount ({', '.join(_MOUNT_PATHS)})")
283
+ return resolved
284
+
285
+ @tool
286
+ def file_read(path: str) -> str:
287
+ """Read a file from a mounted filesystem. Use the absolute path (e.g. /mnt/tools/data.txt)."""
288
+ try:
289
+ full_path = _safe_resolve(path)
290
+ with open(full_path) as f:
291
+ return f.read()
292
+ except ValueError as e:
293
+ return str(e)
294
+ except OSError as e:
295
+ return f"Error reading '{path}': {e.strerror}"
296
+
297
+ @tool
298
+ def file_write(path: str, content: str) -> str:
299
+ """Write a file to a mounted filesystem. Use the absolute path (e.g. /mnt/tools/data.txt)."""
300
+ try:
301
+ full_path = _safe_resolve(path)
302
+ parent = os.path.dirname(full_path)
303
+ if parent:
304
+ os.makedirs(parent, exist_ok=True)
305
+ with open(full_path, "w") as f:
306
+ f.write(content)
307
+ return f"Written to {path}"
308
+ except ValueError as e:
309
+ return str(e)
310
+ except OSError as e:
311
+ return f"Error writing '{path}': {e.strerror}"
312
+
313
+ @tool
314
+ def list_files(path: str) -> str:
315
+ """List files in a mounted filesystem directory. Use the absolute path (e.g. /mnt/tools)."""
316
+ try:
317
+ full_path = _safe_resolve(path)
318
+ entries = os.listdir(full_path)
319
+ return "\n".join(entries) if entries else "(empty directory)"
320
+ except ValueError as e:
321
+ return str(e)
322
+ except OSError as e:
323
+ return f"Error listing '{path}': {e.strerror}"
324
+
325
+ tools.extend([file_read, file_write, list_files])
326
+ {{/unless}}{{/if}}
327
+
328
+ {{#if (or hasGateway remoteMcpTools)}}
329
+ # Add MCP clients to tools
330
+ for mcp_client in mcp_clients:
331
+ if mcp_client:
332
+ tools.append(mcp_client)
333
+ {{else}}
334
+ {{#unless isExportHarness}}
335
+ # Add MCP client to tools if available
336
+ for mcp_client in mcp_clients:
337
+ if mcp_client:
338
+ tools.append(mcp_client)
339
+ {{/unless}}
340
+ {{/if}}
341
+
342
+ {{#if hasConfigBundle}}
343
+
344
+ class ConfigBundleHook(HookProvider):
345
+ """Injects config bundle values (system prompt, tool descriptions) before each invocation.
346
+
347
+ BedrockAgentCoreContext.get_config_bundle() fetches the component configuration
348
+ for the current runtime ARN from the config bundle service. The SDK caches the
349
+ result and refreshes on bundle version changes.
350
+ """
351
+
352
+ def register_hooks(self, registry: HookRegistry, **kwargs: Any) -> None:
353
+ registry.add_callback(BeforeInvocationEvent, self._inject_system_prompt)
354
+ registry.add_callback(BeforeToolCallEvent, self._override_tool_desc)
355
+
356
+ def _inject_system_prompt(self, event: BeforeInvocationEvent) -> None:
357
+ config = BedrockAgentCoreContext.get_config_bundle()
358
+ prompt = config.get("systemPrompt", DEFAULT_SYSTEM_PROMPT)
359
+
360
+ if prompt != event.agent.system_prompt:
361
+ event.agent.system_prompt = prompt
362
+
363
+ def _override_tool_desc(self, event: BeforeToolCallEvent) -> None:
364
+ config = BedrockAgentCoreContext.get_config_bundle()
365
+ tool_descs = config.get("toolDescriptions", {})
366
+
367
+ tool_name = event.tool_use["name"]
368
+ override = tool_descs.get(tool_name)
369
+ if override and event.selected_tool:
370
+ spec = event.selected_tool.tool_spec
371
+ if spec and "description" in spec:
372
+ spec["description"] = override
373
+
374
+ {{/if}}
375
+
376
+ def _make_conversation_manager():
377
+ {{#if truncationStrategy}}
378
+ {{#if (eq truncationStrategy "sliding_window")}}
379
+ {{#if truncationConfig}}
380
+ return SlidingWindowConversationManager(**{{safeJson truncationConfig}}, per_turn=True)
381
+ {{else}}
382
+ return SlidingWindowConversationManager(per_turn=True)
383
+ {{/if}}
384
+ {{else}}
385
+ {{#if truncationConfig}}
386
+ return SummarizingConversationManager(**{{safeJson truncationConfig}})
387
+ {{else}}
388
+ return SummarizingConversationManager()
389
+ {{/if}}
390
+ {{/if}}
391
+ {{else}}
392
+ return NullConversationManager()
393
+ {{/if}}
394
+
395
+ {{#if hasMemory}}
396
+ {{#unless hasPayment}}
397
+ def agent_factory():
398
+ cache = {}
399
+ def get_or_create_agent(session_id, user_id{{#if hasSkillsFetcher}}, skill_plugins=None{{/if}}):
400
+ {{#if actorId}}
401
+ _actor_id = "{{actorId}}"
402
+ {{else}}
403
+ _actor_id = user_id
404
+ {{/if}}
405
+ key = f"{session_id}/{_actor_id}"
406
+ if key not in cache:
407
+ cache[key] = Agent(
408
+ model=load_model(),
409
+ session_manager=get_memory_session_manager(session_id, _actor_id),
410
+ conversation_manager=_make_conversation_manager(),
411
+ system_prompt=DEFAULT_SYSTEM_PROMPT,
412
+ tools=tools,
413
+ {{#if hasSkillsFetcher}}
414
+ plugins=skill_plugins or None,
415
+ {{/if}}
416
+ {{#if hasExecutionLimits}}
417
+ tool_executor=SequentialToolExecutor(),
418
+ callback_handler=None,
419
+ {{/if}}
420
+ hooks=[
421
+ {{#if hasExecutionLimits}}
422
+ ExecutionLimitsHook(
423
+ {{#if maxIterations}}max_iterations={{maxIterations}},{{/if}}
424
+ {{#if maxTokens}}max_tokens={{maxTokens}},{{/if}}
425
+ {{#if timeoutSeconds}}timeout_seconds={{timeoutSeconds}},{{/if}}
426
+ ),
427
+ {{/if}}
428
+ {{#if hasConfigBundle}}
429
+ ConfigBundleHook(),
430
+ {{/if}}
431
+ ],
432
+ )
433
+ return cache[key]
434
+ return get_or_create_agent
435
+ get_or_create_agent = agent_factory()
436
+ {{/unless}}
437
+ {{else}}
438
+ {{#unless hasPayment}}
439
+ # Reuses one Agent per session_id so each session keeps its own in-process
440
+ # conversation history (best-effort; resets on cold start). The cache is bounded
441
+ # to 128 sessions with LRU eviction (least-recently-used is dropped and its
442
+ # history reset) so a single process serving many sessions cannot leak history
443
+ # between them or grow without limit. For durable history, attach a session manager.
444
+ def agent_factory():
445
+ cache = OrderedDict()
446
+ def get_or_create_agent(session_id{{#if hasSkillsFetcher}}, skill_plugins=None{{/if}}):
447
+ if session_id in cache:
448
+ cache.move_to_end(session_id)
449
+ return cache[session_id]
450
+ if len(cache) >= 128:
451
+ cache.popitem(last=False)
452
+ cache[session_id] = Agent(
453
+ model=load_model(),
454
+ system_prompt=DEFAULT_SYSTEM_PROMPT,
455
+ tools=tools,
456
+ conversation_manager=_make_conversation_manager(),
457
+ {{#if hasSkillsFetcher}}
458
+ plugins=skill_plugins or None,
459
+ {{/if}}
460
+ {{#if hasExecutionLimits}}
461
+ tool_executor=SequentialToolExecutor(),
462
+ callback_handler=None,
463
+ {{/if}}
464
+ hooks=[
465
+ {{#if hasExecutionLimits}}
466
+ ExecutionLimitsHook(
467
+ {{#if maxIterations}}max_iterations={{maxIterations}},{{/if}}
468
+ {{#if maxTokens}}max_tokens={{maxTokens}},{{/if}}
469
+ {{#if timeoutSeconds}}timeout_seconds={{timeoutSeconds}},{{/if}}
470
+ ),
471
+ {{/if}}
472
+ {{#if hasConfigBundle}}
473
+ ConfigBundleHook(),
474
+ {{/if}}
475
+ ],
476
+ )
477
+ return cache[session_id]
478
+ return get_or_create_agent
479
+ get_or_create_agent = agent_factory()
480
+ {{/unless}}
481
+ {{/if}}
482
+
483
+
484
+ def strip_trailing_tool_use(messages: Any) -> list[dict]:
485
+ """Strip toolUse blocks from the tail until the last message has none."""
486
+ if not isinstance(messages, list):
487
+ raise ValueError("messages must be a list")
488
+
489
+ messages = list(messages)
490
+ while messages:
491
+ last = messages[-1]
492
+ if not isinstance(last, dict):
493
+ raise ValueError("each message must be an object")
494
+ original_content = last.get("content", [])
495
+ if not isinstance(original_content, list) or not all(isinstance(block, dict) for block in original_content):
496
+ raise ValueError("each message content value must be a list of content blocks")
497
+
498
+ content = [block for block in original_content if "toolUse" not in block]
499
+ if len(content) == len(original_content):
500
+ break
501
+ if content:
502
+ messages[-1] = {**last, "content": content}
503
+ break
504
+ messages.pop()
505
+
506
+ return messages
507
+
508
+
509
+ def _extract_prompt(payload: dict):
510
+ """Accept validated harness messages, tool results, or a plain prompt string."""
511
+ if not isinstance(payload, dict):
512
+ raise ValueError("payload must be a JSON object")
513
+ if "messages" in payload:
514
+ return strip_trailing_tool_use(payload["messages"])
515
+ if "tool_results" in payload:
516
+ tool_results = payload["tool_results"]
517
+ if not isinstance(tool_results, list) or not all(
518
+ isinstance(tool_result, dict) and isinstance(tool_result.get("toolUseId"), str)
519
+ for tool_result in tool_results
520
+ ):
521
+ raise ValueError("tool_results must contain objects with a toolUseId string")
522
+ return [{"role": "user", "content": [{"toolResult": {
523
+ "toolUseId": tr["toolUseId"],
524
+ "status": tr.get("status", "success"),
525
+ "content": tr.get("content", []),
526
+ }} for tr in tool_results]}]
527
+ prompt = payload.get("prompt", "")
528
+ if not isinstance(prompt, str):
529
+ raise ValueError("prompt must be a string")
530
+ return prompt
531
+
532
+
533
+ def _has_inline_function_call(messages) -> bool:
534
+ """Return True if messages contains an assistant toolUse for an inline function tool."""
535
+ if not _INLINE_FUNCTION_NAMES or not isinstance(messages, list):
536
+ return False
537
+ for msg in messages:
538
+ if msg.get("role") == "assistant":
539
+ for block in msg.get("content", []):
540
+ if isinstance(block, dict) and block.get("toolUse", {}).get("name") in _INLINE_FUNCTION_NAMES:
541
+ return True
542
+ return False
543
+
544
+
545
+ def _is_inline_function_call(event: dict) -> bool:
546
+ """Check if a contentBlockStart event is for an inline function tool."""
547
+ if not _INLINE_FUNCTION_NAMES:
548
+ return False
549
+ cbs = event.get("contentBlockStart", {})
550
+ start = cbs.get("start", {})
551
+ tool_use = start.get("toolUse") if isinstance(start, dict) else None
552
+ return tool_use is not None and tool_use.get("name") in _INLINE_FUNCTION_NAMES
553
+
554
+
555
+
556
+ @app.entrypoint
557
+ async def invoke(payload, context):
558
+ log.info("Invoking Agent.....")
559
+
560
+ {{#if hasPayment}}
561
+ user_id = payload.get("user_id") or getattr(context, "user_id", "default-user")
562
+ instrument_id = payload.get("payment_instrument_id")
563
+ session_id = payload.get("payment_session_id")
564
+ payments_plugin = create_payments_plugin(user_id, instrument_id, session_id)
565
+ plugins = [payments_plugin] if payments_plugin else []
566
+ {{/if}}
567
+ {{#if hasSkillsFetcher}}
568
+ skill_paths = [{{#each pathSkills}}{{safeJson this}}{{#unless @last}}, {{/unless}}{{/each}}]
569
+ {{#if s3Skills}}
570
+ s3_skill_sources = [{{#each s3Skills}}{{safeJson this}}{{#unless @last}}, {{/unless}}{{/each}}]
571
+ skill_paths.extend(await asyncio.to_thread(resolve_s3_skills, s3_skill_sources, None))
572
+ {{/if}}
573
+ {{#if gitSkills}}
574
+ git_skill_sources = [
575
+ {{#each gitSkills}}
576
+ dict(url={{safeJson this.url}}{{#if this.path}}, path={{safeJson this.path}}{{/if}}{{#if this.credentialArn}}, credentialArn={{safeJson this.credentialArn}}{{#if this.username}}, username={{safeJson this.username}}{{/if}}{{/if}}),
577
+ {{/each}}
578
+ ]
579
+ {{#if (some gitSkills "credentialArn")}}
580
+ _git_identity_client = IdentityClient(os.environ.get("AWS_REGION", os.environ.get("AWS_DEFAULT_REGION", "us-east-1")))
581
+ {{else}}
582
+ _git_identity_client = None
583
+ {{/if}}
584
+ skill_paths.extend(await asyncio.to_thread(resolve_git_skills, git_skill_sources, _git_identity_client))
585
+ {{/if}}
586
+ _skill_plugins = [AgentSkills(skills=skill_paths)] if skill_paths else []
587
+ {{/if}}
588
+
589
+ {{#if hasMemory}}
590
+ {{#if hasPayment}}
591
+ mem_session_id = getattr(context, 'session_id', 'default-session')
592
+ {{#if actorId}}
593
+ mem_user_id = "{{actorId}}"
594
+ {{else}}
595
+ mem_user_id = getattr(context, 'user_id', 'default-user')
596
+ {{/if}}
597
+ agent = Agent(
598
+ model=load_model(),
599
+ session_manager=get_memory_session_manager(mem_session_id, mem_user_id),
600
+ system_prompt=DEFAULT_SYSTEM_PROMPT + PAYMENT_SYSTEM_PROMPT,
601
+ tools=tools,
602
+ plugins=plugins{{#if hasSkillsFetcher}} + _skill_plugins{{/if}},{{#if hasConfigBundle}}
603
+ hooks=[ConfigBundleHook()],{{/if}}
604
+ )
605
+ {{else}}
606
+ session_id = getattr(context, 'session_id', 'default-session')
607
+ {{#if actorId}}
608
+ user_id = "{{actorId}}"
609
+ {{else}}
610
+ user_id = getattr(context, 'user_id', 'default-user')
611
+ {{/if}}
612
+ agent = get_or_create_agent(session_id, user_id{{#if hasSkillsFetcher}}, _skill_plugins{{/if}})
613
+ {{/if}}
614
+ {{else}}
615
+ {{#if hasPayment}}
616
+ agent = Agent(
617
+ model=load_model(),
618
+ system_prompt=DEFAULT_SYSTEM_PROMPT + PAYMENT_SYSTEM_PROMPT,
619
+ tools=tools,
620
+ plugins=plugins{{#if hasSkillsFetcher}} + _skill_plugins{{/if}},{{#if hasConfigBundle}}
621
+ hooks=[ConfigBundleHook()],{{/if}}
622
+ )
623
+ {{else}}
624
+ session_id = getattr(context, 'session_id', 'default-session')
625
+ agent = get_or_create_agent(session_id{{#if hasSkillsFetcher}}, _skill_plugins{{/if}})
626
+ {{/if}}
627
+ {{/if}}
628
+
629
+ prompt = _extract_prompt(payload)
630
+
631
+ {{#if inlineFunctionTools}}
632
+ # If Turn 2 carries the harness-style assistant(toolUse)+user(toolResult) pair,
633
+ # strip the placeholder turn Strands stored during Turn 1 so the real toolResult
634
+ # is injected cleanly — same protocol as the harness runtime.
635
+ if _has_inline_function_call(prompt):
636
+ msgs = agent.messages
637
+ if len(msgs) >= 2 and any("toolResult" in b for b in msgs[-1].get("content", [])):
638
+ del msgs[-2:]
639
+ {{/if}}
640
+
641
+ {{#if hasExecutionLimits}}
642
+ timeout_seconds = {{#if timeoutSeconds}}{{timeoutSeconds}}{{else}}None{{/if}}
643
+ timeout_fired = False
644
+ watchdog_task = None
645
+ if timeout_seconds is not None:
646
+ async def _timeout_watchdog():
647
+ nonlocal timeout_fired
648
+ await asyncio.sleep(timeout_seconds)
649
+ timeout_fired = True
650
+ agent.cancel()
651
+ watchdog_task = asyncio.create_task(_timeout_watchdog())
652
+
653
+ try:
654
+ {{#if inlineFunctionTools}}
655
+ hit_inline_function = False
656
+ {{/if}}
657
+ async for event in agent.stream_async(
658
+ prompt,
659
+ ):
660
+ if not isinstance(event, dict) or "event" not in event:
661
+ continue
662
+ cbs = event["event"].get("contentBlockStart")
663
+ if cbs is not None and not cbs.get("start"):
664
+ continue
665
+ {{#if inlineFunctionTools}}
666
+ if not hit_inline_function:
667
+ hit_inline_function = _is_inline_function_call(event["event"])
668
+ {{/if}}
669
+ yield event
670
+ {{#if inlineFunctionTools}}
671
+ if hit_inline_function and "messageStop" in event["event"]:
672
+ return
673
+ {{/if}}
674
+
675
+ if timeout_fired:
676
+ yield {"event": {"messageStop": {"stopReason": "timeout_exceeded"}}}
677
+ except EventLoopException as e:
678
+ if isinstance(e.original_exception, ExecutionLimitExceeded):
679
+ yield {"event": {"messageStop": {"stopReason": str(e.original_exception)}}}
680
+ return
681
+ raise
682
+ finally:
683
+ if watchdog_task is not None:
684
+ watchdog_task.cancel()
685
+ try:
686
+ await watchdog_task
687
+ except asyncio.CancelledError:
688
+ pass
689
+ {{else}}
690
+ {{#if inlineFunctionTools}}
691
+ hit_inline_function = False
692
+ {{/if}}
693
+ async for event in agent.stream_async(
694
+ prompt,
695
+ ):
696
+ if not isinstance(event, dict) or "event" not in event:
697
+ continue
698
+ cbs = event["event"].get("contentBlockStart")
699
+ if cbs is not None and not cbs.get("start"):
700
+ continue
701
+ {{#if inlineFunctionTools}}
702
+ if not hit_inline_function:
703
+ hit_inline_function = _is_inline_function_call(event["event"])
704
+ {{/if}}
705
+ yield event
706
+ {{#if inlineFunctionTools}}
707
+ if hit_inline_function and "messageStop" in event["event"]:
708
+ return
709
+ {{/if}}
710
+ {{/if}}
711
+
712
+
713
+ if __name__ == "__main__":
714
+ app.run()