synth-ai 0.16.1.dev0__tar.gz → 0.16.1.dev1__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.16.1.dev0/synth_ai.egg-info → synth_ai-0.16.1.dev1}/PKG-INFO +79 -77
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/README.md +78 -76
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/pyproject.toml +6 -10
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/__init__.py +26 -24
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/cli/dev_envs.py +2 -2
- synth_ai-0.16.1.dev1/synth_ai/cli/research.py +364 -0
- synth_ai-0.16.1.dev1/synth_ai/cli/research_environments.py +143 -0
- synth_ai-0.16.1.dev0/synth_ai/managed_research/factory_standup.py → synth_ai-0.16.1.dev1/synth_ai/cli/research_factory_standup.py +7 -7
- synth_ai-0.16.1.dev1/synth_ai/cli/research_image_releases.py +149 -0
- synth_ai-0.16.1.dev1/synth_ai/cli/research_projects.py +405 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/client.py +52 -22
- synth_ai-0.16.1.dev1/synth_ai/config.py +8 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/__init__.py +22 -0
- synth_ai-0.16.1.dev1/synth_ai/core/auth/__init__.py +6 -0
- synth_ai-0.16.1.dev1/synth_ai/core/auth/context.py +23 -0
- synth_ai-0.16.1.dev1/synth_ai/core/auth/credentials.py +42 -0
- synth_ai-0.16.1.dev1/synth_ai/core/contracts/__init__.py +17 -0
- synth_ai-0.16.1.dev1/synth_ai/core/contracts/json_value.py +13 -0
- synth_ai-0.16.1.dev1/synth_ai/core/contracts/pagination.py +46 -0
- synth_ai-0.16.1.dev1/synth_ai/core/contracts/resources.py +26 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/errors.py +160 -12
- synth_ai-0.16.1.dev1/synth_ai/core/http/__init__.py +19 -0
- synth_ai-0.16.1.dev1/synth_ai/core/http/async_transport.py +177 -0
- synth_ai-0.16.1.dev1/synth_ai/core/http/request.py +46 -0
- synth_ai-0.16.1.dev1/synth_ai/core/http/response.py +20 -0
- synth_ai-0.16.1.dev1/synth_ai/core/http/retry.py +117 -0
- synth_ai-0.16.1.dev1/synth_ai/core/http/streaming.py +93 -0
- synth_ai-0.16.1.dev1/synth_ai/core/http/transport.py +414 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/__init__.py +16 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/_internal/__init__.py +12 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/advanced.py +107 -0
- synth_ai-0.16.1.dev0/synth_ai/research/factories.py → synth_ai-0.16.1.dev1/synth_ai/core/research/advanced_factories.py +11 -11
- synth_ai-0.16.1.dev0/synth_ai/research/runs.py → synth_ai-0.16.1.dev1/synth_ai/core/research/advanced_swarms.py +76 -40
- synth_ai-0.16.1.dev0/synth_ai/research/hosted_artifacts.py → synth_ai-0.16.1.dev1/synth_ai/core/research/artifacts.py +1 -3
- synth_ai-0.16.1.dev1/synth_ai/core/research/auth.py +12 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/client.py +156 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/__init__.py +581 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/_activity_wire.py +63 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/_environment_wire.py +136 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/_transcript_wire.py +147 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/_wire.py +78 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/activity.py +369 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/activity_items.py +406 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/billing.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/canonical_usage.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/cloud_deployment_claims.py +1 -1
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/common.py +149 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/dev_environment_evidence.py +2 -2
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/economics.py +36 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/environment_manifest.py +510 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/environments.py +312 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/evidence.py +378 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/factories.py +774 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/factory_evidence.py +9 -9
- synth_ai-0.16.1.dev0/synth_ai/managed_research/models/factories.py → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/factory_operations.py +89 -4
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/image_releases.py +1223 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/project.py +1 -1
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/project_data.py +492 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/projects.py +194 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/promotions.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_control.py +2 -2
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_events.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_launch.py +27 -19
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_observability.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_state.py +5 -5
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_timeline.py +4 -62
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/runtime_intent.py +1 -1
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/runtime_stream.py +146 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/runtime_stream_snapshot.py +368 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_actor_models.py +8 -5
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_actor_policy_data.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_agent_harnesses.py +3 -3
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/smr_branching.py +82 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_inference_providers.py +4 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_providers.py +29 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_roles.py +4 -4
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_run_policy.py +4 -4
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_runbooks.py +2 -2
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/smr_runnable_project.py +239 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/status.py +516 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/swarms.py +1393 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/transcript.py +458 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/types.py +7 -238
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/usage.py +420 -0
- synth_ai-0.16.1.dev0/synth_ai/managed_research/models/__init__.py → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/wire_models.py +78 -69
- synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/workspaces.py +950 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/economics.py +167 -0
- {synth_ai-0.16.1.dev0/synth_ai → synth_ai-0.16.1.dev1/synth_ai/core}/research/efforts.py +12 -10
- {synth_ai-0.16.1.dev0/synth_ai → synth_ai-0.16.1.dev1/synth_ai/core}/research/enums.py +2 -2
- synth_ai-0.16.1.dev1/synth_ai/core/research/environments.py +240 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/errors.py +80 -18
- synth_ai-0.16.1.dev1/synth_ai/core/research/events.py +35 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/facade.py +155 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/factories.py +907 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/image_releases.py +220 -0
- {synth_ai-0.16.1.dev0/synth_ai → synth_ai-0.16.1.dev1/synth_ai/core}/research/models.py +37 -45
- synth_ai-0.16.1.dev1/synth_ai/core/research/operations.py +360 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/project_data.py +307 -0
- {synth_ai-0.16.1.dev0/synth_ai → synth_ai-0.16.1.dev1/synth_ai/core}/research/project_namespaces.py +25 -30
- synth_ai-0.16.1.dev1/synth_ai/core/research/project_workspaces.py +342 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/projects.py +383 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/public.py +595 -0
- synth_ai-0.16.1.dev0/synth_ai/research/run_readouts.py → synth_ai-0.16.1.dev1/synth_ai/core/research/readouts.py +13 -20
- {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/schema_sync.py +32 -6
- {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/schemas/smr_openapi.yaml +3952 -297
- {synth_ai-0.16.1.dev0/synth_ai → synth_ai-0.16.1.dev1/synth_ai/core}/research/secrets.py +1 -3
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/__init__.py +104 -94
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/_base.py +2 -2
- synth_ai-0.16.1.dev1/synth_ai/core/research/session/_client_helpers.py +191 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/_run_authority_mixin.py +18 -14
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/approvals.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/billing.py +3 -3
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/client.py +153 -204
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/cloud_deployments.py +6 -6
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/compat.py +6 -6
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/config.py +4 -8
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/cost.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/credentials.py +2 -2
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/datasets.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/dev_environments.py +4 -4
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/environments.py +2 -2
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/exports.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/factories.py +11 -9
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/factory_evidence.py +2 -2
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/files.py +2 -2
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/github.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/image_releases.py +125 -63
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/images.py +385 -23
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/integrations.py +2 -2
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/launch.py +14 -11
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/logs.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/models.py +1 -1
- synth_ai-0.16.1.dev1/synth_ai/core/research/session/namespaces/__init__.py +53 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/outputs.py +2 -2
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/progress.py +2 -2
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/project.py +7 -7
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/projects.py +9 -6
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/promotions.py +2 -2
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/prs.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/readiness.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/repos.py +3 -3
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/repositories.py +2 -2
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/runs.py +60 -24
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/secrets.py +2 -2
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/setup.py +2 -2
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/tag.py +2 -2
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/trained_models.py +2 -2
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/transport.py +2 -2
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/usage.py +3 -3
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/work_products.py +3 -3
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/workspace_inputs.py +2 -2
- synth_ai-0.16.1.dev1/synth_ai/core/research/swarms.py +1112 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/transport/__init__.py +21 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/transport/http.py +59 -101
- synth_ai-0.16.1.dev1/synth_ai/core/research/transport/pagination.py +7 -0
- synth_ai-0.16.1.dev1/synth_ai/core/research/transport/streaming.py +36 -0
- {synth_ai-0.16.1.dev0/synth_ai → synth_ai-0.16.1.dev1/synth_ai/core}/research/visuals.py +1 -3
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/workspace.py +1 -1
- synth_ai-0.16.1.dev1/synth_ai/mcp/research/__init__.py +5 -0
- synth_ai-0.16.1.dev1/synth_ai/mcp/research/__main__.py +6 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/registry.py +26 -19
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/request_models.py +32 -40
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/server.py +220 -250
- synth_ai-0.16.1.dev1/synth_ai/mcp/research/tools/__init__.py +43 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/approvals.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/artifacts.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/cloud_deployments.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/datasets.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/dev_environments.py +1 -1
- synth_ai-0.16.1.dev1/synth_ai/mcp/research/tools/environments.py +205 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/exports.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/factories.py +7 -7
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/factory_results.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/files.py +2 -2
- synth_ai-0.16.1.dev1/synth_ai/mcp/research/tools/image_releases.py +131 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/integrations.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/logs.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/models.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/outputs.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/progress.py +30 -10
- synth_ai-0.16.1.dev1/synth_ai/mcp/research/tools/project_data.py +256 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/projects.py +9 -363
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/prs.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/readiness.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/repos.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/resources.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/runs.py +149 -52
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/smr_policy_schemas.py +6 -4
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/tag.py +2 -2
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/trained_models.py +1 -1
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/usage.py +1 -1
- synth_ai-0.16.1.dev1/synth_ai/mcp/research/tools/workspace_inputs.py +199 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/base.py +53 -43
- synth_ai-0.16.1.dev1/synth_ai/sdk/containers.py +307 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/pools.py +135 -9
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1/synth_ai.egg-info}/PKG-INFO +79 -77
- synth_ai-0.16.1.dev1/synth_ai.egg-info/SOURCES.txt +266 -0
- synth_ai-0.16.1.dev1/synth_ai.egg-info/entry_points.txt +4 -0
- synth_ai-0.16.1.dev0/synth_ai/cli/research.py +0 -125
- synth_ai-0.16.1.dev0/synth_ai/gamebench/__init__.py +0 -30
- synth_ai-0.16.1.dev0/synth_ai/gamebench/client.py +0 -206
- synth_ai-0.16.1.dev0/synth_ai/gamebench/models.py +0 -512
- synth_ai-0.16.1.dev0/synth_ai/managed_research/__init__.py +0 -959
- synth_ai-0.16.1.dev0/synth_ai/managed_research/_internal/__init__.py +0 -12
- synth_ai-0.16.1.dev0/synth_ai/managed_research/auth.py +0 -12
- synth_ai-0.16.1.dev0/synth_ai/managed_research/client.py +0 -5
- synth_ai-0.16.1.dev0/synth_ai/managed_research/factory_plans/rsi_synth_on_synth.plan.json +0 -537
- synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp/__init__.py +0 -5
- synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp/__main__.py +0 -6
- synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp/tools/__init__.py +0 -37
- synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp/tools/open_research.py +0 -360
- synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp/tools/workspace_inputs.py +0 -71
- synth_ai-0.16.1.dev0/synth_ai/managed_research/models/generated/__init__.py +0 -3
- synth_ai-0.16.1.dev0/synth_ai/managed_research/models/generated/v1/__init__.py +0 -21
- synth_ai-0.16.1.dev0/synth_ai/managed_research/open_research/__init__.py +0 -49
- synth_ai-0.16.1.dev0/synth_ai/managed_research/open_research/client.py +0 -340
- synth_ai-0.16.1.dev0/synth_ai/managed_research/open_research/errors.py +0 -132
- synth_ai-0.16.1.dev0/synth_ai/managed_research/open_research/fingerprint.py +0 -60
- synth_ai-0.16.1.dev0/synth_ai/managed_research/open_research/models.py +0 -323
- synth_ai-0.16.1.dev0/synth_ai/managed_research/schemas/public_models.json +0 -370
- synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk/_client_helpers.py +0 -69
- synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk/namespaces/__init__.py +0 -53
- synth_ai-0.16.1.dev0/synth_ai/managed_research/transport/__init__.py +0 -18
- synth_ai-0.16.1.dev0/synth_ai/managed_research/transport/pagination.py +0 -30
- synth_ai-0.16.1.dev0/synth_ai/managed_research/transport/streaming.py +0 -99
- synth_ai-0.16.1.dev0/synth_ai/research/__init__.py +0 -103
- synth_ai-0.16.1.dev0/synth_ai/research/async_client.py +0 -80
- synth_ai-0.16.1.dev0/synth_ai/research/client.py +0 -184
- synth_ai-0.16.1.dev0/synth_ai/research/control.py +0 -33
- synth_ai-0.16.1.dev0/synth_ai/research/economics.py +0 -50
- synth_ai-0.16.1.dev0/synth_ai/research/errors.py +0 -54
- synth_ai-0.16.1.dev0/synth_ai/research/limits.py +0 -43
- synth_ai-0.16.1.dev0/synth_ai/research/projects.py +0 -206
- synth_ai-0.16.1.dev0/synth_ai/sdk/containers.py +0 -182
- synth_ai-0.16.1.dev0/synth_ai.egg-info/SOURCES.txt +0 -228
- synth_ai-0.16.1.dev0/synth_ai.egg-info/entry_points.txt +0 -5
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/LICENSE +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/MANIFEST.in +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/setup.cfg +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/__main__.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/cli/__init__.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/cli/__main__.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/cli/containers.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/cli/main.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/cli/pools.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/cli/tunnels.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/_internal/crypto.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/_internal/env.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/_internal/urls.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/actor_images.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/checkpoints.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/cloud_deployments.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/local_execution_profile.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/open_research_visual.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/operator_evidence.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/project_workspace.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_authority.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_diagnostics.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_execution.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/runtime_image.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/scientific_integrity.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_agent_kinds.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_agent_models.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_credential_providers.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_environment_kinds.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_evidence_obligations.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_funding_sources.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_horizons.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_host_kinds.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_network_topology.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_resource_kinds.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_resource_providers.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_runtime_kinds.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_tool_providers.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_work_modes.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/tag.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/work_products.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/factory_plans/__init__.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/artifacts.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/py.typed +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/transport/retries.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/version.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/__init__.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/dict.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/env.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/json.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/log_filter.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/paths.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/secure_files.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/urls.py +0 -0
- {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/objective_tools.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/py.typed +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/__init__.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/container/__init__.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/container/auth.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/horizons_private.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/managed_agents/__init__.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/managed_agents/client.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/managed_agents_anthropic.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/openai_agents_sdk.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/openai_tools.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/pagination.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/tunnels.py +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai.egg-info/dependency_links.txt +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai.egg-info/requires.txt +0 -0
- {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: synth-ai
|
|
3
|
-
Version: 0.16.1.
|
|
3
|
+
Version: 0.16.1.dev1
|
|
4
4
|
Summary: Python-only SDK for Synth containers, tunnels, pools, and Research
|
|
5
5
|
Author-email: Synth AI <josh@usesynth.ai>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -86,93 +86,97 @@ The CLI also reads `SYNTH_BACKEND_URL` and accepts `--backend-url`.
|
|
|
86
86
|
|
|
87
87
|
```python
|
|
88
88
|
from synth_ai import SynthClient
|
|
89
|
+
from synth_ai.core.research.public import SwarmSpec
|
|
89
90
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
91
|
+
with SynthClient() as client:
|
|
92
|
+
swarm = client.research.swarms.create(
|
|
93
|
+
SwarmSpec(objective="Assess this repository and produce a concise report.")
|
|
94
|
+
)
|
|
95
|
+
for event in swarm.events():
|
|
96
|
+
print(event.kind, event.telemetry.sequence)
|
|
97
|
+
result = swarm.wait(timeout_seconds=900)
|
|
98
|
+
print(result.swarm_id, result.state)
|
|
99
|
+
resolved = swarm.configuration()
|
|
100
|
+
print(resolved.config_version_id, resolved.snapshot_sha256)
|
|
101
|
+
usage = swarm.usage()
|
|
102
|
+
print(usage.money.nominal_pico_usd, usage.tokens.totals.input_tokens)
|
|
103
|
+
evidence = swarm.evidence()
|
|
104
|
+
print(evidence.artifacts, evidence.work_products)
|
|
93
105
|
```
|
|
94
106
|
|
|
95
|
-
|
|
107
|
+
`create` returns a durable handle immediately. `events()` yields typed events,
|
|
108
|
+
including an explicit `UnknownSwarmEvent` for forward-compatible server events;
|
|
109
|
+
`wait()` uses a monotonic deadline and returns the terminal typed `Swarm`.
|
|
110
|
+
`configuration()` returns the immutable, versioned, secret-redacted launch
|
|
111
|
+
snapshot bound to that swarm, so replay and audit do not depend on the
|
|
112
|
+
project's current mutable configuration.
|
|
113
|
+
`usage()` returns one typed cost, token, and actor-attribution projection plus
|
|
114
|
+
its source, record count, observation time, and terminal-state freshness. It
|
|
115
|
+
does not expose the legacy raw ledger-entry dictionaries.
|
|
116
|
+
`evidence()` returns the complete durable artifact and WorkProduct index with
|
|
117
|
+
strict counts and lifecycle freshness. Artifact and WorkProduct content reads
|
|
118
|
+
use the same typed transport and return bytes; they do not expose storage
|
|
119
|
+
authority.
|
|
96
120
|
|
|
97
|
-
|
|
121
|
+
## Research SDK
|
|
98
122
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
```
|
|
123
|
+
The only customer entrypoint is `SynthClient().research`. Its stable namespaces
|
|
124
|
+
are `projects`, `swarms`, and `factories`.
|
|
102
125
|
|
|
103
|
-
|
|
126
|
+
Create a durable project when work needs reusable configuration:
|
|
104
127
|
|
|
105
128
|
```python
|
|
106
|
-
import os
|
|
107
|
-
|
|
108
129
|
from synth_ai import SynthClient
|
|
109
|
-
from synth_ai.research import
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
# Async Research Factory: inspect the experiment floor before launching work
|
|
127
|
-
factory = research.factories.get(factory_id)
|
|
128
|
-
floor = research.factories.status(factory.factory_id)
|
|
129
|
-
preview = research.factories.preview_wake(factory.factory_id)
|
|
130
|
-
# After reviewing preview.efforts, the SDK replays the resolved request_contract
|
|
131
|
-
# with its opaque preview_token; callers do not reconstruct the write request.
|
|
132
|
-
if preview.confirmation_required:
|
|
133
|
-
receipt = research.factories.wake_due(
|
|
134
|
-
factory.factory_id,
|
|
135
|
-
preview=preview,
|
|
130
|
+
from synth_ai.core.research.public import EnvironmentKind, ProjectSpec, RuntimeKind, SwarmSpec
|
|
131
|
+
|
|
132
|
+
with SynthClient() as client:
|
|
133
|
+
project = client.research.projects.create(
|
|
134
|
+
ProjectSpec(
|
|
135
|
+
name="Repository assessment",
|
|
136
|
+
pool_id="pool_default",
|
|
137
|
+
runtime_kind=RuntimeKind("python"),
|
|
138
|
+
environment_kind=EnvironmentKind("docker"),
|
|
139
|
+
orchestrator_profile_id="profile_orchestrator",
|
|
140
|
+
default_worker_profile_id="profile_worker",
|
|
141
|
+
)
|
|
142
|
+
)
|
|
143
|
+
swarm = client.research.swarms.create(
|
|
144
|
+
SwarmSpec(objective="Produce the assessment."),
|
|
145
|
+
project_id=project.project_id,
|
|
136
146
|
)
|
|
147
|
+
print(swarm.wait().state)
|
|
148
|
+
```
|
|
137
149
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
150
|
+
Factories provide a typed durable optimization loop with native sync/async
|
|
151
|
+
parity:
|
|
152
|
+
|
|
153
|
+
```python
|
|
154
|
+
from synth_ai import SynthClient
|
|
155
|
+
from synth_ai.core.research.public import EffortSpec, FactorySpec, ProjectId
|
|
156
|
+
|
|
157
|
+
with SynthClient() as client:
|
|
158
|
+
factory = client.research.factories.create(
|
|
159
|
+
FactorySpec(name="Prompt optimizer")
|
|
160
|
+
)
|
|
161
|
+
effort = client.research.factories.efforts.create(
|
|
162
|
+
EffortSpec(
|
|
163
|
+
factory_id=factory.factory_id,
|
|
164
|
+
project_id=ProjectId("project_existing"),
|
|
165
|
+
name="Improve the system prompt",
|
|
166
|
+
)
|
|
144
167
|
)
|
|
145
|
-
)
|
|
146
|
-
research.factories.tag.sessions.messages.send(session.session_id, "Status update")
|
|
147
|
-
scope = research.factories.tag.scopes.get_default()
|
|
148
|
-
|
|
149
|
-
# Launch against the explicitly selected pre-existing project.
|
|
150
|
-
work_mode = ResearchWorkMode.DIRECTED_EFFORT
|
|
151
|
-
preflight = research.runs.check_preflight(project_id, work_mode=work_mode)
|
|
152
|
-
session = research.runs.create(
|
|
153
|
-
project_id,
|
|
154
|
-
objective="Produce a bounded repository assessment and a readable report.",
|
|
155
|
-
work_mode=work_mode,
|
|
156
|
-
)
|
|
157
|
-
|
|
158
|
-
# Run readouts (nested namespaces — never ``manderqueue`` on hero)
|
|
159
|
-
session.snapshots.get(detail="control")
|
|
160
|
-
progress = session.progress.get_typed()
|
|
161
|
-
usage = session.usage.get()
|
|
162
|
-
work_products = session.work_products.list()
|
|
163
|
-
artifacts = session.artifacts.list()
|
|
164
|
-
if work_products:
|
|
165
|
-
report = session.work_products.content.get(work_products[0].work_product_id)
|
|
166
|
-
session.message_queue.messages.list()
|
|
167
|
-
research.projects.objectives.list(project_id, run_id=session.run_id)
|
|
168
|
+
print(effort.effort_id, effort.state)
|
|
168
169
|
```
|
|
169
170
|
|
|
170
|
-
|
|
171
|
+
Limits, economics, secrets, Tag, rich evidence projections, and administrative
|
|
172
|
+
resource APIs remain available under `client.research.advanced` while their
|
|
173
|
+
contracts are stabilized. Advanced APIs are not covered by the stable surface
|
|
174
|
+
guarantee.
|
|
175
|
+
|
|
176
|
+
CLI discovery:
|
|
171
177
|
|
|
172
178
|
```bash
|
|
173
|
-
synth-ai research
|
|
174
|
-
synth-ai research tag smoke
|
|
175
|
-
synth-ai research smoke
|
|
179
|
+
synth-ai research --help
|
|
176
180
|
```
|
|
177
181
|
|
|
178
182
|
## CLI
|
|
@@ -190,7 +194,7 @@ Use `SynthClient` as the front door:
|
|
|
190
194
|
|
|
191
195
|
| Surface | Client namespace | Use it for |
|
|
192
196
|
| --- | --- | --- |
|
|
193
|
-
| **
|
|
197
|
+
| **Research / Factory** | `client.research` | Typed hosted projects, swarms, Factory lifecycles, and Efforts. |
|
|
194
198
|
| Containers | `client.containers` | Hosted container records and lifecycle operations. |
|
|
195
199
|
| Tunnels | `client.tunnels` | Managed tunnel records, leases, health, and rotation. |
|
|
196
200
|
| Pools | `client.pools` | Container pools, tasks, rollouts, artifacts, usage, and events. |
|
|
@@ -212,10 +216,8 @@ override grants are manual audit events rather than automatic resets.
|
|
|
212
216
|
The canonical backend surfaces are `GET /smr/billing/catalog`,
|
|
213
217
|
`GET /smr/billing/plan`, `GET /smr/billing/runs/{run_id}/drawdown`, and
|
|
214
218
|
`GET /smr/billing/factory-efforts/{factory_effort_id}/drawdown`. In the Python
|
|
215
|
-
SDK, use `client.research.economics
|
|
216
|
-
|
|
217
|
-
`.factory_effort_drawdown(factory_effort_id)` for canonical billing reads. Use
|
|
218
|
-
`.project(project_id)` for project usage, budgets, and entitlements. Do not infer
|
|
219
|
+
SDK, use `client.research.advanced.economics` for authoritative billing reads
|
|
220
|
+
while the economics contract remains advanced. Do not infer
|
|
219
221
|
allowance from legacy Autumn balances or local spend summaries, and do not
|
|
220
222
|
recompute discounts in the client.
|
|
221
223
|
|
|
@@ -50,93 +50,97 @@ The CLI also reads `SYNTH_BACKEND_URL` and accepts `--backend-url`.
|
|
|
50
50
|
|
|
51
51
|
```python
|
|
52
52
|
from synth_ai import SynthClient
|
|
53
|
+
from synth_ai.core.research.public import SwarmSpec
|
|
53
54
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
with SynthClient() as client:
|
|
56
|
+
swarm = client.research.swarms.create(
|
|
57
|
+
SwarmSpec(objective="Assess this repository and produce a concise report.")
|
|
58
|
+
)
|
|
59
|
+
for event in swarm.events():
|
|
60
|
+
print(event.kind, event.telemetry.sequence)
|
|
61
|
+
result = swarm.wait(timeout_seconds=900)
|
|
62
|
+
print(result.swarm_id, result.state)
|
|
63
|
+
resolved = swarm.configuration()
|
|
64
|
+
print(resolved.config_version_id, resolved.snapshot_sha256)
|
|
65
|
+
usage = swarm.usage()
|
|
66
|
+
print(usage.money.nominal_pico_usd, usage.tokens.totals.input_tokens)
|
|
67
|
+
evidence = swarm.evidence()
|
|
68
|
+
print(evidence.artifacts, evidence.work_products)
|
|
57
69
|
```
|
|
58
70
|
|
|
59
|
-
|
|
71
|
+
`create` returns a durable handle immediately. `events()` yields typed events,
|
|
72
|
+
including an explicit `UnknownSwarmEvent` for forward-compatible server events;
|
|
73
|
+
`wait()` uses a monotonic deadline and returns the terminal typed `Swarm`.
|
|
74
|
+
`configuration()` returns the immutable, versioned, secret-redacted launch
|
|
75
|
+
snapshot bound to that swarm, so replay and audit do not depend on the
|
|
76
|
+
project's current mutable configuration.
|
|
77
|
+
`usage()` returns one typed cost, token, and actor-attribution projection plus
|
|
78
|
+
its source, record count, observation time, and terminal-state freshness. It
|
|
79
|
+
does not expose the legacy raw ledger-entry dictionaries.
|
|
80
|
+
`evidence()` returns the complete durable artifact and WorkProduct index with
|
|
81
|
+
strict counts and lifecycle freshness. Artifact and WorkProduct content reads
|
|
82
|
+
use the same typed transport and return bytes; they do not expose storage
|
|
83
|
+
authority.
|
|
60
84
|
|
|
61
|
-
|
|
85
|
+
## Research SDK
|
|
62
86
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
```
|
|
87
|
+
The only customer entrypoint is `SynthClient().research`. Its stable namespaces
|
|
88
|
+
are `projects`, `swarms`, and `factories`.
|
|
66
89
|
|
|
67
|
-
|
|
90
|
+
Create a durable project when work needs reusable configuration:
|
|
68
91
|
|
|
69
92
|
```python
|
|
70
|
-
import os
|
|
71
|
-
|
|
72
93
|
from synth_ai import SynthClient
|
|
73
|
-
from synth_ai.research import
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
# Async Research Factory: inspect the experiment floor before launching work
|
|
91
|
-
factory = research.factories.get(factory_id)
|
|
92
|
-
floor = research.factories.status(factory.factory_id)
|
|
93
|
-
preview = research.factories.preview_wake(factory.factory_id)
|
|
94
|
-
# After reviewing preview.efforts, the SDK replays the resolved request_contract
|
|
95
|
-
# with its opaque preview_token; callers do not reconstruct the write request.
|
|
96
|
-
if preview.confirmation_required:
|
|
97
|
-
receipt = research.factories.wake_due(
|
|
98
|
-
factory.factory_id,
|
|
99
|
-
preview=preview,
|
|
94
|
+
from synth_ai.core.research.public import EnvironmentKind, ProjectSpec, RuntimeKind, SwarmSpec
|
|
95
|
+
|
|
96
|
+
with SynthClient() as client:
|
|
97
|
+
project = client.research.projects.create(
|
|
98
|
+
ProjectSpec(
|
|
99
|
+
name="Repository assessment",
|
|
100
|
+
pool_id="pool_default",
|
|
101
|
+
runtime_kind=RuntimeKind("python"),
|
|
102
|
+
environment_kind=EnvironmentKind("docker"),
|
|
103
|
+
orchestrator_profile_id="profile_orchestrator",
|
|
104
|
+
default_worker_profile_id="profile_worker",
|
|
105
|
+
)
|
|
106
|
+
)
|
|
107
|
+
swarm = client.research.swarms.create(
|
|
108
|
+
SwarmSpec(objective="Produce the assessment."),
|
|
109
|
+
project_id=project.project_id,
|
|
100
110
|
)
|
|
111
|
+
print(swarm.wait().state)
|
|
112
|
+
```
|
|
101
113
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
114
|
+
Factories provide a typed durable optimization loop with native sync/async
|
|
115
|
+
parity:
|
|
116
|
+
|
|
117
|
+
```python
|
|
118
|
+
from synth_ai import SynthClient
|
|
119
|
+
from synth_ai.core.research.public import EffortSpec, FactorySpec, ProjectId
|
|
120
|
+
|
|
121
|
+
with SynthClient() as client:
|
|
122
|
+
factory = client.research.factories.create(
|
|
123
|
+
FactorySpec(name="Prompt optimizer")
|
|
124
|
+
)
|
|
125
|
+
effort = client.research.factories.efforts.create(
|
|
126
|
+
EffortSpec(
|
|
127
|
+
factory_id=factory.factory_id,
|
|
128
|
+
project_id=ProjectId("project_existing"),
|
|
129
|
+
name="Improve the system prompt",
|
|
130
|
+
)
|
|
108
131
|
)
|
|
109
|
-
)
|
|
110
|
-
research.factories.tag.sessions.messages.send(session.session_id, "Status update")
|
|
111
|
-
scope = research.factories.tag.scopes.get_default()
|
|
112
|
-
|
|
113
|
-
# Launch against the explicitly selected pre-existing project.
|
|
114
|
-
work_mode = ResearchWorkMode.DIRECTED_EFFORT
|
|
115
|
-
preflight = research.runs.check_preflight(project_id, work_mode=work_mode)
|
|
116
|
-
session = research.runs.create(
|
|
117
|
-
project_id,
|
|
118
|
-
objective="Produce a bounded repository assessment and a readable report.",
|
|
119
|
-
work_mode=work_mode,
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
# Run readouts (nested namespaces — never ``manderqueue`` on hero)
|
|
123
|
-
session.snapshots.get(detail="control")
|
|
124
|
-
progress = session.progress.get_typed()
|
|
125
|
-
usage = session.usage.get()
|
|
126
|
-
work_products = session.work_products.list()
|
|
127
|
-
artifacts = session.artifacts.list()
|
|
128
|
-
if work_products:
|
|
129
|
-
report = session.work_products.content.get(work_products[0].work_product_id)
|
|
130
|
-
session.message_queue.messages.list()
|
|
131
|
-
research.projects.objectives.list(project_id, run_id=session.run_id)
|
|
132
|
+
print(effort.effort_id, effort.state)
|
|
132
133
|
```
|
|
133
134
|
|
|
134
|
-
|
|
135
|
+
Limits, economics, secrets, Tag, rich evidence projections, and administrative
|
|
136
|
+
resource APIs remain available under `client.research.advanced` while their
|
|
137
|
+
contracts are stabilized. Advanced APIs are not covered by the stable surface
|
|
138
|
+
guarantee.
|
|
139
|
+
|
|
140
|
+
CLI discovery:
|
|
135
141
|
|
|
136
142
|
```bash
|
|
137
|
-
synth-ai research
|
|
138
|
-
synth-ai research tag smoke
|
|
139
|
-
synth-ai research smoke
|
|
143
|
+
synth-ai research --help
|
|
140
144
|
```
|
|
141
145
|
|
|
142
146
|
## CLI
|
|
@@ -154,7 +158,7 @@ Use `SynthClient` as the front door:
|
|
|
154
158
|
|
|
155
159
|
| Surface | Client namespace | Use it for |
|
|
156
160
|
| --- | --- | --- |
|
|
157
|
-
| **
|
|
161
|
+
| **Research / Factory** | `client.research` | Typed hosted projects, swarms, Factory lifecycles, and Efforts. |
|
|
158
162
|
| Containers | `client.containers` | Hosted container records and lifecycle operations. |
|
|
159
163
|
| Tunnels | `client.tunnels` | Managed tunnel records, leases, health, and rotation. |
|
|
160
164
|
| Pools | `client.pools` | Container pools, tasks, rollouts, artifacts, usage, and events. |
|
|
@@ -176,10 +180,8 @@ override grants are manual audit events rather than automatic resets.
|
|
|
176
180
|
The canonical backend surfaces are `GET /smr/billing/catalog`,
|
|
177
181
|
`GET /smr/billing/plan`, `GET /smr/billing/runs/{run_id}/drawdown`, and
|
|
178
182
|
`GET /smr/billing/factory-efforts/{factory_effort_id}/drawdown`. In the Python
|
|
179
|
-
SDK, use `client.research.economics
|
|
180
|
-
|
|
181
|
-
`.factory_effort_drawdown(factory_effort_id)` for canonical billing reads. Use
|
|
182
|
-
`.project(project_id)` for project usage, budgets, and entitlements. Do not infer
|
|
183
|
+
SDK, use `client.research.advanced.economics` for authoritative billing reads
|
|
184
|
+
while the economics contract remains advanced. Do not infer
|
|
183
185
|
allowance from legacy Autumn balances or local spend summaries, and do not
|
|
184
186
|
recompute discounts in the client.
|
|
185
187
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "synth-ai"
|
|
3
|
-
version = "0.16.1.
|
|
3
|
+
version = "0.16.1.dev1"
|
|
4
4
|
description = "Python-only SDK for Synth containers, tunnels, pools, and Research"
|
|
5
5
|
authors = [{name = "Synth AI", email = "josh@usesynth.ai"}]
|
|
6
6
|
license = "MIT"
|
|
@@ -17,9 +17,8 @@ dependencies = [
|
|
|
17
17
|
|
|
18
18
|
[project.scripts]
|
|
19
19
|
synth-ai = "synth_ai.cli:cli"
|
|
20
|
-
synth-ai-
|
|
21
|
-
synth-ai-
|
|
22
|
-
synth-ai-research-factory-standup = "synth_ai.managed_research.factory_standup:main"
|
|
20
|
+
synth-ai-research-mcp = "synth_ai.mcp.research.server:main"
|
|
21
|
+
synth-ai-research-factory-standup = "synth_ai.cli.research_factory_standup:main"
|
|
23
22
|
|
|
24
23
|
[project.optional-dependencies]
|
|
25
24
|
schemas = []
|
|
@@ -83,10 +82,8 @@ include-package-data = true
|
|
|
83
82
|
[tool.setuptools.package-data]
|
|
84
83
|
"synth_ai" = [
|
|
85
84
|
"py.typed",
|
|
86
|
-
"
|
|
87
|
-
"
|
|
88
|
-
"managed_research/factory_plans/*.json",
|
|
89
|
-
"managed_research/schemas/*",
|
|
85
|
+
"core/research/factory_plans/*.json",
|
|
86
|
+
"core/research/schemas/*",
|
|
90
87
|
]
|
|
91
88
|
|
|
92
89
|
[tool.ruff]
|
|
@@ -132,8 +129,7 @@ include = ["synth_ai"]
|
|
|
132
129
|
|
|
133
130
|
[[tool.ty.overrides]]
|
|
134
131
|
include = [
|
|
135
|
-
"synth_ai/research
|
|
136
|
-
"synth_ai/managed_research/sdk/tag.py",
|
|
132
|
+
"synth_ai/core/research/_legacy/sdk/tag.py",
|
|
137
133
|
]
|
|
138
134
|
rules = { unresolved-import = "warn" }
|
|
139
135
|
|
|
@@ -21,7 +21,7 @@ except PackageNotFoundError:
|
|
|
21
21
|
try:
|
|
22
22
|
import tomllib as _toml
|
|
23
23
|
except ModuleNotFoundError: # pragma: no cover
|
|
24
|
-
import tomli as _toml # type: ignore[no-redef]
|
|
24
|
+
import tomli as _toml # type: ignore[no-redef] # ty: ignore[unresolved-import]
|
|
25
25
|
|
|
26
26
|
try:
|
|
27
27
|
pyproject_path = Path(__file__).resolve().parents[1] / "pyproject.toml"
|
|
@@ -44,17 +44,17 @@ __all__ = [
|
|
|
44
44
|
"ContainerPoolsClient",
|
|
45
45
|
"ContainersClient",
|
|
46
46
|
"HorizonsPrivateClient",
|
|
47
|
-
"
|
|
48
|
-
"ManagedResearchError",
|
|
49
|
-
"ManagedResearchMcpServer",
|
|
47
|
+
"ResearchApiError",
|
|
50
48
|
"ManagedAgentsAnthropicClient",
|
|
51
49
|
"ManagedAgentRun",
|
|
52
50
|
"OpenAIAgentsSdkClient",
|
|
53
51
|
"ResearchClient",
|
|
54
52
|
"ResearchConcurrentRunLimitExceededError",
|
|
55
|
-
"ResearchApiError",
|
|
56
53
|
"ResearchInsufficientCreditsError",
|
|
57
54
|
"ResearchLimitExceededError",
|
|
55
|
+
"ResearchProjectCreateRequest",
|
|
56
|
+
"ResearchSwarmLaunchRequest",
|
|
57
|
+
"ResearchSwarmState",
|
|
58
58
|
"SynthClient",
|
|
59
59
|
"SynthManagedAgents",
|
|
60
60
|
"TunnelsClient",
|
|
@@ -63,37 +63,39 @@ __all__ = [
|
|
|
63
63
|
]
|
|
64
64
|
|
|
65
65
|
_EXPORTS: dict[str, tuple[str, str]] = {
|
|
66
|
-
"
|
|
67
|
-
"synth_ai.managed_research.sdk.client",
|
|
68
|
-
"ManagedResearchClient",
|
|
69
|
-
),
|
|
70
|
-
"SmrControlClient": ("synth_ai.managed_research.sdk.client", "SmrControlClient"),
|
|
71
|
-
"ManagedResearchMcpServer": (
|
|
72
|
-
"synth_ai.managed_research.mcp.server",
|
|
73
|
-
"ManagedResearchMcpServer",
|
|
74
|
-
),
|
|
75
|
-
"ManagedResearchError": ("synth_ai.managed_research.errors", "ManagedResearchError"),
|
|
76
|
-
"ResearchApiError": ("synth_ai.research.errors", "ResearchApiError"),
|
|
66
|
+
"ResearchApiError": ("synth_ai.core.research.errors", "ResearchApiError"),
|
|
77
67
|
"ResearchConcurrentRunLimitExceededError": (
|
|
78
|
-
"synth_ai.research.errors",
|
|
68
|
+
"synth_ai.core.research.errors",
|
|
79
69
|
"ResearchConcurrentRunLimitExceededError",
|
|
80
70
|
),
|
|
81
71
|
"ResearchInsufficientCreditsError": (
|
|
82
|
-
"synth_ai.research.errors",
|
|
72
|
+
"synth_ai.core.research.errors",
|
|
83
73
|
"ResearchInsufficientCreditsError",
|
|
84
74
|
),
|
|
85
|
-
"ResearchLimitExceededError": ("synth_ai.research.errors", "ResearchLimitExceededError"),
|
|
86
|
-
"SmrApiError": ("synth_ai.research.errors", "ResearchApiError"),
|
|
75
|
+
"ResearchLimitExceededError": ("synth_ai.core.research.errors", "ResearchLimitExceededError"),
|
|
76
|
+
"SmrApiError": ("synth_ai.core.research.errors", "ResearchApiError"),
|
|
87
77
|
"SmrConcurrentRunLimitExceededError": (
|
|
88
|
-
"synth_ai.research.errors",
|
|
78
|
+
"synth_ai.core.research.errors",
|
|
89
79
|
"ResearchConcurrentRunLimitExceededError",
|
|
90
80
|
),
|
|
91
81
|
"SmrInsufficientCreditsError": (
|
|
92
|
-
"synth_ai.research.errors",
|
|
82
|
+
"synth_ai.core.research.errors",
|
|
93
83
|
"ResearchInsufficientCreditsError",
|
|
94
84
|
),
|
|
95
|
-
"SmrLimitExceededError": ("synth_ai.research.errors", "ResearchLimitExceededError"),
|
|
96
|
-
"ResearchClient": ("synth_ai.research.
|
|
85
|
+
"SmrLimitExceededError": ("synth_ai.core.research.errors", "ResearchLimitExceededError"),
|
|
86
|
+
"ResearchClient": ("synth_ai.core.research.facade", "ResearchClient"),
|
|
87
|
+
"ResearchProjectCreateRequest": (
|
|
88
|
+
"synth_ai.core.research.contracts",
|
|
89
|
+
"ResearchProjectCreateRequest",
|
|
90
|
+
),
|
|
91
|
+
"ResearchSwarmLaunchRequest": (
|
|
92
|
+
"synth_ai.core.research.contracts",
|
|
93
|
+
"ResearchSwarmLaunchRequest",
|
|
94
|
+
),
|
|
95
|
+
"ResearchSwarmState": (
|
|
96
|
+
"synth_ai.core.research.contracts",
|
|
97
|
+
"ResearchSwarmState",
|
|
98
|
+
),
|
|
97
99
|
"SynthClient": ("synth_ai.client", "SynthClient"),
|
|
98
100
|
"AsyncSynthClient": ("synth_ai.client", "AsyncSynthClient"),
|
|
99
101
|
"ContainersClient": ("synth_ai.sdk.containers", "ContainersClient"),
|
|
@@ -387,9 +387,9 @@ def _dev_environment_run_options(fn):
|
|
|
387
387
|
|
|
388
388
|
|
|
389
389
|
def _client(api_key: str | None, backend_url: str | None):
|
|
390
|
-
from synth_ai.
|
|
390
|
+
from synth_ai.core.research.session.client import ResearchSession
|
|
391
391
|
|
|
392
|
-
return
|
|
392
|
+
return ResearchSession(
|
|
393
393
|
api_key=_resolve_api_key(api_key),
|
|
394
394
|
backend_base=_resolve_backend_url(backend_url),
|
|
395
395
|
)
|