synth-ai 0.17.5.dev589__tar.gz → 0.18.0.dev590__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_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/MANIFEST.in +1 -8
- {synth_ai-0.17.5.dev589/synth_ai.egg-info → synth_ai-0.18.0.dev590}/PKG-INFO +8 -17
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/README.md +6 -6
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/pyproject.toml +4 -35
- synth_ai-0.18.0.dev590/synth_ai/README.md +87 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/__init__.py +4 -7
- synth_ai-0.18.0.dev590/synth_ai/__main__.py +7 -0
- synth_ai-0.18.0.dev590/synth_ai/cli/AGENTS.md +16 -0
- synth_ai-0.18.0.dev590/synth_ai/cli/README.md +35 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/cli/main.py +0 -2
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/client.py +10 -9
- synth_ai-0.18.0.dev590/synth_ai/core/README.md +68 -0
- synth_ai-0.18.0.dev590/synth_ai/core/__init__.py +7 -0
- synth_ai-0.18.0.dev590/synth_ai/core/auth/__init__.py +4 -0
- synth_ai-0.18.0.dev590/synth_ai/core/contracts/__init__.py +4 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/contracts/pagination.py +2 -13
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/errors.py +2 -100
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/http/transport.py +22 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/research/__init__.py +30 -3
- synth_ai-0.18.0.dev590/synth_ai/core/utils/__init__.py +6 -0
- synth_ai-0.18.0.dev590/synth_ai/core/utils/env.py +75 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/utils/log_filter.py +2 -2
- synth_ai-0.18.0.dev590/synth_ai/core/utils/paths.py +10 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/utils/urls.py +0 -141
- synth_ai-0.18.0.dev590/synth_ai/mcp/research/README.md +85 -0
- synth_ai-0.18.0.dev590/synth_ai/mcp/research/objective_tools.py +34 -0
- synth_ai-0.18.0.dev590/synth_ai/mcp/research/registry.py +320 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/request_models.py +27 -48
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/server.py +30 -778
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/__init__.py +0 -6
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/approvals.py +4 -4
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/artifacts.py +7 -7
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/datasets.py +3 -3
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/environments.py +4 -4
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/exports.py +2 -2
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/factories.py +51 -51
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/factory_results.py +11 -11
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/files.py +4 -34
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/image_releases.py +5 -5
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/integrations.py +4 -4
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/logs.py +1 -1
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/models.py +4 -4
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/outputs.py +7 -7
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/progress.py +4 -4
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/project_data.py +7 -7
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/projects.py +43 -43
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/prs.py +2 -2
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/readiness.py +1 -1
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/repos.py +3 -3
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/resources.py +16 -16
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/runs.py +57 -57
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/trained_models.py +13 -13
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/usage.py +8 -8
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/visuals.py +5 -8
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/workspace_inputs.py +3 -3
- synth_ai-0.18.0.dev590/synth_ai/sdk/README.md +38 -0
- synth_ai-0.18.0.dev590/synth_ai/sdk/__init__.py +8 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/pagination.py +1 -10
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/advanced.py +11 -3
- synth_ai-0.18.0.dev590/synth_ai/sdk/research/advanced_factories.py +343 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/advanced_swarms.py +4 -103
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/client.py +15 -1
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/factory_operations.py +0 -45
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_control.py +3 -3
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_events.py +1 -1
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/runtime_image.py +0 -1
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_providers.py +0 -24
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/traces.py +2 -3
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/visuals.py +1 -4
- synth_ai-0.18.0.dev590/synth_ai/sdk/research/contracts/wire_models_README.md +33 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/economics.py +0 -4
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/errors.py +50 -25
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/events.py +0 -7
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/facade.py +77 -3
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/factories.py +0 -2
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/projects.py +19 -17
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/public.py +1 -6
- synth_ai-0.18.0.dev590/synth_ai/sdk/research/session/README.md +128 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/__init__.py +158 -295
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/_client_helpers.py +7 -5
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/_run_authority_mixin.py +15 -16
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/client.py +23 -85
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/config.py +0 -30
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/dev_environments.py +298 -35
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/factories.py +307 -1
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/image_releases.py +2 -2
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/images.py +2 -2
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/project.py +0 -4
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/runs.py +12 -10
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/transport.py +3 -3
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/usage.py +3 -3
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/swarms.py +20 -13
- synth_ai-0.18.0.dev590/synth_ai/sdk/research/transport/__init__.py +6 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/transport/http.py +35 -30
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/visuals.py +1 -10
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590/synth_ai.egg-info}/PKG-INFO +8 -17
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai.egg-info/SOURCES.txt +10 -24
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai.egg-info/entry_points.txt +0 -1
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai.egg-info/requires.txt +0 -13
- synth_ai-0.17.5.dev589/synth_ai/__main__.py +0 -36
- synth_ai-0.17.5.dev589/synth_ai/cli/dev_envs.py +0 -1162
- synth_ai-0.17.5.dev589/synth_ai/cli/research_factory_standup.py +0 -1429
- synth_ai-0.17.5.dev589/synth_ai/config.py +0 -8
- synth_ai-0.17.5.dev589/synth_ai/core/__init__.py +0 -61
- synth_ai-0.17.5.dev589/synth_ai/core/auth/__init__.py +0 -6
- synth_ai-0.17.5.dev589/synth_ai/core/auth/context.py +0 -23
- synth_ai-0.17.5.dev589/synth_ai/core/contracts/__init__.py +0 -17
- synth_ai-0.17.5.dev589/synth_ai/core/contracts/resources.py +0 -26
- synth_ai-0.17.5.dev589/synth_ai/core/utils/__init__.py +0 -67
- synth_ai-0.17.5.dev589/synth_ai/core/utils/dict.py +0 -25
- synth_ai-0.17.5.dev589/synth_ai/core/utils/env.py +0 -280
- synth_ai-0.17.5.dev589/synth_ai/core/utils/json.py +0 -62
- synth_ai-0.17.5.dev589/synth_ai/core/utils/paths.py +0 -107
- synth_ai-0.17.5.dev589/synth_ai/core/utils/secure_files.py +0 -45
- synth_ai-0.17.5.dev589/synth_ai/core/utils/workspace.py +0 -169
- synth_ai-0.17.5.dev589/synth_ai/mcp/research/objective_tools.py +0 -71
- synth_ai-0.17.5.dev589/synth_ai/mcp/research/registry.py +0 -298
- synth_ai-0.17.5.dev589/synth_ai/mcp/research/tools/cloud_deployments.py +0 -435
- synth_ai-0.17.5.dev589/synth_ai/mcp/research/tools/dev_environments.py +0 -445
- synth_ai-0.17.5.dev589/synth_ai/mcp/research/tools/tag.py +0 -178
- synth_ai-0.17.5.dev589/synth_ai/sdk/__init__.py +0 -13
- synth_ai-0.17.5.dev589/synth_ai/sdk/research/advanced_factories.py +0 -778
- synth_ai-0.17.5.dev589/synth_ai/sdk/research/enums.py +0 -25
- synth_ai-0.17.5.dev589/synth_ai/sdk/research/factory_plans/__init__.py +0 -1
- synth_ai-0.17.5.dev589/synth_ai/sdk/research/schemas/smr_openapi.yaml +0 -77570
- synth_ai-0.17.5.dev589/synth_ai/sdk/research/session/compat.py +0 -45
- synth_ai-0.17.5.dev589/synth_ai/sdk/research/session/credentials.py +0 -91
- synth_ai-0.17.5.dev589/synth_ai/sdk/research/session/integrations.py +0 -54
- synth_ai-0.17.5.dev589/synth_ai/sdk/research/session/py.typed +0 -1
- synth_ai-0.17.5.dev589/synth_ai/sdk/research/session/repos.py +0 -75
- synth_ai-0.17.5.dev589/synth_ai/sdk/research/transport/__init__.py +0 -21
- synth_ai-0.17.5.dev589/synth_ai/sdk/research/transport/retries.py +0 -15
- synth_ai-0.17.5.dev589/synth_ai/sdk/research/transport/streaming.py +0 -36
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/LICENSE +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/setup.cfg +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/cli/__init__.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/cli/__main__.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/cli/research.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/cli/research_environments.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/cli/research_image_releases.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/cli/research_projects.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/auth/credentials.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/contracts/json_value.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/http/__init__.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/http/async_transport.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/http/request.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/http/retry.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/http/streaming.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/__init__.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/__main__.py +0 -0
- /synth_ai-0.17.5.dev589/synth_ai/mcp/research/tools/smr_policy_schemas.py → /synth_ai-0.18.0.dev590/synth_ai/mcp/research/tools/policy_schemas.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/py.typed +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/__init__.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/_internal/__init__.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/_internal/crypto.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/_internal/env.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/_internal/urls.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/account.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/artifacts.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/auth.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/__init__.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/_activity_wire.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/_environment_wire.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/_transcript_wire.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/_wire.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/activity.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/activity_items.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/actor_images.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/billing.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/canonical_usage.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/checkpoints.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/cloud_deployment_claims.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/cloud_deployments.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/common.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/dataset_revisions.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/deliveries.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/dev_environment_evidence.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/economics.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/environment_manifest.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/environments.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/evidence.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/factories.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/factory_evidence.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/factory_lenses.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/factory_role_receipts.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/image_releases.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/local_execution_profile.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/operator_evidence.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/project.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/project_data.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/project_runtime.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/project_workspace.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/project_workspace_evidence.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/projects.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/promotions.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/research_intern.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_authority.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_diagnostics.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_execution.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_launch.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_observability.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_state.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_timeline.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/runtime_intent.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/runtime_stream.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/runtime_stream_snapshot.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/scientific_integrity.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_actor_models.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_actor_policy_data.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_agent_harnesses.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_agent_kinds.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_agent_models.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_branching.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_credential_providers.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_environment_kinds.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_evidence_obligations.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_funding_sources.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_horizons.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_host_kinds.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_inference_providers.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_network_topology.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_resource_kinds.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_roles.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_run_policy.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_runbooks.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_runnable_project.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_runtime_kinds.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_tool_providers.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_work_modes.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/status.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/swarms.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/tag.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/transcript.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/types.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/usage.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/wire_models.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/work_products.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/workspaces.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/efforts.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/environments.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/experiments.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/factory_storage.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/image_releases.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/knowledge.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/models.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/operations.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/project_data.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/project_deliveries.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/project_workspaces.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/readouts.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/research_intern.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/secrets.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/_base.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/approvals.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/billing.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/cloud_deployments.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/cost.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/datasets.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/environments.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/exports.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/factory_evidence.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/files.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/github.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/logs.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/models.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/outputs.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/progress.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/projects.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/prs.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/readiness.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/repositories.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/secrets.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/setup.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/tag.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/trained_models.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/work_products.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/workspace_inputs.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/traces.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/transport/pagination.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/version.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/wiki.py +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai.egg-info/dependency_links.txt +0 -0
- {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai.egg-info/top_level.txt +0 -0
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
include README.md
|
|
2
2
|
include LICENSE
|
|
3
3
|
recursive-include synth_ai *.py
|
|
4
|
-
|
|
5
|
-
recursive-include synth_ai *.toml
|
|
4
|
+
recursive-include synth_ai *.md
|
|
6
5
|
# Prune heavy example/demo/test/data trees from the sdist (keep code)
|
|
7
6
|
prune tests
|
|
8
7
|
prune private_tests
|
|
@@ -23,12 +22,6 @@ recursive-exclude synth_ai *.pth
|
|
|
23
22
|
recursive-exclude synth_ai *.bin
|
|
24
23
|
recursive-exclude synth_ai *.zip
|
|
25
24
|
recursive-exclude synth_ai *.tar
|
|
26
|
-
# The built-in Factory standup plans are lightweight runtime resources. Keep
|
|
27
|
-
# them in source and wheel distributions after excluding other JSON datasets.
|
|
28
|
-
recursive-include synth_ai/managed_research/factory_plans *.json
|
|
29
|
-
# The backend-authored public model registry is part of the vendored Research
|
|
30
|
-
# contract and must remain inspectable from an installed SDK.
|
|
31
|
-
include synth_ai/managed_research/schemas/public_models.json
|
|
32
25
|
global-exclude *.pyc
|
|
33
26
|
global-exclude __pycache__
|
|
34
27
|
global-exclude .DS_Store
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: synth-ai
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary: Python
|
|
3
|
+
Version: 0.18.0.dev590
|
|
4
|
+
Summary: Python SDK and CLI for Synth Managed Research and Research Factory
|
|
5
5
|
Author-email: Synth AI <josh@usesynth.ai>
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/synth-laboratories/synth-ai
|
|
@@ -14,10 +14,6 @@ Requires-Dist: pydantic>=2.0.0
|
|
|
14
14
|
Requires-Dist: pynacl>=1.5.0
|
|
15
15
|
Requires-Dist: click<8.2,>=8.1.7
|
|
16
16
|
Requires-Dist: httpx>=0.28.1
|
|
17
|
-
Provides-Extra: schemas
|
|
18
|
-
Provides-Extra: providers
|
|
19
|
-
Requires-Dist: anthropic>=0.42.0; extra == "providers"
|
|
20
|
-
Requires-Dist: google-genai>=1.26.0; extra == "providers"
|
|
21
17
|
Provides-Extra: dev
|
|
22
18
|
Requires-Dist: build>=1.2.2.post1; extra == "dev"
|
|
23
19
|
Requires-Dist: twine>=4.0.0; extra == "dev"
|
|
@@ -26,17 +22,12 @@ Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
|
26
22
|
Requires-Dist: papermill>=2.6.0; extra == "dev"
|
|
27
23
|
Requires-Dist: nest_asyncio>=1.6.0; extra == "dev"
|
|
28
24
|
Requires-Dist: mdxify>=0.2.0; extra == "dev"
|
|
29
|
-
Provides-Extra: all
|
|
30
|
-
Requires-Dist: anthropic>=0.42.0; extra == "all"
|
|
31
|
-
Requires-Dist: google-genai>=1.26.0; extra == "all"
|
|
32
|
-
Provides-Extra: analytics
|
|
33
|
-
Requires-Dist: pandas>=2.2.3; extra == "analytics"
|
|
34
25
|
Provides-Extra: research
|
|
35
26
|
Dynamic: license-file
|
|
36
27
|
|
|
37
28
|
# Synth AI SDK
|
|
38
29
|
|
|
39
|
-
<!-- CI release pins: PyPI-0.
|
|
30
|
+
<!-- CI release pins: PyPI-0.18.0-orange synth-ai==0.18.0 -->
|
|
40
31
|
|
|
41
32
|
[](https://pypi.org/project/synth-ai/)
|
|
42
33
|
[](https://pypi.org/project/synth-ai/)
|
|
@@ -85,7 +76,7 @@ The CLI also reads `SYNTH_BACKEND_URL` and accepts `--backend-url`.
|
|
|
85
76
|
|
|
86
77
|
```python
|
|
87
78
|
from synth_ai import SynthClient
|
|
88
|
-
from synth_ai.
|
|
79
|
+
from synth_ai.sdk.research.public import SwarmSpec
|
|
89
80
|
|
|
90
81
|
with SynthClient() as client:
|
|
91
82
|
swarm = client.research.swarms.create(
|
|
@@ -126,7 +117,7 @@ Create a durable project when work needs reusable configuration:
|
|
|
126
117
|
|
|
127
118
|
```python
|
|
128
119
|
from synth_ai import SynthClient
|
|
129
|
-
from synth_ai.
|
|
120
|
+
from synth_ai.sdk.research.public import EnvironmentKind, ProjectSpec, RuntimeKind, SwarmSpec
|
|
130
121
|
|
|
131
122
|
with SynthClient() as client:
|
|
132
123
|
project = client.research.projects.create(
|
|
@@ -151,7 +142,7 @@ parity:
|
|
|
151
142
|
|
|
152
143
|
```python
|
|
153
144
|
from synth_ai import SynthClient
|
|
154
|
-
from synth_ai.
|
|
145
|
+
from synth_ai.sdk.research.public import EffortSpec, FactorySpec, ProjectId
|
|
155
146
|
|
|
156
147
|
with SynthClient() as client:
|
|
157
148
|
factory = client.research.factories.create(
|
|
@@ -194,8 +185,8 @@ Use `SynthClient` as the front door:
|
|
|
194
185
|
| **Research / Factory** | `client.research` | Typed hosted projects, swarms, Factory lifecycles, and Efforts. |
|
|
195
186
|
| CLI | `synth-ai` | Terminal access to Research commands. |
|
|
196
187
|
|
|
197
|
-
|
|
198
|
-
|
|
188
|
+
There are no infrastructure client namespaces (containers, tunnels, pools) on
|
|
189
|
+
`SynthClient`; the package is Research-only as of 0.18.0.
|
|
199
190
|
|
|
200
191
|
Use [Managed Research](https://docs.usesynth.ai/managed-research/intro) when you
|
|
201
192
|
want hosted research workers, repo runs, evidence, checkpoints, MCP, or final
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Synth AI SDK
|
|
2
2
|
|
|
3
|
-
<!-- CI release pins: PyPI-0.
|
|
3
|
+
<!-- CI release pins: PyPI-0.18.0-orange synth-ai==0.18.0 -->
|
|
4
4
|
|
|
5
5
|
[](https://pypi.org/project/synth-ai/)
|
|
6
6
|
[](https://pypi.org/project/synth-ai/)
|
|
@@ -49,7 +49,7 @@ The CLI also reads `SYNTH_BACKEND_URL` and accepts `--backend-url`.
|
|
|
49
49
|
|
|
50
50
|
```python
|
|
51
51
|
from synth_ai import SynthClient
|
|
52
|
-
from synth_ai.
|
|
52
|
+
from synth_ai.sdk.research.public import SwarmSpec
|
|
53
53
|
|
|
54
54
|
with SynthClient() as client:
|
|
55
55
|
swarm = client.research.swarms.create(
|
|
@@ -90,7 +90,7 @@ Create a durable project when work needs reusable configuration:
|
|
|
90
90
|
|
|
91
91
|
```python
|
|
92
92
|
from synth_ai import SynthClient
|
|
93
|
-
from synth_ai.
|
|
93
|
+
from synth_ai.sdk.research.public import EnvironmentKind, ProjectSpec, RuntimeKind, SwarmSpec
|
|
94
94
|
|
|
95
95
|
with SynthClient() as client:
|
|
96
96
|
project = client.research.projects.create(
|
|
@@ -115,7 +115,7 @@ parity:
|
|
|
115
115
|
|
|
116
116
|
```python
|
|
117
117
|
from synth_ai import SynthClient
|
|
118
|
-
from synth_ai.
|
|
118
|
+
from synth_ai.sdk.research.public import EffortSpec, FactorySpec, ProjectId
|
|
119
119
|
|
|
120
120
|
with SynthClient() as client:
|
|
121
121
|
factory = client.research.factories.create(
|
|
@@ -158,8 +158,8 @@ Use `SynthClient` as the front door:
|
|
|
158
158
|
| **Research / Factory** | `client.research` | Typed hosted projects, swarms, Factory lifecycles, and Efforts. |
|
|
159
159
|
| CLI | `synth-ai` | Terminal access to Research commands. |
|
|
160
160
|
|
|
161
|
-
|
|
162
|
-
|
|
161
|
+
There are no infrastructure client namespaces (containers, tunnels, pools) on
|
|
162
|
+
`SynthClient`; the package is Research-only as of 0.18.0.
|
|
163
163
|
|
|
164
164
|
Use [Managed Research](https://docs.usesynth.ai/managed-research/intro) when you
|
|
165
165
|
want hosted research workers, repo runs, evidence, checkpoints, MCP, or final
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "synth-ai"
|
|
3
|
-
version = "0.
|
|
4
|
-
description = "Python
|
|
3
|
+
version = "0.18.0.dev590"
|
|
4
|
+
description = "Python SDK and CLI for Synth Managed Research and Research Factory"
|
|
5
5
|
authors = [{name = "Synth AI", email = "josh@usesynth.ai"}]
|
|
6
6
|
license = "MIT"
|
|
7
7
|
license-files = ["LICENSE"]
|
|
@@ -18,15 +18,8 @@ dependencies = [
|
|
|
18
18
|
[project.scripts]
|
|
19
19
|
synth-ai = "synth_ai.cli:cli"
|
|
20
20
|
synth-ai-research-mcp = "synth_ai.mcp.research.server:main"
|
|
21
|
-
synth-ai-research-factory-standup = "synth_ai.cli.research_factory_standup:main"
|
|
22
21
|
|
|
23
22
|
[project.optional-dependencies]
|
|
24
|
-
schemas = []
|
|
25
|
-
providers = [
|
|
26
|
-
# Optional LLM providers (lazy-loaded when used)
|
|
27
|
-
"anthropic>=0.42.0",
|
|
28
|
-
"google-genai>=1.26.0",
|
|
29
|
-
]
|
|
30
23
|
dev = [
|
|
31
24
|
"build>=1.2.2.post1",
|
|
32
25
|
"twine>=4.0.0",
|
|
@@ -36,14 +29,6 @@ dev = [
|
|
|
36
29
|
"nest_asyncio>=1.6.0",
|
|
37
30
|
"mdxify>=0.2.0",
|
|
38
31
|
]
|
|
39
|
-
all = [
|
|
40
|
-
# Include providers
|
|
41
|
-
"anthropic>=0.42.0",
|
|
42
|
-
"google-genai>=1.26.0",
|
|
43
|
-
]
|
|
44
|
-
analytics = [
|
|
45
|
-
"pandas>=2.2.3",
|
|
46
|
-
]
|
|
47
32
|
research = [
|
|
48
33
|
# Compatibility extra retained so `synth-ai[research]` remains valid.
|
|
49
34
|
]
|
|
@@ -73,8 +58,6 @@ include-package-data = true
|
|
|
73
58
|
|
|
74
59
|
[tool.setuptools.exclude-package-data]
|
|
75
60
|
"synth_ai" = [
|
|
76
|
-
# Exclude heavy data inside agent_demos/old/tests
|
|
77
|
-
"**/agent_demos/**",
|
|
78
61
|
"**/tests/**",
|
|
79
62
|
"**/units/**",
|
|
80
63
|
]
|
|
@@ -82,12 +65,6 @@ include-package-data = true
|
|
|
82
65
|
[tool.setuptools.package-data]
|
|
83
66
|
"synth_ai" = [
|
|
84
67
|
"py.typed",
|
|
85
|
-
# Research moved core/research -> sdk/research (see unify_sdk_layering.md).
|
|
86
|
-
# These globs are the only thing that puts the factory plans and vendored
|
|
87
|
-
# schemas into the wheel; a stale path here ships a package that imports and
|
|
88
|
-
# then fails at runtime looking for data files.
|
|
89
|
-
"sdk/research/factory_plans/*.json",
|
|
90
|
-
"sdk/research/schemas/*",
|
|
91
68
|
]
|
|
92
69
|
|
|
93
70
|
[tool.ruff]
|
|
@@ -124,19 +101,11 @@ ignore = [
|
|
|
124
101
|
]
|
|
125
102
|
|
|
126
103
|
[tool.ruff.lint.per-file-ignores]
|
|
127
|
-
"synth_ai/http.py" = ["F403"]
|
|
128
104
|
"**/__init__.py" = ["N999"]
|
|
129
105
|
"**/__main__.py" = ["N999"]
|
|
130
106
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
# The _legacy tree this override named was deleted when the compatibility
|
|
135
|
-
# packages were retired; check_research_migration_boundaries.py now asserts its
|
|
136
|
-
# absence. Nothing to override.
|
|
137
|
-
|
|
138
|
-
[tool.ty.rules]
|
|
139
|
-
possibly-missing-attribute = "ignore"
|
|
107
|
+
# Type-check configuration lives in ty.toml, which takes precedence over any
|
|
108
|
+
# [tool.ty.*] here.
|
|
140
109
|
|
|
141
110
|
[dependency-groups]
|
|
142
111
|
dev = [
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# `synth_ai` Package
|
|
2
|
+
|
|
3
|
+
Runtime package for the public Synth AI SDK and CLI.
|
|
4
|
+
|
|
5
|
+
The public first-mile surface is intentionally small:
|
|
6
|
+
|
|
7
|
+
- `SynthClient`
|
|
8
|
+
- `AsyncSynthClient`
|
|
9
|
+
- `client.research`
|
|
10
|
+
- `synth-ai` CLI
|
|
11
|
+
|
|
12
|
+
Public docs live at https://docs.usesynth.ai/sdk/overview.
|
|
13
|
+
|
|
14
|
+
## Package Structure
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
synth_ai/
|
|
18
|
+
├── client.py # SynthClient and AsyncSynthClient composition layer
|
|
19
|
+
├── sdk/ # Research + shared pagination plumbing
|
|
20
|
+
├── core/ # Shared runtime helpers and errors
|
|
21
|
+
├── cli/ # CLI commands for research (and local helpers)
|
|
22
|
+
└── __init__.py # Package version and top-level exports
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Dependency Direction
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
core/ -> sdk/ -> client.py -> cli/
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
- `core/` owns shared runtime plumbing such as errors, environment lookup, and URL normalization.
|
|
32
|
+
- `sdk/` owns Research clients/contracts plus shared pagination helpers.
|
|
33
|
+
- `client.py` composes Research behind `SynthClient` and `AsyncSynthClient`.
|
|
34
|
+
- `cli/` wraps the SDK for terminal use.
|
|
35
|
+
|
|
36
|
+
## Supported Imports
|
|
37
|
+
|
|
38
|
+
Prefer the front-door client and the hero nouns:
|
|
39
|
+
|
|
40
|
+
```python
|
|
41
|
+
from synth_ai import SynthClient
|
|
42
|
+
|
|
43
|
+
research = SynthClient().research
|
|
44
|
+
project = research.projects.create(request)
|
|
45
|
+
swarm = research.swarms.create(project.project_id, request=launch)
|
|
46
|
+
swarm.wait()
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`research.advanced.*` exists but is explicitly unstable operator surface; do
|
|
50
|
+
not build against it as if it were the public story.
|
|
51
|
+
|
|
52
|
+
## Layering
|
|
53
|
+
|
|
54
|
+
One DAG, enforced by `check_sdk_layering.py` in the sibling `testing` repo.
|
|
55
|
+
See `unify_sdk_layering.md` for the rationale.
|
|
56
|
+
|
|
57
|
+
```text
|
|
58
|
+
core/ plumbing only: auth, http, errors, utils, generic contracts
|
|
59
|
+
|
|
|
60
|
+
v
|
|
61
|
+
sdk/ Research + pagination
|
|
62
|
+
|
|
|
63
|
+
v
|
|
64
|
+
client.py SynthClient / AsyncSynthClient composition
|
|
65
|
+
|
|
|
66
|
+
+--> cli/ thin terminal adapter
|
|
67
|
+
+--> mcp/research/ thin MCP adapter
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
| From \ To | `core` | `sdk` | `client` | `cli` | `mcp` |
|
|
71
|
+
|-----------|--------|-------|----------|-------|-------|
|
|
72
|
+
| `core` | yes | **no** | no | no | no |
|
|
73
|
+
| `sdk` | yes | yes | no | no | no |
|
|
74
|
+
| `client` | yes | yes | — | no | no |
|
|
75
|
+
| `cli` | yes | yes | yes | — | no |
|
|
76
|
+
| `mcp` | yes | yes | preferred yes | no | — |
|
|
77
|
+
|
|
78
|
+
`core/` must not import `sdk/`: plumbing cannot depend on the clients built on
|
|
79
|
+
top of it. Peer imports inside a layer are fine.
|
|
80
|
+
|
|
81
|
+
## Guidelines for New Code
|
|
82
|
+
|
|
83
|
+
1. Put shared errors, URL handling, and environment helpers in `core/`.
|
|
84
|
+
2. Put Research contracts, clients, and operator session surfaces in `sdk/research/`.
|
|
85
|
+
3. Put front-door composition in `client.py`.
|
|
86
|
+
4. Put terminal commands in `cli/`.
|
|
87
|
+
5. Keep unreleased or archived infra APIs out of public README examples.
|
|
@@ -13,14 +13,11 @@ from importlib.metadata import PackageNotFoundError as _PackageNotFoundError
|
|
|
13
13
|
from pathlib import Path as _Path
|
|
14
14
|
from typing import Any as _Any
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
)
|
|
16
|
+
from synth_ai.core.utils.log_filter import (
|
|
17
|
+
install_log_filter as _install_log_filter,
|
|
18
|
+
)
|
|
20
19
|
|
|
21
|
-
|
|
22
|
-
except Exception:
|
|
23
|
-
pass
|
|
20
|
+
_install_log_filter()
|
|
24
21
|
|
|
25
22
|
try:
|
|
26
23
|
__version__ = _metadata.version("synth-ai")
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
CLI structure notes (for coding agents)
|
|
2
|
+
|
|
3
|
+
- Keep `synth_ai/cli/` flat: one file per command, filename == command name.
|
|
4
|
+
- Each command file holds Click wiring (options/args/validation/routing).
|
|
5
|
+
- Business logic lives in `synth_ai/sdk/` (reusable) or `synth_ai/core/` (internal).
|
|
6
|
+
- CLI-only helpers may live in `synth_ai/cli/lib/` or `synth_ai/cli/utils/` only.
|
|
7
|
+
- No shims/wrappers: do not duplicate modules across folders or re-export commands.
|
|
8
|
+
- Avoid heavy module-level imports in CLI; import inside functions for lazy load.
|
|
9
|
+
- Use Click conventions; no surprising CLI behavior.
|
|
10
|
+
|
|
11
|
+
## Incident Log Requirement
|
|
12
|
+
|
|
13
|
+
When you hit a Synth code bug or local dev setup issue, append a timestamped entry to `specifications/issues_log/YYYY-MM-DD.md` in the sibling `testing/` repo before finishing.
|
|
14
|
+
|
|
15
|
+
Use this one-line format:
|
|
16
|
+
`- [YYYY-MM-DD HH:MM:SS TZ] <repo/path> — <issue> — <impact> — <action/status>`
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# CLI Modules
|
|
2
|
+
|
|
3
|
+
Thin Click adapters over `SynthClient` / `sdk.research`.
|
|
4
|
+
|
|
5
|
+
`synth-ai research` is the whole CLI. Infrastructure commands (`containers`,
|
|
6
|
+
`tunnels`, `pools`) and the operator consoles (`dev-envs`, the
|
|
7
|
+
`synth-ai-research-factory-standup` script) were removed in 0.18.0; see
|
|
8
|
+
`CHANGELOG.md` for what replaced each one.
|
|
9
|
+
|
|
10
|
+
## Command Structure
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
synth-ai research --help
|
|
14
|
+
synth-ai research projects ...
|
|
15
|
+
synth-ai research swarms ...
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Import Rules
|
|
19
|
+
|
|
20
|
+
```python
|
|
21
|
+
# CLI importing from SDK (correct)
|
|
22
|
+
from synth_ai import SynthClient
|
|
23
|
+
|
|
24
|
+
# CLI importing from core (correct)
|
|
25
|
+
from synth_ai.core.utils.env import get_api_key
|
|
26
|
+
|
|
27
|
+
# SDK importing from CLI (wrong - never do this)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Relationship to Other Modules
|
|
31
|
+
|
|
32
|
+
| Module | Relationship |
|
|
33
|
+
|--------|--------------|
|
|
34
|
+
| `core/` | `cli/` imports shared env/error helpers |
|
|
35
|
+
| `sdk/` / `client.py` | Business calls go through Research clients |
|
|
@@ -24,9 +24,8 @@ def _resolve_base_url(base_url: str | None) -> str:
|
|
|
24
24
|
class SynthClient:
|
|
25
25
|
"""Sync client for Managed Research.
|
|
26
26
|
|
|
27
|
-
Use ``research`` for hosted projects, swarms, and Factory lifecycles.
|
|
28
|
-
|
|
29
|
-
``old/sdk/`` and are not composed here.
|
|
27
|
+
Use ``research`` for hosted projects, swarms, and Factory lifecycles. That
|
|
28
|
+
is the whole client: there is no container, tunnel, or pool namespace.
|
|
30
29
|
"""
|
|
31
30
|
|
|
32
31
|
def __init__(
|
|
@@ -34,11 +33,11 @@ class SynthClient:
|
|
|
34
33
|
*,
|
|
35
34
|
api_key: str | None = None,
|
|
36
35
|
base_url: str | None = None,
|
|
37
|
-
|
|
36
|
+
timeout_seconds: float = 30.0,
|
|
38
37
|
) -> None:
|
|
39
38
|
self.api_key = _resolve_api_key(api_key)
|
|
40
39
|
self.base_url = _resolve_base_url(base_url)
|
|
41
|
-
self.
|
|
40
|
+
self.timeout_seconds = timeout_seconds
|
|
42
41
|
self._research_client: ResearchClient | None = None
|
|
43
42
|
|
|
44
43
|
@property
|
|
@@ -50,7 +49,7 @@ class SynthClient:
|
|
|
50
49
|
self._research_client = ResearchClient(
|
|
51
50
|
api_key=self.api_key,
|
|
52
51
|
base_url=self.base_url,
|
|
53
|
-
timeout_seconds=self.
|
|
52
|
+
timeout_seconds=self.timeout_seconds,
|
|
54
53
|
)
|
|
55
54
|
return self._research_client
|
|
56
55
|
|
|
@@ -58,6 +57,7 @@ class SynthClient:
|
|
|
58
57
|
"""Close all lazily opened SDK transports."""
|
|
59
58
|
if self._research_client is not None:
|
|
60
59
|
self._research_client.close()
|
|
60
|
+
self._research_client = None
|
|
61
61
|
|
|
62
62
|
def __enter__(self) -> SynthClient:
|
|
63
63
|
return self
|
|
@@ -74,11 +74,11 @@ class AsyncSynthClient:
|
|
|
74
74
|
*,
|
|
75
75
|
api_key: str | None = None,
|
|
76
76
|
base_url: str | None = None,
|
|
77
|
-
|
|
77
|
+
timeout_seconds: float = 30.0,
|
|
78
78
|
) -> None:
|
|
79
79
|
self.api_key = _resolve_api_key(api_key)
|
|
80
80
|
self.base_url = _resolve_base_url(base_url)
|
|
81
|
-
self.
|
|
81
|
+
self.timeout_seconds = timeout_seconds
|
|
82
82
|
self._async_research_client: AsyncResearchClient | None = None
|
|
83
83
|
|
|
84
84
|
@property
|
|
@@ -90,7 +90,7 @@ class AsyncSynthClient:
|
|
|
90
90
|
self._async_research_client = AsyncResearchClient(
|
|
91
91
|
api_key=self.api_key,
|
|
92
92
|
base_url=self.base_url,
|
|
93
|
-
timeout_seconds=self.
|
|
93
|
+
timeout_seconds=self.timeout_seconds,
|
|
94
94
|
)
|
|
95
95
|
return self._async_research_client
|
|
96
96
|
|
|
@@ -108,6 +108,7 @@ class AsyncSynthClient:
|
|
|
108
108
|
"""Close all asynchronous Research transports."""
|
|
109
109
|
if self._async_research_client is not None:
|
|
110
110
|
await self._async_research_client.close()
|
|
111
|
+
self._async_research_client = None
|
|
111
112
|
|
|
112
113
|
async def __aenter__(self) -> AsyncSynthClient:
|
|
113
114
|
return self
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Core Modules
|
|
2
|
+
|
|
3
|
+
Shared runtime plumbing for the Synth AI SDK — and nothing else.
|
|
4
|
+
|
|
5
|
+
`core/` is the bottom of the layering DAG (see `../README.md` and
|
|
6
|
+
`unify_sdk_layering.md`). It may import only from `core/`. In particular it must
|
|
7
|
+
not import `sdk/`: plumbing cannot depend on the clients built on top of it.
|
|
8
|
+
`check_sdk_layering.py` in the sibling `testing` repo enforces this.
|
|
9
|
+
|
|
10
|
+
## Structure
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
core/
|
|
14
|
+
├── __init__.py # Internal exports
|
|
15
|
+
├── auth/ # Credentials and auth context
|
|
16
|
+
├── http/ # Transport, request, retry
|
|
17
|
+
├── errors.py # Error types and handling
|
|
18
|
+
├── contracts/ # Generic JSON/error contracts only
|
|
19
|
+
├── utils/ # General utilities
|
|
20
|
+
└── research/ # DEPRECATED alias -> synth_ai.sdk.research
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`core/research/` is no longer an implementation tree. Research moved to
|
|
24
|
+
`sdk/research/` so that `core/` means one thing; what remains is an import alias
|
|
25
|
+
that forwards and warns, scheduled for deletion once sibling repos are clean.
|
|
26
|
+
Do not add modules there.
|
|
27
|
+
|
|
28
|
+
## Guidelines for Additions
|
|
29
|
+
|
|
30
|
+
### DO add to `core/` if:
|
|
31
|
+
|
|
32
|
+
1. **It's shared infrastructure** - Used by multiple live modules
|
|
33
|
+
2. **It's internal implementation** - Not meant for direct user consumption
|
|
34
|
+
3. **It's runtime plumbing** - Errors, URL resolution, env helpers
|
|
35
|
+
4. **It's a utility** - Helpers used by the narrowed live SDK
|
|
36
|
+
|
|
37
|
+
### DO NOT add to `core/` if:
|
|
38
|
+
|
|
39
|
+
1. **It's a user-facing API** - Put it in `sdk/`
|
|
40
|
+
2. **It's CLI-specific** - Put it in `cli/`
|
|
41
|
+
3. **It's a public client** - Put it in `sdk/` or `client.py`
|
|
42
|
+
4. **It's outside the public SDK runtime** - keep it out of `core/` unless it is required by supported live flows
|
|
43
|
+
|
|
44
|
+
## Module Descriptions
|
|
45
|
+
|
|
46
|
+
### `errors.py`
|
|
47
|
+
Custom exception types and error handling utilities.
|
|
48
|
+
|
|
49
|
+
### `utils/`
|
|
50
|
+
General-purpose utilities for environment lookup, URLs, JSON helpers, and secure file handling.
|
|
51
|
+
|
|
52
|
+
## Import Rules
|
|
53
|
+
|
|
54
|
+
- `core/` should NOT import from `sdk/` or `cli/`
|
|
55
|
+
- Internal modules should not be imported directly by users unless explicitly documented
|
|
56
|
+
|
|
57
|
+
```python
|
|
58
|
+
# Supported internal usage
|
|
59
|
+
from synth_ai.core.errors import SynthError
|
|
60
|
+
from synth_ai.core.utils.env import get_api_key
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Relationship to Other Modules
|
|
64
|
+
|
|
65
|
+
| Module | Relationship |
|
|
66
|
+
|--------|--------------|
|
|
67
|
+
| `sdk/` | `sdk/` imports from `core/` for runtime helpers |
|
|
68
|
+
| `cli/` | `cli/` imports from `core/` for shared errors and env utilities |
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"""Shared plumbing: errors, HTTP, auth, and typed contracts.
|
|
2
|
+
|
|
3
|
+
``core/`` is what every public client is built on and is not itself a public
|
|
4
|
+
client -- Research lives in ``synth_ai/sdk/research``. Import from the owning
|
|
5
|
+
submodule (``synth_ai.core.errors``, ``synth_ai.core.http.retry``, ...); this
|
|
6
|
+
package re-exports nothing.
|
|
7
|
+
"""
|
|
@@ -2,26 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from
|
|
6
|
-
from typing import Generic, Mapping, TypeVar
|
|
5
|
+
from typing import Mapping
|
|
7
6
|
|
|
8
7
|
from synth_ai.core.contracts.json_value import JsonValue
|
|
9
8
|
|
|
10
|
-
ItemT = TypeVar("ItemT")
|
|
11
|
-
|
|
12
9
|
|
|
13
10
|
class PageCursor(str):
|
|
14
11
|
"""Opaque cursor returned by the backend."""
|
|
15
12
|
|
|
16
13
|
|
|
17
|
-
@dataclass(frozen=True, slots=True)
|
|
18
|
-
class Page(Generic[ItemT]):
|
|
19
|
-
"""One immutable page of typed resources."""
|
|
20
|
-
|
|
21
|
-
items: tuple[ItemT, ...]
|
|
22
|
-
next_cursor: PageCursor | None = None
|
|
23
|
-
|
|
24
|
-
|
|
25
14
|
def build_query_params(**values: JsonValue) -> dict[str, JsonValue]:
|
|
26
15
|
"""Drop only absent or blank-string query values."""
|
|
27
16
|
|
|
@@ -43,4 +32,4 @@ def extract_next_cursor(payload: Mapping[str, object]) -> PageCursor | None:
|
|
|
43
32
|
return PageCursor(value.strip())
|
|
44
33
|
|
|
45
34
|
|
|
46
|
-
__all__ = ["
|
|
35
|
+
__all__ = ["PageCursor", "build_query_params", "extract_next_cursor"]
|