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.
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/.gitignore +7 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/PKG-INFO +12 -2
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/README.md +1 -1
- synth_agent_sdk-2.2.2/agent/agentcore.yaml +29 -0
- synth_agent_sdk-2.2.2/agent/handler.py +6 -0
- synth_agent_sdk-2.2.2/agent_eval/eval_config.json +21 -0
- synth_agent_sdk-2.2.2/agent_eval/eval_dataset.json +10 -0
- synth_agent_sdk-2.2.2/community-feedback-analysis.md +229 -0
- synth_agent_sdk-2.2.2/dummy.json +1 -0
- synth_agent_sdk-2.2.2/my_agent_eval/eval_config.json +21 -0
- synth_agent_sdk-2.2.2/my_agent_eval/eval_dataset.json +10 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/pyproject.toml +27 -1
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/agent.py +123 -0
- synth_agent_sdk-2.2.2/synth/cli/_ui_assets/builder_api.py +3407 -0
- synth_agent_sdk-2.2.2/synth/cli/_ui_assets/builder_flow_config.py +516 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/server.py +378 -1
- synth_agent_sdk-2.2.2/synth/cli/_ui_assets/static/builder-api.js +365 -0
- synth_agent_sdk-2.2.2/synth/cli/_ui_assets/static/builder.css +2714 -0
- synth_agent_sdk-2.2.2/synth/cli/_ui_assets/static/builder.html +499 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/static/index.html +2 -0
- synth_agent_sdk-2.2.2/synth/cli/_ui_assets/static/landing.html +552 -0
- synth_agent_sdk-2.2.2/synth/cli/_ui_assets/static/wizard-state.js +560 -0
- synth_agent_sdk-2.2.2/synth/cli/_ui_assets/static/wizard-steps.js +8502 -0
- synth_agent_sdk-2.2.2/synth/cli/_ui_assets/static/wizard.html +621 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/banner.py +2 -1
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/loader.py +5 -5
- synth_agent_sdk-2.2.0/.github/CODEOWNERS +0 -34
- synth_agent_sdk-2.2.0/.github/workflows/observability-doc-idempotence.yml +0 -52
- synth_agent_sdk-2.2.0/.github/workflows/pricing-feed-validation.yml +0 -102
- synth_agent_sdk-2.2.0/.github/workflows/pricing-freshness.yml +0 -129
- synth_agent_sdk-2.2.0/.github/workflows/spec-metadata-lint.yml +0 -137
- synth_agent_sdk-2.2.0/synth/cli/_ui_assets/conversation_agents.json +0 -324
- synth_agent_sdk-2.2.0/synth/cli/_ui_assets/conversations.json +0 -62
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/.dockerignore +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/install.ps1 +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/install.sh +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/requirements.txt +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/CHANGELOG.md +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/README.md +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/__main__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/_compat.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/backends/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/backends/cloudwatch.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/backends/dynamo.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/backends/local.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/backends/s3.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/chain.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/log.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/audit/types.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cache/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cache/base.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cache/dynamo.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cache/local.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cache/middleware.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cache/redis.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cache/types.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/checkpointing/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/checkpointing/base.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/checkpointing/dynamo.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/checkpointing/encryption.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/checkpointing/local.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/checkpointing/redis.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_agent_ops.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_colors.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_doc_gen/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_doc_gen/observability_html.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_error_formatter.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_init_back_nav.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_init_catalog.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_init_enterprise.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_init_generators.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_init_helpers.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_platform_assets/app.js +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_platform_assets/easter_eggs.js +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_platform_assets/index.html +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_platform_assets/style.css +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_render.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_tui.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/README.md +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/agentcore_history.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/app.js +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/easter_eggs.js +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/index.html +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/provenance.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/registry_ui.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/static/app.js +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/static/easter_eggs.js +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/static/login.html +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/static/style.css +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_assets/style.css +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/_ui_templates.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/agents_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/aws_auth.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/bench_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/cloud_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/create_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/deploy_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/destroy_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/dev.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/dev_ui_contract.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/discover.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/doctor.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/edit_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/eval_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/help_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/init_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/inspect_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/main.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/mcp_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/migrate_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/package_info.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/platform_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/pricing.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/registry.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/registry_prompt.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/route_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/run_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/shell.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/tools_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/trace_cmd.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cli/welcome.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/auth.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/cache.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/client.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/config.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/errors.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/manifest.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/packaging.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/cloud/types.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/config.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/adapter.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/auth.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/browser.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/code_interpreter.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/credentials.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/evaluations.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/gateway.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/handler.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/manifest.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/memory.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/model_catalog.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/observability.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/schema_translator.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/ssm.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/team_handler.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/tool_registry.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/agentcore/types.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/packager.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/base.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/cost_estimator.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/dry_run.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/phase_container_build.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/phase_endpoint_wiring.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/phase_post_deploy.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/phase_preflight.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/phase_registry_publish.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/phase_runtime_provisioning.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/phase_state_infra.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/progress.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/deploy/pipeline/runner.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/durable/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/durable/base.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/durable/dynamo.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/durable/local.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/durable/redis.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/durable/runner.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/durable/types.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/durable/wrappers.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/errors.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/eval.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/report.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/scorers.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/suites/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/suites/base.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/suites/grounding.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/suites/guard_compliance.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/suites/hallucination.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/suites/multi_step.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/suites/tool_selection.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/eval/trace_to_eval.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/base.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/budget.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/deploy.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/executor.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/routing.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/runtime.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/scrub.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/events/state.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/guards/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/guards/base.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/guards/composed.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/guards/cost.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/guards/custom.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/guards/pii.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/guards/rate_limit.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/guards/tool_filter.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/hooks/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/hooks/base.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/hooks/types.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/infra/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/infra/app_template.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/infra/constructs.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/infra/enterprise_constructs.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/infra/enterprise_stack.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/infra/stack.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/base.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/bedrock_kb.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/expanders.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/ingestion.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/knowledge.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/pipeline.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/query_expander.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/reranker.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/rerankers.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/s3.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/types.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/knowledge/vector.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/loops/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/loops/ralph.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/base.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/bedrock_vector_store.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/conversation.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/dynamo.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/local_vector_store.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/persistent.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/semantic.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/thread.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/memory/vector_store.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/observability/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/observability/cloudwatch.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/observability/cloudwatch_sink.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/observability/metrics.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/observability/trace_endpoint_sink.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/observability/xray_sink.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/_session_ids.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/dispatcher.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/event_bus.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/a2a_bus.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/base.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/blackboard.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/consensus.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/critic_review.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/debate.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/direct.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/graph_exec.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/parallel.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/peer_questions.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/pipeline_exec.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/registry.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/single_delegate.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/executors/termination.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/export.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/feature_flags.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/governance/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/governance/budget.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/governance/downgrade.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/governance/policy.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/governance/predicate.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/governance/toml_loader.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/graph.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/human_in_loop.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/interrupt.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/ledgers.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/memory.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/message_bus.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/pipeline.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/plan.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/record_payload.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/record_publisher.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/registry_audit.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/registry_resolver.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/base.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/decision.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/heuristic_router.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/hybrid_router.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/llm_router.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/prompts.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/replay.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/request.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/rule_router.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/team_descriptor.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/routing/transparency.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/adapters/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/adapters/dynamodb.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/adapters/inmem.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/adapters/memory.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/adapters/s3.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/agentcore.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/base.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/local.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/schemas.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/state/termination_adapter.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/team.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/team_registry.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/time_travel.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/orchestration/topology.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/bootstrap.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/catalog.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/cedar.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/deploy_profile.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/drift.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/infra.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/manifest.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/planner.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/preflight.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/publisher.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/rbac.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/registry_provisioner.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/resource_publisher.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/secret_resolver.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/state.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/template_generator.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/validator.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/platform/versioning.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/plugins.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/_loader.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/back_compat.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/budgets/enterprise.toml +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/budgets/free_tier.toml +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/budgets/production.toml +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/budgets/safety_rails.toml +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/checkpoints/durable.toml +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/checkpoints/hitl.toml +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/checkpoints/off.toml +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/memory/analysis.toml +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/memory/assistant.toml +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/memory/balanced.toml +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/memory/research.toml +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/memory/workflow.toml +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/resolve.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/run_history/compliance.toml +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/run_history/debug.toml +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/run_history/off.toml +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/presets/run_history/standard.toml +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/data/.gitkeep +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/data/pricing_feed_2026-05-13.json +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/data/signing_public_key.pem +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/data/sources/.gitkeep +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/data/sources/litellm_id_map.json +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/data/sources/litellm_sha.txt +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/data/sources/overrides.json +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/data/sources/required_models.txt +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/schema.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/signing.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/pricing/warnings.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/_timeout.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/anthropic.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/base.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/bedrock.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/google.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/ollama.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/openai.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/pricing.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/retry.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/router.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/smart_router.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/providers/test.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/secrets/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/secrets/resolver.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/structured/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/structured/output.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tasks/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tasks/runner.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tenancy/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tenancy/context.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tenancy/cost_attribution.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tenancy/credentials.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tenancy/isolation.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tenancy/middleware.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tenancy/quota.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/testing/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/testing/harness.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/testing/mocks.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/testing/vcr.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/a2a.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/agent_registry.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/agent_tool.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/builtins.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/context.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/decorator.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/executor.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/mcp.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/mcp_auth.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/mcp_callback_server.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/mcp_config.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/mcp_registry.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/mcp_token_cache.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/media.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/middleware.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/tool_registry.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/toolkit.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tools/web_search.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/attributes.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/exporter.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/exporters/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/exporters/base.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/exporters/datadog.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/exporters/honeycomb.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/exporters/langfuse.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/exporters/otel.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/integrations.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/tracing/trace.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/triggers/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/triggers/handler.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/triggers/runtime.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/triggers/trigger.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/triggers/types.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/types.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/versioning/__init__.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/versioning/canary.py +0 -0
- {synth_agent_sdk-2.2.0 → synth_agent_sdk-2.2.2}/synth/versioning/manifest.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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,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,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
|
+
}
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "synth-agent-sdk"
|
|
7
|
-
version = "2.2.
|
|
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
|