synth-agent-sdk 2.2.0__tar.gz → 2.2.2__tar.gz

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 (434) hide show
  1. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/.gitignore +7 -0
  2. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/PKG-INFO +12 -2
  3. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/README.md +1 -1
  4. synth_agent_sdk-2.2.2/agent/agentcore.yaml +29 -0
  5. synth_agent_sdk-2.2.2/agent/handler.py +6 -0
  6. synth_agent_sdk-2.2.2/agent_eval/eval_config.json +21 -0
  7. synth_agent_sdk-2.2.2/agent_eval/eval_dataset.json +10 -0
  8. synth_agent_sdk-2.2.2/community-feedback-analysis.md +229 -0
  9. synth_agent_sdk-2.2.2/dummy.json +1 -0
  10. synth_agent_sdk-2.2.2/my_agent_eval/eval_config.json +21 -0
  11. synth_agent_sdk-2.2.2/my_agent_eval/eval_dataset.json +10 -0
  12. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/pyproject.toml +27 -1
  13. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/agent.py +123 -0
  14. synth_agent_sdk-2.2.2/synth/cli/_ui_assets/builder_api.py +3407 -0
  15. synth_agent_sdk-2.2.2/synth/cli/_ui_assets/builder_flow_config.py +516 -0
  16. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/server.py +378 -1
  17. synth_agent_sdk-2.2.2/synth/cli/_ui_assets/static/builder-api.js +365 -0
  18. synth_agent_sdk-2.2.2/synth/cli/_ui_assets/static/builder.css +2714 -0
  19. synth_agent_sdk-2.2.2/synth/cli/_ui_assets/static/builder.html +499 -0
  20. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/static/index.html +2 -0
  21. synth_agent_sdk-2.2.2/synth/cli/_ui_assets/static/landing.html +552 -0
  22. synth_agent_sdk-2.2.2/synth/cli/_ui_assets/static/wizard-state.js +560 -0
  23. synth_agent_sdk-2.2.2/synth/cli/_ui_assets/static/wizard-steps.js +8502 -0
  24. synth_agent_sdk-2.2.2/synth/cli/_ui_assets/static/wizard.html +621 -0
  25. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/banner.py +2 -1
  26. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/loader.py +5 -5
  27. synth_agent_sdk-2.2.0/.github/CODEOWNERS +0 -34
  28. synth_agent_sdk-2.2.0/.github/workflows/observability-doc-idempotence.yml +0 -52
  29. synth_agent_sdk-2.2.0/.github/workflows/pricing-feed-validation.yml +0 -102
  30. synth_agent_sdk-2.2.0/.github/workflows/pricing-freshness.yml +0 -129
  31. synth_agent_sdk-2.2.0/.github/workflows/spec-metadata-lint.yml +0 -137
  32. synth_agent_sdk-2.2.0/synth/cli/_ui_assets/conversation_agents.json +0 -324
  33. synth_agent_sdk-2.2.0/synth/cli/_ui_assets/conversations.json +0 -62
  34. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/.dockerignore +0 -0
  35. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/install.ps1 +0 -0
  36. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/install.sh +0 -0
  37. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/requirements.txt +0 -0
  38. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/CHANGELOG.md +0 -0
  39. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/README.md +0 -0
  40. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/__init__.py +0 -0
  41. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/__main__.py +0 -0
  42. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/_compat.py +0 -0
  43. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/__init__.py +0 -0
  44. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/backends/__init__.py +0 -0
  45. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/backends/cloudwatch.py +0 -0
  46. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/backends/dynamo.py +0 -0
  47. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/backends/local.py +0 -0
  48. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/backends/s3.py +0 -0
  49. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/chain.py +0 -0
  50. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/log.py +0 -0
  51. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/types.py +0 -0
  52. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cache/__init__.py +0 -0
  53. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cache/base.py +0 -0
  54. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cache/dynamo.py +0 -0
  55. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cache/local.py +0 -0
  56. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cache/middleware.py +0 -0
  57. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cache/redis.py +0 -0
  58. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cache/types.py +0 -0
  59. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/checkpointing/__init__.py +0 -0
  60. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/checkpointing/base.py +0 -0
  61. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/checkpointing/dynamo.py +0 -0
  62. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/checkpointing/encryption.py +0 -0
  63. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/checkpointing/local.py +0 -0
  64. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/checkpointing/redis.py +0 -0
  65. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/__init__.py +0 -0
  66. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_agent_ops.py +0 -0
  67. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_colors.py +0 -0
  68. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_doc_gen/__init__.py +0 -0
  69. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_doc_gen/observability_html.py +0 -0
  70. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_error_formatter.py +0 -0
  71. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_init_back_nav.py +0 -0
  72. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_init_catalog.py +0 -0
  73. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_init_enterprise.py +0 -0
  74. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_init_generators.py +0 -0
  75. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_init_helpers.py +0 -0
  76. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_platform_assets/app.js +0 -0
  77. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_platform_assets/easter_eggs.js +0 -0
  78. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_platform_assets/index.html +0 -0
  79. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_platform_assets/style.css +0 -0
  80. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_render.py +0 -0
  81. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_tui.py +0 -0
  82. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/README.md +0 -0
  83. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/__init__.py +0 -0
  84. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/agentcore_history.py +0 -0
  85. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/app.js +0 -0
  86. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/easter_eggs.js +0 -0
  87. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/index.html +0 -0
  88. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/provenance.py +0 -0
  89. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/registry_ui.py +0 -0
  90. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/static/app.js +0 -0
  91. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/static/easter_eggs.js +0 -0
  92. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/static/login.html +0 -0
  93. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/static/style.css +0 -0
  94. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/style.css +0 -0
  95. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_templates.py +0 -0
  96. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/agents_cmd.py +0 -0
  97. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/aws_auth.py +0 -0
  98. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/bench_cmd.py +0 -0
  99. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/cloud_cmd.py +0 -0
  100. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/create_cmd.py +0 -0
  101. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/deploy_cmd.py +0 -0
  102. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/destroy_cmd.py +0 -0
  103. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/dev.py +0 -0
  104. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/dev_ui_contract.py +0 -0
  105. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/discover.py +0 -0
  106. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/doctor.py +0 -0
  107. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/edit_cmd.py +0 -0
  108. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/eval_cmd.py +0 -0
  109. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/help_cmd.py +0 -0
  110. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/init_cmd.py +0 -0
  111. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/inspect_cmd.py +0 -0
  112. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/main.py +0 -0
  113. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/mcp_cmd.py +0 -0
  114. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/migrate_cmd.py +0 -0
  115. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/package_info.py +0 -0
  116. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/platform_cmd.py +0 -0
  117. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/pricing.py +0 -0
  118. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/registry.py +0 -0
  119. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/registry_prompt.py +0 -0
  120. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/route_cmd.py +0 -0
  121. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/run_cmd.py +0 -0
  122. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/shell.py +0 -0
  123. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/tools_cmd.py +0 -0
  124. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/trace_cmd.py +0 -0
  125. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/welcome.py +0 -0
  126. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/__init__.py +0 -0
  127. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/auth.py +0 -0
  128. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/cache.py +0 -0
  129. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/client.py +0 -0
  130. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/config.py +0 -0
  131. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/errors.py +0 -0
  132. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/manifest.py +0 -0
  133. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/packaging.py +0 -0
  134. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/types.py +0 -0
  135. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/config.py +0 -0
  136. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/__init__.py +0 -0
  137. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/__init__.py +0 -0
  138. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/adapter.py +0 -0
  139. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/auth.py +0 -0
  140. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/browser.py +0 -0
  141. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/code_interpreter.py +0 -0
  142. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/credentials.py +0 -0
  143. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/evaluations.py +0 -0
  144. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/gateway.py +0 -0
  145. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/handler.py +0 -0
  146. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/manifest.py +0 -0
  147. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/memory.py +0 -0
  148. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/model_catalog.py +0 -0
  149. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/observability.py +0 -0
  150. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/schema_translator.py +0 -0
  151. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/ssm.py +0 -0
  152. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/team_handler.py +0 -0
  153. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/tool_registry.py +0 -0
  154. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/types.py +0 -0
  155. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/packager.py +0 -0
  156. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/__init__.py +0 -0
  157. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/base.py +0 -0
  158. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/cost_estimator.py +0 -0
  159. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/dry_run.py +0 -0
  160. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/phase_container_build.py +0 -0
  161. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/phase_endpoint_wiring.py +0 -0
  162. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/phase_post_deploy.py +0 -0
  163. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/phase_preflight.py +0 -0
  164. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/phase_registry_publish.py +0 -0
  165. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/phase_runtime_provisioning.py +0 -0
  166. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/phase_state_infra.py +0 -0
  167. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/progress.py +0 -0
  168. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/runner.py +0 -0
  169. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/durable/__init__.py +0 -0
  170. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/durable/base.py +0 -0
  171. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/durable/dynamo.py +0 -0
  172. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/durable/local.py +0 -0
  173. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/durable/redis.py +0 -0
  174. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/durable/runner.py +0 -0
  175. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/durable/types.py +0 -0
  176. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/durable/wrappers.py +0 -0
  177. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/errors.py +0 -0
  178. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/__init__.py +0 -0
  179. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/eval.py +0 -0
  180. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/report.py +0 -0
  181. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/scorers.py +0 -0
  182. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/suites/__init__.py +0 -0
  183. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/suites/base.py +0 -0
  184. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/suites/grounding.py +0 -0
  185. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/suites/guard_compliance.py +0 -0
  186. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/suites/hallucination.py +0 -0
  187. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/suites/multi_step.py +0 -0
  188. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/suites/tool_selection.py +0 -0
  189. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/trace_to_eval.py +0 -0
  190. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/__init__.py +0 -0
  191. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/base.py +0 -0
  192. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/budget.py +0 -0
  193. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/deploy.py +0 -0
  194. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/executor.py +0 -0
  195. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/routing.py +0 -0
  196. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/runtime.py +0 -0
  197. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/scrub.py +0 -0
  198. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/state.py +0 -0
  199. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/guards/__init__.py +0 -0
  200. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/guards/base.py +0 -0
  201. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/guards/composed.py +0 -0
  202. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/guards/cost.py +0 -0
  203. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/guards/custom.py +0 -0
  204. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/guards/pii.py +0 -0
  205. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/guards/rate_limit.py +0 -0
  206. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/guards/tool_filter.py +0 -0
  207. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/hooks/__init__.py +0 -0
  208. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/hooks/base.py +0 -0
  209. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/hooks/types.py +0 -0
  210. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/infra/__init__.py +0 -0
  211. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/infra/app_template.py +0 -0
  212. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/infra/constructs.py +0 -0
  213. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/infra/enterprise_constructs.py +0 -0
  214. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/infra/enterprise_stack.py +0 -0
  215. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/infra/stack.py +0 -0
  216. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/__init__.py +0 -0
  217. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/base.py +0 -0
  218. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/bedrock_kb.py +0 -0
  219. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/expanders.py +0 -0
  220. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/ingestion.py +0 -0
  221. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/knowledge.py +0 -0
  222. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/pipeline.py +0 -0
  223. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/query_expander.py +0 -0
  224. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/reranker.py +0 -0
  225. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/rerankers.py +0 -0
  226. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/s3.py +0 -0
  227. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/types.py +0 -0
  228. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/vector.py +0 -0
  229. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/loops/__init__.py +0 -0
  230. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/loops/ralph.py +0 -0
  231. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/__init__.py +0 -0
  232. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/base.py +0 -0
  233. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/bedrock_vector_store.py +0 -0
  234. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/conversation.py +0 -0
  235. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/dynamo.py +0 -0
  236. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/local_vector_store.py +0 -0
  237. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/persistent.py +0 -0
  238. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/semantic.py +0 -0
  239. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/thread.py +0 -0
  240. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/vector_store.py +0 -0
  241. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/observability/__init__.py +0 -0
  242. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/observability/cloudwatch.py +0 -0
  243. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/observability/cloudwatch_sink.py +0 -0
  244. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/observability/metrics.py +0 -0
  245. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/observability/trace_endpoint_sink.py +0 -0
  246. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/observability/xray_sink.py +0 -0
  247. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/__init__.py +0 -0
  248. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/_session_ids.py +0 -0
  249. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/dispatcher.py +0 -0
  250. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/event_bus.py +0 -0
  251. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/__init__.py +0 -0
  252. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/a2a_bus.py +0 -0
  253. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/base.py +0 -0
  254. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/blackboard.py +0 -0
  255. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/consensus.py +0 -0
  256. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/critic_review.py +0 -0
  257. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/debate.py +0 -0
  258. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/direct.py +0 -0
  259. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/graph_exec.py +0 -0
  260. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/parallel.py +0 -0
  261. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/peer_questions.py +0 -0
  262. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/pipeline_exec.py +0 -0
  263. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/registry.py +0 -0
  264. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/single_delegate.py +0 -0
  265. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/termination.py +0 -0
  266. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/export.py +0 -0
  267. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/feature_flags.py +0 -0
  268. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/governance/__init__.py +0 -0
  269. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/governance/budget.py +0 -0
  270. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/governance/downgrade.py +0 -0
  271. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/governance/policy.py +0 -0
  272. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/governance/predicate.py +0 -0
  273. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/governance/toml_loader.py +0 -0
  274. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/graph.py +0 -0
  275. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/human_in_loop.py +0 -0
  276. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/interrupt.py +0 -0
  277. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/ledgers.py +0 -0
  278. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/memory.py +0 -0
  279. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/message_bus.py +0 -0
  280. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/pipeline.py +0 -0
  281. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/plan.py +0 -0
  282. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/record_payload.py +0 -0
  283. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/record_publisher.py +0 -0
  284. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/registry_audit.py +0 -0
  285. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/registry_resolver.py +0 -0
  286. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/__init__.py +0 -0
  287. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/base.py +0 -0
  288. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/decision.py +0 -0
  289. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/heuristic_router.py +0 -0
  290. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/hybrid_router.py +0 -0
  291. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/llm_router.py +0 -0
  292. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/prompts.py +0 -0
  293. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/replay.py +0 -0
  294. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/request.py +0 -0
  295. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/rule_router.py +0 -0
  296. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/team_descriptor.py +0 -0
  297. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/transparency.py +0 -0
  298. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/__init__.py +0 -0
  299. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/adapters/__init__.py +0 -0
  300. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/adapters/dynamodb.py +0 -0
  301. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/adapters/inmem.py +0 -0
  302. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/adapters/memory.py +0 -0
  303. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/adapters/s3.py +0 -0
  304. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/agentcore.py +0 -0
  305. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/base.py +0 -0
  306. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/local.py +0 -0
  307. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/schemas.py +0 -0
  308. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/termination_adapter.py +0 -0
  309. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/team.py +0 -0
  310. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/team_registry.py +0 -0
  311. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/time_travel.py +0 -0
  312. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/topology.py +0 -0
  313. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/__init__.py +0 -0
  314. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/bootstrap.py +0 -0
  315. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/catalog.py +0 -0
  316. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/cedar.py +0 -0
  317. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/deploy_profile.py +0 -0
  318. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/drift.py +0 -0
  319. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/infra.py +0 -0
  320. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/manifest.py +0 -0
  321. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/planner.py +0 -0
  322. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/preflight.py +0 -0
  323. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/publisher.py +0 -0
  324. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/rbac.py +0 -0
  325. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/registry_provisioner.py +0 -0
  326. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/resource_publisher.py +0 -0
  327. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/secret_resolver.py +0 -0
  328. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/state.py +0 -0
  329. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/template_generator.py +0 -0
  330. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/validator.py +0 -0
  331. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/versioning.py +0 -0
  332. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/plugins.py +0 -0
  333. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/__init__.py +0 -0
  334. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/_loader.py +0 -0
  335. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/back_compat.py +0 -0
  336. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/budgets/enterprise.toml +0 -0
  337. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/budgets/free_tier.toml +0 -0
  338. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/budgets/production.toml +0 -0
  339. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/budgets/safety_rails.toml +0 -0
  340. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/checkpoints/durable.toml +0 -0
  341. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/checkpoints/hitl.toml +0 -0
  342. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/checkpoints/off.toml +0 -0
  343. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/memory/analysis.toml +0 -0
  344. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/memory/assistant.toml +0 -0
  345. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/memory/balanced.toml +0 -0
  346. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/memory/research.toml +0 -0
  347. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/memory/workflow.toml +0 -0
  348. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/resolve.py +0 -0
  349. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/run_history/compliance.toml +0 -0
  350. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/run_history/debug.toml +0 -0
  351. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/run_history/off.toml +0 -0
  352. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/run_history/standard.toml +0 -0
  353. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/__init__.py +0 -0
  354. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/data/.gitkeep +0 -0
  355. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/data/pricing_feed_2026-05-13.json +0 -0
  356. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/data/signing_public_key.pem +0 -0
  357. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/data/sources/.gitkeep +0 -0
  358. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/data/sources/litellm_id_map.json +0 -0
  359. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/data/sources/litellm_sha.txt +0 -0
  360. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/data/sources/overrides.json +0 -0
  361. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/data/sources/required_models.txt +0 -0
  362. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/schema.py +0 -0
  363. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/signing.py +0 -0
  364. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/warnings.py +0 -0
  365. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/__init__.py +0 -0
  366. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/_timeout.py +0 -0
  367. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/anthropic.py +0 -0
  368. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/base.py +0 -0
  369. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/bedrock.py +0 -0
  370. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/google.py +0 -0
  371. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/ollama.py +0 -0
  372. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/openai.py +0 -0
  373. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/pricing.py +0 -0
  374. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/retry.py +0 -0
  375. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/router.py +0 -0
  376. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/smart_router.py +0 -0
  377. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/test.py +0 -0
  378. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/secrets/__init__.py +0 -0
  379. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/secrets/resolver.py +0 -0
  380. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/structured/__init__.py +0 -0
  381. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/structured/output.py +0 -0
  382. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tasks/__init__.py +0 -0
  383. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tasks/runner.py +0 -0
  384. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tenancy/__init__.py +0 -0
  385. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tenancy/context.py +0 -0
  386. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tenancy/cost_attribution.py +0 -0
  387. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tenancy/credentials.py +0 -0
  388. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tenancy/isolation.py +0 -0
  389. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tenancy/middleware.py +0 -0
  390. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tenancy/quota.py +0 -0
  391. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/testing/__init__.py +0 -0
  392. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/testing/harness.py +0 -0
  393. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/testing/mocks.py +0 -0
  394. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/testing/vcr.py +0 -0
  395. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/__init__.py +0 -0
  396. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/a2a.py +0 -0
  397. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/agent_registry.py +0 -0
  398. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/agent_tool.py +0 -0
  399. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/builtins.py +0 -0
  400. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/context.py +0 -0
  401. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/decorator.py +0 -0
  402. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/executor.py +0 -0
  403. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/mcp.py +0 -0
  404. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/mcp_auth.py +0 -0
  405. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/mcp_callback_server.py +0 -0
  406. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/mcp_config.py +0 -0
  407. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/mcp_registry.py +0 -0
  408. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/mcp_token_cache.py +0 -0
  409. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/media.py +0 -0
  410. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/middleware.py +0 -0
  411. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/tool_registry.py +0 -0
  412. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/toolkit.py +0 -0
  413. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/web_search.py +0 -0
  414. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/__init__.py +0 -0
  415. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/attributes.py +0 -0
  416. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/exporter.py +0 -0
  417. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/exporters/__init__.py +0 -0
  418. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/exporters/base.py +0 -0
  419. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/exporters/datadog.py +0 -0
  420. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/exporters/honeycomb.py +0 -0
  421. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/exporters/langfuse.py +0 -0
  422. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/exporters/otel.py +0 -0
  423. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/integrations.py +0 -0
  424. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/trace.py +0 -0
  425. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/triggers/__init__.py +0 -0
  426. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/triggers/handler.py +0 -0
  427. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/triggers/runtime.py +0 -0
  428. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/triggers/trigger.py +0 -0
  429. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/triggers/types.py +0 -0
  430. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/types.py +0 -0
  431. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/versioning/__init__.py +0 -0
  432. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/versioning/canary.py +0 -0
  433. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/versioning/manifest.py +0 -0
  434. {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/versioning/store.py +0 -0
@@ -38,6 +38,13 @@ coverage.xml
38
38
  .bedrock_agentcore/
39
39
  *.log
40
40
 
41
+ # UI server local state (runtime-generated, never commit)
42
+ synth/cli/_ui_assets/conversations.json
43
+ synth/cli/_ui_assets/conversation_agents.json
44
+ synth/cli/_ui_assets/prompts.json
45
+ synth/cli/_ui_assets/evals.json
46
+ synth/cli/_ui_assets/scenarios.json
47
+
41
48
  # CDK build artifacts
42
49
  synth-ui-deploy/cdk.out/
43
50
  synth-ui-deploy/cdk.out.*/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synth-agent-sdk
3
- Version: 2.2.0
3
+ Version: 2.2.2
4
4
  Summary: Autonomous agents, engineered. A Python SDK for building production-grade AI agents and multi-agent systems.
5
5
  License-Expression: MIT
6
6
  Requires-Python: >=3.10
@@ -62,6 +62,16 @@ Requires-Dist: pytest-asyncio>=0.23; extra == 'cloud-test'
62
62
  Requires-Dist: respx>=0.21; extra == 'cloud-test'
63
63
  Provides-Extra: datadog
64
64
  Requires-Dist: ddtrace>=2.0; extra == 'datadog'
65
+ Provides-Extra: dev
66
+ Requires-Dist: boto3>=1.42.87; extra == 'dev'
67
+ Requires-Dist: hypothesis>=6.0; extra == 'dev'
68
+ Requires-Dist: jsonschema>=4; extra == 'dev'
69
+ Requires-Dist: moto>=5.0; extra == 'dev'
70
+ Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
71
+ Requires-Dist: pytest>=8.0; extra == 'dev'
72
+ Requires-Dist: pyyaml>=6.0; extra == 'dev'
73
+ Requires-Dist: respx>=0.21; extra == 'dev'
74
+ Requires-Dist: tomli>=2.0; (python_version < '3.11') and extra == 'dev'
65
75
  Provides-Extra: enterprise
66
76
  Requires-Dist: boto3>=1.42.87; extra == 'enterprise'
67
77
  Requires-Dist: opentelemetry-api>=1.20; extra == 'enterprise'
@@ -110,7 +120,7 @@ Description-Content-Type: text/markdown
110
120
 
111
121
  > Autonomous agents, engineered.
112
122
 
113
- **Version:** 2.2.0 | [PyPI](https://pypi.org/project/synth-agent-sdk/) | [Changelog](CHANGELOG.md)
123
+ **Version:** 2.2.1 | [PyPI](https://pypi.org/project/synth-agent-sdk/) | [Changelog](CHANGELOG.md)
114
124
 
115
125
  Synth is a Python SDK and platform for building, deploying, and governing production-grade AI agents. It covers the full agent lifecycle — from a 3-line prototype to multi-agent systems running across AWS accounts with policy-as-code guardrails, drift detection, and centralized observability.
116
126
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Autonomous agents, engineered.
4
4
 
5
- **Version:** 2.2.0 | [PyPI](https://pypi.org/project/synth-agent-sdk/) | [Changelog](CHANGELOG.md)
5
+ **Version:** 2.2.1 | [PyPI](https://pypi.org/project/synth-agent-sdk/) | [Changelog](CHANGELOG.md)
6
6
 
7
7
  Synth is a Python SDK and platform for building, deploying, and governing production-grade AI agents. It covers the full agent lifecycle — from a 3-line prototype to multi-agent systems running across AWS accounts with policy-as-code guardrails, drift detection, and centralized observability.
8
8
 
@@ -0,0 +1,29 @@
1
+ # AgentCore Deployment Configuration
2
+ #
3
+ # This file is used by: synth deploy --target agentcore
4
+ #
5
+ # Agent Metadata
6
+ agent_name: agent
7
+ agent_description: "AI agent deployed to AWS AgentCore"
8
+
9
+ # AWS Configuration
10
+ aws_region: us-east-1
11
+ model_id:
12
+ cris_enabled: false
13
+
14
+ # IAM Permissions (least-privilege)
15
+ permissions:
16
+ - "bedrock:InvokeModel"
17
+ - "bedrock:InvokeModelWithResponseStream"
18
+ - "bedrock-agentcore:*"
19
+ - "ssm:GetParameter"
20
+ - "secretsmanager:GetSecretValue"
21
+
22
+ # Runtime Configuration
23
+ runtime:
24
+ memory_mb: 512
25
+ timeout_seconds: 300
26
+
27
+ # Environment Variables (non-sensitive only)
28
+ environment:
29
+ SYNTH_NO_BANNER: "1"
@@ -0,0 +1,6 @@
1
+ """AgentCore handler wrapper."""
2
+
3
+ from agent import agent
4
+ from synth.deploy.agentcore import agentcore_handler
5
+
6
+ app = agentcore_handler(agent)
@@ -0,0 +1,21 @@
1
+ {
2
+ "config_name": "agent_eval-online-eval",
3
+ "sampling_rate": 1.0,
4
+ "evaluators": [
5
+ {
6
+ "id": "Builtin.Helpfulness",
7
+ "arn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Helpfulness",
8
+ "level": "TRACE"
9
+ },
10
+ {
11
+ "id": "Builtin.Correctness",
12
+ "arn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Correctness",
13
+ "level": "TRACE"
14
+ },
15
+ {
16
+ "id": "Builtin.GoalSuccessRate",
17
+ "arn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.GoalSuccessRate",
18
+ "level": "SESSION"
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1,10 @@
1
+ [
2
+ {
3
+ "input": "What is 2 + 2?",
4
+ "expected": "4"
5
+ },
6
+ {
7
+ "input": "Say hello",
8
+ "expected": "Hello"
9
+ }
10
+ ]
@@ -0,0 +1,229 @@
1
+ # Synth SDK — Community Feedback Analysis
2
+
3
+ > Verified against source as of v2.2.1. Each item is marked **accurate**, **inaccurate**,
4
+ > or **partially accurate** based on a direct code scan. Corrected descriptions replace
5
+ > the original where needed.
6
+
7
+ ---
8
+
9
+ ## Single-Agent Gaps
10
+
11
+ ### 1. Memory is too shallow — ACCURATE (with nuance)
12
+
13
+ `Memory.thread()`, `Memory.persistent()`, `Memory.semantic()`, and `Memory.dynamodb()`
14
+ cover short-term and session-scoped retrieval. `SemanticMemory` does vector-based
15
+ similarity retrieval, but it is scoped to a single `thread_id`. When backed by an
16
+ external `BaseVectorStore`, embeddings persist across process restarts — but there is
17
+ no built-in mechanism to search *across* thread IDs to surface what a user said in a
18
+ different conversation two weeks ago. `Knowledge` covers RAG over documents; it does
19
+ not cover cross-session episodic memory. This is a real gap for production deployments
20
+ that need long-horizon user context.
21
+
22
+ ---
23
+
24
+ ### 2. Guards are agent-level only — ACCURATE
25
+
26
+ `ToolFilterGuard` (`Guard.no_tool_calls(patterns)`) blocks tool calls by glob pattern
27
+ at the agent level, but there is no per-tool guard attachment. You cannot say "allow
28
+ `web_search` freely but require approval before `shell`" without splitting into separate
29
+ agents. Per-tool guard policies — where each tool carries its own guard list evaluated
30
+ at invocation time — are not implemented.
31
+
32
+ ---
33
+
34
+ ### 3. Self-correction is implicit, not structured — PARTIALLY ACCURATE
35
+
36
+ `max_retries` and `retry_backoff` handle transient provider errors. There is no
37
+ structured self-reflection loop where the agent evaluates its own output against a
38
+ rubric and revises before returning.
39
+
40
+ However, the feedback misses `RalphLoop` — a first-class public primitive
41
+ (`from synth import RalphLoop`) that wraps an agent in a run-test-fix iteration cycle.
42
+ `RalphLoop` re-invokes the agent with a fresh thread on each iteration until an external
43
+ predicate (a shell command or callable) passes or a `max_iterations` budget is exhausted.
44
+ It supports checkpointing, streaming (`astream()`), and crash recovery (`resume()`).
45
+
46
+ The gap is specifically *self-reflective critique* — where the agent inspects its own
47
+ output against a quality rubric and decides to revise. `RalphLoop` requires an external
48
+ predicate; it does not support the agent reasoning about its own output quality
49
+ internally. That distinction is real and worth calling out.
50
+
51
+ ---
52
+
53
+ ### 4. Tool selection at scale is unsolved — ACCURATE
54
+
55
+ With 50+ pre-built integrations via `synth-tools`, there is no `ToolSelector`, dynamic
56
+ tool relevance scoring, or per-invocation tool pruning based on task context. Passing
57
+ all tools to the model on every call degrades performance and increases cost. This is a
58
+ real gap.
59
+
60
+ ---
61
+
62
+ ### 5. No adaptive retry strategy — INACCURATE
63
+
64
+ The feedback claims `retry_backoff` is "a static float." This is wrong. `RetryHandler`
65
+ in `synth/providers/retry.py` implements:
66
+
67
+ - Exponential backoff: `base * 2^attempt + jitter` (full jitter, not fixed)
68
+ - `Retry-After` header parsing (both integer seconds and HTTP-date format)
69
+ - A `max_duration_seconds` cap that aborts retries before the total wall-clock time
70
+ exceeds the limit — preventing indefinite blocking on sustained failures
71
+ - Configurable `retryable_status_codes` to extend the default set (408, 429, 5xx)
72
+
73
+ What is not implemented is *strategy-changing* retries — falling back to a simpler
74
+ tool, decomposing the task differently, or escalating to a human when retries are
75
+ exhausted. The provider fallback chain (`fallback=["gpt-4o", ...]`) handles model-level
76
+ fallback, but task-level strategy changes on retry are not a built-in primitive.
77
+
78
+ ---
79
+
80
+ ### 6. Multimodal at the agent loop level is unclear — ACCURATE
81
+
82
+ `ImageInput`, `AudioInput`, and `FileInput` exist as dataclasses for annotating tool
83
+ function parameters. They are tool-input types, not native agent-loop multimodal
84
+ inputs. There is no mechanism for a user to send an image mid-conversation and have
85
+ the agent's core reasoning loop process it natively (e.g., as a vision input to the
86
+ provider). The distinction between tool-parameter media and native agent-level
87
+ multimodal reasoning is real and the latter is not implemented.
88
+
89
+ ---
90
+
91
+ ## Multi-Agent Gaps
92
+
93
+ ### 7. No cross-agent shared memory — ACCURATE
94
+
95
+ Agents in Pipelines, Graphs, and AgentTeams each operate with their own memory scope.
96
+ There is no `SharedMemory` or `TeamContext` primitive that lets agents read each other's
97
+ working state without routing everything through the orchestrator. In a research team
98
+ topology, agents cannot directly access each other's notes. This is a real gap.
99
+
100
+ ---
101
+
102
+ ### 8. Debate and consensus topologies lack conflict resolution mechanics — INACCURATE
103
+
104
+ The conflict resolution mechanics are fully implemented and configurable:
105
+
106
+ **Consensus** (`ConsensusExecutor`) supports three strategies via
107
+ `plan.parameters["consensus"]`:
108
+ - `"majority_vote"` — tallies by exact-text equality; ties broken by declaration order;
109
+ automatically downgrades to `"synthesise"` when no answer repeats (R2.10.4)
110
+ - `"best_of"` — selects the longest (most elaborated) answer
111
+ - `"synthesise"` — calls the orchestrator model with the full set of candidate answers
112
+ to produce a synthesised resolution
113
+
114
+ **Debate** (`DebateExecutor`) runs debaters in alternating rounds for up to
115
+ `plan.parameters["max_rounds"]` rounds (default 2), then invokes a configurable judge
116
+ (`plan.parameters["judge"]`). When no judge is configured, the orchestrator model acts
117
+ as the default judge (R2.9.4). The full debate transcript is passed to the judge.
118
+
119
+ These mechanics are first-class configurable parameters, not hidden inside an opaque
120
+ orchestrator.
121
+
122
+ ---
123
+
124
+ ### 9. No circuit breaker / agent health monitoring — ACCURATE
125
+
126
+ `DurableRunner` provides step-level journaling and replay after a crash, and
127
+ `max_iterations` prevents infinite graph loops. However, there is no live circuit
128
+ breaker pattern during execution. If a parallel graph branch enters a tight failure
129
+ loop, hits its rate limit repeatedly, or throws on every invocation, there is no
130
+ mechanism to isolate and recover that branch without aborting the whole graph run.
131
+ Live fault isolation — detecting a degraded branch and routing around it while other
132
+ branches continue — is not implemented.
133
+
134
+ ---
135
+
136
+ ### 10. Dynamic team composition isn't supported — INACCURATE
137
+
138
+ `AgentTeam` supports runtime team modification via `add_agent(agent)` and
139
+ `remove_agent(name)`. Both methods update the internal agent map and rebuild the skill
140
+ registry so subsequent routing decisions see the updated roster. The feedback's claim
141
+ that "team membership is static at definition time" is incorrect.
142
+
143
+ What is not implemented is *autonomous* dynamic composition — where the orchestrator
144
+ itself decides to instantiate a new specialist agent type that was not defined anywhere
145
+ in the original team configuration. `add_agent` requires the caller to supply a
146
+ pre-built agent instance.
147
+
148
+ ---
149
+
150
+ ### 11. Cost attribution in multi-agent is implicit — PARTIALLY ACCURATE
151
+
152
+ `CostAttribution` (`synth/tenancy/cost_attribution.py`) provides per-tenant cost
153
+ recording with both in-memory and DynamoDB backends. `RunResult.cost` uses the live
154
+ pricing feed for accuracy.
155
+
156
+ The gap is per-agent cost budgets *within a single multi-agent run*. `TenantContext`
157
+ scopes cost across runs by tenant. `TeamBudgetExceededError` exists as an error type,
158
+ suggesting budget enforcement is at least partially wired. However, there is no
159
+ first-class API for setting per-agent cost ceilings within a single team execution so
160
+ that one runaway agent cannot consume the entire run budget. This is a real gap for
161
+ production multi-agent deployments.
162
+
163
+ ---
164
+
165
+ ### 12. Streaming across handoffs is unclear — INACCURATE
166
+
167
+ Pipeline streaming is implemented. `PipelineExecutor.astream()` is a native streaming
168
+ override that opens a per-stage stream iterator, forwards tokens as they arrive, and
169
+ emits `agent_start` / `agent_complete` frames around each stage. Tokens flow through
170
+ to the caller while each stage is still processing — stages do not buffer to completion
171
+ before the next begins. `StageEvent(stage_name, event)` wraps each event so consumers
172
+ know which pipeline stage produced it.
173
+
174
+ ---
175
+
176
+ ### 13. The router only routes by complexity — INACCURATE
177
+
178
+ There is no `SmartRouter` in the codebase. The feedback's description of
179
+ "complexity-based model tier selection" does not correspond to any implemented class.
180
+
181
+ The actual routing system is a four-strategy hierarchy:
182
+ - `HybridRouter` (default for `AgentTeam(strategy="auto")`) — composes `RuleRouter`
183
+ and `LLMRouter`; rules fire first, LLM is the fallback
184
+ - `RuleRouter` — deterministic callable-rule table; user-defined rules with no LLM call
185
+ - `LLMRouter` — prompts the orchestrator model for a structured routing decision
186
+ - `HeuristicRouter` — pure keyword/message-length/agent-role heuristics; no LLM call
187
+
188
+ Routing dimensions include: task keywords, message length, agent role shape, policy
189
+ pins, allowed/forbidden topology lists, and full LLM reasoning over the task and team
190
+ descriptor. What is not implemented is routing by agent availability/load, agent
191
+ historical track record on similar tasks, or cost-target-based routing. Those are real
192
+ gaps in the routing policy language.
193
+
194
+ ---
195
+
196
+ ## RalphLoop — What It Is
197
+
198
+ Since the feedback doesn't cover it and you want to talk about it: `RalphLoop` is a
199
+ first-class public primitive for autonomous run-test-fix iteration.
200
+
201
+ ```python
202
+ from synth import Agent, RalphLoop
203
+
204
+ agent = Agent(model="claude-sonnet-4-5", instructions="Write and fix code.")
205
+ loop = RalphLoop(agent=agent, predicate="pytest -x", max_iterations=10)
206
+ result = loop.run("Implement the features described in PRD.md")
207
+
208
+ print(result.completed) # True if tests pass within budget
209
+ print(result.iterations) # How many iterations it took
210
+ print(result.predicate_failures) # What failed on each iteration
211
+ ```
212
+
213
+ Key properties:
214
+ - **Fresh context per iteration** — each iteration gets a new `thread_id` so the agent
215
+ cannot get stuck hallucinating fixes to earlier claims
216
+ - **Predicate types** — shell command (exit 0 = done), sync callable, or async callable
217
+ - **Checkpointing** — optional `BaseCheckpointStore` persists state after each iteration;
218
+ `RalphLoop.resume(run_id, ...)` continues from the last checkpoint after a crash
219
+ - **Streaming** — `loop.astream(prompt)` yields `NodeStartEvent` / `NodeCompleteEvent`
220
+ per iteration plus a terminal `ralph_summary` event
221
+ - **Hook integration** — `pre_step` and `post_step` hooks fire around each iteration;
222
+ a `block` decision from `pre_step` aborts the loop cleanly
223
+ - **Hard budget** — `max_iterations` is enforced; the loop returns
224
+ `RalphResult(completed=False, ...)` rather than raising when the budget runs out
225
+
226
+ The gap relative to the self-correction feedback (item 3) is that `RalphLoop` requires
227
+ an *external* predicate — the agent does not introspect its own output quality. A
228
+ self-reflective variant where the predicate is itself an LLM call evaluating the output
229
+ against a rubric would be a natural extension.
@@ -0,0 +1 @@
1
+ []
@@ -0,0 +1,21 @@
1
+ {
2
+ "config_name": "my_agent_eval-online-eval",
3
+ "sampling_rate": 1.0,
4
+ "evaluators": [
5
+ {
6
+ "id": "Builtin.Helpfulness",
7
+ "arn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Helpfulness",
8
+ "level": "TRACE"
9
+ },
10
+ {
11
+ "id": "Builtin.Correctness",
12
+ "arn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Correctness",
13
+ "level": "TRACE"
14
+ },
15
+ {
16
+ "id": "Builtin.GoalSuccessRate",
17
+ "arn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.GoalSuccessRate",
18
+ "level": "SESSION"
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1,10 @@
1
+ [
2
+ {
3
+ "input": "What is 2 + 2?",
4
+ "expected": "4"
5
+ },
6
+ {
7
+ "input": "Say hello",
8
+ "expected": "Hello"
9
+ }
10
+ ]
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "synth-agent-sdk"
7
- version = "2.2.0"
7
+ version = "2.2.2"
8
8
  description = "Autonomous agents, engineered. A Python SDK for building production-grade AI agents and multi-agent systems."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -36,6 +36,20 @@ aws = ["synth-agent-sdk[agentcore]"]
36
36
  mcp = ["mcp>=1.0"]
37
37
  testing = []
38
38
  quickstart = ["anthropic>=0.39", "openai>=1.0"]
39
+ # Full test/dev dependency set used by CI to run the unit + property
40
+ # suites. Includes mocking (moto, respx), property testing (hypothesis),
41
+ # and the pytest stack. Not shipped to end users.
42
+ dev = [
43
+ "pytest>=8.0",
44
+ "pytest-asyncio>=0.23",
45
+ "hypothesis>=6.0",
46
+ "moto>=5.0",
47
+ "respx>=0.21",
48
+ "boto3>=1.42.87",
49
+ "jsonschema>=4",
50
+ "pyyaml>=6.0",
51
+ "tomli>=2.0; python_version < '3.11'",
52
+ ]
39
53
  ui = ["uvicorn>=0.30", "fastapi>=0.115"]
40
54
  cdk = ["aws-cdk-lib>=2.100.0", "constructs>=10.0.0"]
41
55
  platform = ["boto3>=1.42.87", "pyyaml>=6.0"]
@@ -78,6 +92,16 @@ all = [
78
92
 
79
93
  [tool.hatch.build.targets.wheel]
80
94
  packages = ["synth"]
95
+ exclude = [
96
+ # Test files live inside the synth package but must never ship
97
+ "synth/tests/",
98
+ # Runtime-generated local state files — never ship in the wheel
99
+ "synth/cli/_ui_assets/conversations.json",
100
+ "synth/cli/_ui_assets/conversation_agents.json",
101
+ "synth/cli/_ui_assets/prompts.json",
102
+ "synth/cli/_ui_assets/evals.json",
103
+ "synth/cli/_ui_assets/scenarios.json",
104
+ ]
81
105
 
82
106
  # Explicitly declare the bundled pricing data files so the wheel
83
107
  # manifest lists them even if they move or are renamed at release cut
@@ -103,12 +127,14 @@ exclude = [
103
127
  "Synth Website/",
104
128
  "synth-ui-deploy/",
105
129
  "synth-tools/",
130
+ "synth-community/",
106
131
  "power/",
107
132
  "SynthAgentSDK Power/",
108
133
  "tests/",
109
134
  "devtools/",
110
135
  "scripts/",
111
136
  ".kiro/",
137
+ ".github/",
112
138
  ".vscode/",
113
139
  ".venv/",
114
140
  ".hypothesis/",
@@ -619,6 +619,7 @@ class Agent:
619
619
  memory_context: Literal[
620
620
  "none", "long_term", "episodic", "all"
621
621
  ] = "none",
622
+ tool_cap_behaviour: Literal["generate", "force"] = "generate",
622
623
  ) -> None:
623
624
  # Load unified config (Req 25) — values are defaults that can
624
625
  # be overridden by constructor args and env vars.
@@ -637,6 +638,7 @@ class Agent:
637
638
  self.deps = deps
638
639
  self.parallel_guards = parallel_guards
639
640
  self.max_tool_calls = max_tool_calls
641
+ self._tool_cap_behaviour = tool_cap_behaviour
640
642
 
641
643
  # Agent lifecycle hooks (Req 1) — copied to defend against
642
644
  # mutation of the caller's list after construction.
@@ -2557,6 +2559,49 @@ class Agent:
2557
2559
  "post_step", messages, tool_round, response.text or "",
2558
2560
  )
2559
2561
 
2562
+ # ── Force synthesis when tool cap fires ──────────────────────
2563
+ # If the loop exited because max_tool_rounds was reached (not
2564
+ # because the model voluntarily stopped), the model still wanted
2565
+ # to call tools. When tool_cap_behaviour="generate", make one
2566
+ # final call WITHOUT tools available, instructing the model to
2567
+ # synthesise its findings. This guarantees a non-empty
2568
+ # response.text for the RunResult.
2569
+ if (
2570
+ response.tool_calls
2571
+ and tool_round >= max_tool_rounds
2572
+ and self._tool_cap_behaviour == "generate"
2573
+ ):
2574
+ # Append the assistant's unfulfilled tool request as context
2575
+ messages.append({
2576
+ "role": "assistant",
2577
+ "content": response.text or "",
2578
+ })
2579
+ messages.append({
2580
+ "role": "user",
2581
+ "content": (
2582
+ "[SYSTEM] Tool call limit reached. You have gathered "
2583
+ "sufficient information from your previous tool calls. "
2584
+ "Produce your final answer now based on all the data "
2585
+ "you have collected. Do not request any more tools."
2586
+ ),
2587
+ })
2588
+
2589
+ # Final call with tools stripped — model MUST produce text.
2590
+ async with collector.span(
2591
+ active_model,
2592
+ "llm_call",
2593
+ tenant_id=(tenant_ctx.tenant_id if tenant_ctx else None),
2594
+ ) as synth_meta:
2595
+ response = await self.retry_handler.execute(
2596
+ active_provider.complete,
2597
+ messages,
2598
+ tools=[],
2599
+ prompt_caching=self._prompt_caching,
2600
+ )
2601
+ synth_meta["total_tokens"] = response.usage.total_tokens
2602
+ synth_meta["input_tokens"] = response.usage.input_tokens
2603
+ synth_meta["output_tokens"] = response.usage.output_tokens
2604
+
2560
2605
  # 5. Output guard evaluation
2561
2606
  await self._evaluate_guards(
2562
2607
  response.text,
@@ -2902,6 +2947,10 @@ class Agent:
2902
2947
  # Resolve active provider (with fallback on initial failure)
2903
2948
  active_model, active_provider = self.model, self.provider
2904
2949
  first_call = True
2950
+ _stream_tool_round = 0
2951
+ _stream_max_rounds = self.max_tool_calls
2952
+ _stream_hit_cap = False
2953
+ _stream_is_initial = True
2905
2954
 
2906
2955
  while True:
2907
2956
  needs_another_round = False
@@ -3114,6 +3163,80 @@ class Agent:
3114
3163
  if not needs_another_round:
3115
3164
  break
3116
3165
 
3166
+ # Track tool rounds: the first iteration is the initial
3167
+ # provider call; subsequent iterations are tool rounds.
3168
+ # Only count after the initial call has been made.
3169
+ if _stream_is_initial:
3170
+ _stream_is_initial = False
3171
+ else:
3172
+ _stream_tool_round += 1
3173
+
3174
+ if _stream_tool_round >= _stream_max_rounds:
3175
+ _stream_hit_cap = True
3176
+ break
3177
+
3178
+ # ── Force synthesis when tool cap fires (streaming) ──────
3179
+ # Mirrors the _arun_inner synthesis logic for the streaming
3180
+ # path. When the stream loop exits at the cap and
3181
+ # tool_cap_behaviour="generate", make one final streaming
3182
+ # call with tools stripped to produce synthesis text.
3183
+ if _stream_hit_cap and self._tool_cap_behaviour == "generate":
3184
+ messages.append({
3185
+ "role": "assistant",
3186
+ "content": accumulated_text or "",
3187
+ })
3188
+ messages.append({
3189
+ "role": "user",
3190
+ "content": (
3191
+ "[SYSTEM] Tool call limit reached. You have gathered "
3192
+ "sufficient information from your previous tool calls. "
3193
+ "Produce your final answer now based on all the data "
3194
+ "you have collected. Do not request any more tools."
3195
+ ),
3196
+ })
3197
+
3198
+ # Reset accumulated text — the synthesis IS the response
3199
+ accumulated_text = ""
3200
+
3201
+ async with collector.span(
3202
+ active_model, "llm_call",
3203
+ ) as synth_meta:
3204
+ async for event in active_provider.stream(
3205
+ messages, tools=[],
3206
+ ):
3207
+ if isinstance(event, TextChunkEvent):
3208
+ accumulated_text += event.text
3209
+ yield TokenEvent(text=event.text)
3210
+
3211
+ elif isinstance(event, ProviderDoneEvent):
3212
+ total_usage = TokenUsage(
3213
+ input_tokens=(
3214
+ total_usage.input_tokens
3215
+ + event.usage.input_tokens
3216
+ ),
3217
+ output_tokens=(
3218
+ total_usage.output_tokens
3219
+ + event.usage.output_tokens
3220
+ ),
3221
+ total_tokens=(
3222
+ total_usage.total_tokens
3223
+ + event.usage.total_tokens
3224
+ ),
3225
+ )
3226
+ synth_meta["total_tokens"] = (
3227
+ event.usage.total_tokens
3228
+ )
3229
+ synth_meta["input_tokens"] = (
3230
+ event.usage.input_tokens
3231
+ )
3232
+ synth_meta["output_tokens"] = (
3233
+ event.usage.output_tokens
3234
+ )
3235
+
3236
+ elif isinstance(event, ProviderErrorEvent):
3237
+ yield ErrorEvent(error=event.error)
3238
+ return
3239
+
3117
3240
  # Finalise trace and build RunResult, then yield DoneEvent
3118
3241
  trace = collector.finalise()
3119
3242
  elapsed_ms = (time.perf_counter() - start_time) * 1000