synth-ai 0.22.2.dev678__tar.gz → 0.22.2.dev680__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.22.2.dev678/synth_ai.egg-info → synth_ai-0.22.2.dev680}/PKG-INFO +1 -1
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/openapi/research-v1.json +259 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/pyproject.toml +1 -1
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/contributions.py +25 -1
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/__init__.py +2 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/forge/operations.py +30 -0
- synth_ai-0.22.2.dev680/synth_ai/sdk/research/contracts/swarm_controls.py +55 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/operations.py +10 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/swarms.py +118 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680/synth_ai.egg-info}/PKG-INFO +1 -1
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai.egg-info/SOURCES.txt +1 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/LICENSE +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/MANIFEST.in +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/README.md +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/openapi/index-v1.json +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/openapi/messaging-v1.json +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/setup.cfg +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/setup.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/README.md +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/__main__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/AGENTS.md +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/README.md +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/__main__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/index.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/main.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/research.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/research_environments.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/research_image_releases.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/research_projects.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/client.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/README.md +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/auth/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/auth/credentials.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/contracts/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/contracts/json_value.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/contracts/pagination.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/errors.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/http/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/http/async_transport.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/http/request.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/http/retry.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/http/streaming.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/http/transport.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/research/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/utils/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/utils/env.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/utils/log_filter.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/utils/paths.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/utils/urls.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/README.md +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/__main__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/objective_tools.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/registry.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/request_models.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/server.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/approvals.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/artifacts.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/datasets.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/environments.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/exports.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/factories.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/factory_results.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/files.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/image_releases.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/index.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/index_qa.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/integrations.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/intern_program.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/local_files.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/logs.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/models.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/outputs.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/policy_schemas.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/progress.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/project_data.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/projects.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/prs.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/readiness.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/repos.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/research_intern.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/resource_reads.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/resources.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/runs.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/scientific_records.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/trained_models.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/usage.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/visuals.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/workspace_inputs.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/pools.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/py.typed +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/README.md +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/AGENT_SETUP_PROMPT.md +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/README.md +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/agent_policy.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/artifacts.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/catalog.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/catalogue.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/classification.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/client.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/contracts.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/errors.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/forge_notices.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/intake.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/lifecycle.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/manifest.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/oauth.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/package.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/public.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/public_corpus.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/public_search.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/qa.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/qa_checks.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/qa_preflight.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/qa_reviews.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/research/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/research/build.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/research/capture.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/research/contracts.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/research/files.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/research/release.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/research_intake.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/retry.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/rights.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/scientific_provenance.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/scope_errors.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/scopes.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/search.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/submission.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/timeouts.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/transfer.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/upload_session.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/usage_accounting.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/value.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/wallet_search.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/messaging/README.md +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/messaging/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/messaging/client.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/messaging/contracts.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/optimizers/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/optimizers/client.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/optimizers/contracts.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/pagination.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/_internal/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/_internal/crypto.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/_internal/env.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/_internal/urls.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/account.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/advanced.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/advanced_factories.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/advanced_swarms.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/artifacts.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/auth.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/client.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/container_pools/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/container_pools/api.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/container_pools/contracts.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/container_pools/operations.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/container_pools/packaging.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/_activity_wire.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/_environment_wire.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/_transcript_wire.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/_wire.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/activity.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/activity_items.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/actor_images.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/billing.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/canonical_usage.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/checkpoints.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/cloud_deployment_claims.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/cloud_deployments.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/common.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/dataset_revisions.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/deliveries.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/dev_environment_evidence.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/economics.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/environment_manifest.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/environments.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/evidence.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/factories.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/factory_evidence.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/factory_lenses.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/factory_operations.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/factory_role_receipts.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/failure.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/forge/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/forge/contracts.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/forge/evaluation.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/forge/exports.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/forge/records.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/forge/resources.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/forge/schema.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/image_releases.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/intern_blockers.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/intern_grants.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/intern_program.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/intern_resources.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/intern_usage.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/limit_evidence.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/local_execution_profile.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/operator_evidence.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/project.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/project_data.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/project_runtime.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/project_workspace.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/project_workspace_evidence.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/projects.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/promotions.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/research_intern.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/resource_reads.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/resource_settlement.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_authority.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_control.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_diagnostics.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_events.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_execution.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_launch.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_observability.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_state.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_timeline.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/runtime_image.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/runtime_intent.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/runtime_stream.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/runtime_stream_snapshot.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/scientific_integrity.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_actor_models.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_actor_policy_data.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_agent_harnesses.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_agent_kinds.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_agent_models.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_branching.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_credential_providers.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_environment_kinds.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_evidence_obligations.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_funding_sources.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_horizons.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_host_kinds.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_inference_providers.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_network_topology.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_providers.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_resource_kinds.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_roles.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_run_policy.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_runbooks.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_runnable_project.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_runtime_kinds.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_tool_providers.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_work_modes.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/status.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/swarm_rollouts.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/swarms.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/tag.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/traces.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/transcript.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/types.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/usage.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/visuals.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/wire_models.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/wire_models_README.md +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/work_products.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/workspaces.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/economics.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/efforts.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/environments.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/errors.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/events.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/experiments.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/facade.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/factories.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/factory_storage.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/image_releases.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/intern_blockers.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/intern_program.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/knowledge.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/models.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/project_data.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/project_deliveries.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/project_workspaces.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/projects.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/public.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/readouts.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/research_intern.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/resource_reads.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/scientific_records.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/secrets.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/README.md +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/_base.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/_client_helpers.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/_run_authority_mixin.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/approvals.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/billing.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/client.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/cloud_deployments.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/config.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/cost.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/datasets.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/dev_environments.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/environments.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/exports.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/factories.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/factory_evidence.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/files.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/github.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/image_releases.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/images.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/logs.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/models.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/outputs.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/progress.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/project.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/projects.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/prs.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/readiness.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/repositories.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/runs.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/secrets.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/setup.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/tag.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/trained_models.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/transport.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/usage.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/work_products.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/workspace_inputs.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/surface_parity.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/traces.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/transport/__init__.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/transport/http.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/transport/pagination.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/version.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/visuals.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/wiki.py +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai.egg-info/dependency_links.txt +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai.egg-info/entry_points.txt +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai.egg-info/requires.txt +0 -0
- {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai.egg-info/top_level.txt +0 -0
|
@@ -22119,6 +22119,131 @@
|
|
|
22119
22119
|
"title": "SmrOpenEndedQuestionInlineCreateRequest",
|
|
22120
22120
|
"type": "object"
|
|
22121
22121
|
},
|
|
22122
|
+
"SmrOrchestraActionAnswerRequest": {
|
|
22123
|
+
"additionalProperties": false,
|
|
22124
|
+
"description": "Answer one Orchestra ``pending_questions[]`` action (``action_answer``).",
|
|
22125
|
+
"properties": {
|
|
22126
|
+
"idempotency_key": {
|
|
22127
|
+
"anyOf": [
|
|
22128
|
+
{
|
|
22129
|
+
"type": "string"
|
|
22130
|
+
},
|
|
22131
|
+
{
|
|
22132
|
+
"type": "null"
|
|
22133
|
+
}
|
|
22134
|
+
],
|
|
22135
|
+
"title": "Idempotency Key"
|
|
22136
|
+
},
|
|
22137
|
+
"response_text": {
|
|
22138
|
+
"minLength": 1,
|
|
22139
|
+
"title": "Response Text",
|
|
22140
|
+
"type": "string"
|
|
22141
|
+
}
|
|
22142
|
+
},
|
|
22143
|
+
"required": [
|
|
22144
|
+
"response_text"
|
|
22145
|
+
],
|
|
22146
|
+
"title": "SmrOrchestraActionAnswerRequest",
|
|
22147
|
+
"type": "object"
|
|
22148
|
+
},
|
|
22149
|
+
"SmrOrchestraOperationReceiptResponse": {
|
|
22150
|
+
"additionalProperties": false,
|
|
22151
|
+
"description": "Orchestra's write receipt for a public answer/steer (HTTP 202).\n\n``status`` is Orchestra's: ``accepted`` for a new write, ``duplicate`` for\na replay of the same ``operation_id`` with the same request.",
|
|
22152
|
+
"properties": {
|
|
22153
|
+
"action_id": {
|
|
22154
|
+
"anyOf": [
|
|
22155
|
+
{
|
|
22156
|
+
"type": "string"
|
|
22157
|
+
},
|
|
22158
|
+
{
|
|
22159
|
+
"type": "null"
|
|
22160
|
+
}
|
|
22161
|
+
],
|
|
22162
|
+
"title": "Action Id"
|
|
22163
|
+
},
|
|
22164
|
+
"control_seq": {
|
|
22165
|
+
"anyOf": [
|
|
22166
|
+
{
|
|
22167
|
+
"type": "integer"
|
|
22168
|
+
},
|
|
22169
|
+
{
|
|
22170
|
+
"type": "null"
|
|
22171
|
+
}
|
|
22172
|
+
],
|
|
22173
|
+
"title": "Control Seq"
|
|
22174
|
+
},
|
|
22175
|
+
"interaction_id": {
|
|
22176
|
+
"anyOf": [
|
|
22177
|
+
{
|
|
22178
|
+
"type": "string"
|
|
22179
|
+
},
|
|
22180
|
+
{
|
|
22181
|
+
"type": "null"
|
|
22182
|
+
}
|
|
22183
|
+
],
|
|
22184
|
+
"title": "Interaction Id"
|
|
22185
|
+
},
|
|
22186
|
+
"kind": {
|
|
22187
|
+
"enum": [
|
|
22188
|
+
"action_answer",
|
|
22189
|
+
"steer"
|
|
22190
|
+
],
|
|
22191
|
+
"title": "Kind",
|
|
22192
|
+
"type": "string"
|
|
22193
|
+
},
|
|
22194
|
+
"operation_id": {
|
|
22195
|
+
"title": "Operation Id",
|
|
22196
|
+
"type": "string"
|
|
22197
|
+
},
|
|
22198
|
+
"run_id": {
|
|
22199
|
+
"title": "Run Id",
|
|
22200
|
+
"type": "string"
|
|
22201
|
+
},
|
|
22202
|
+
"status": {
|
|
22203
|
+
"enum": [
|
|
22204
|
+
"accepted",
|
|
22205
|
+
"duplicate"
|
|
22206
|
+
],
|
|
22207
|
+
"title": "Status",
|
|
22208
|
+
"type": "string"
|
|
22209
|
+
}
|
|
22210
|
+
},
|
|
22211
|
+
"required": [
|
|
22212
|
+
"run_id",
|
|
22213
|
+
"operation_id",
|
|
22214
|
+
"kind",
|
|
22215
|
+
"status"
|
|
22216
|
+
],
|
|
22217
|
+
"title": "SmrOrchestraOperationReceiptResponse",
|
|
22218
|
+
"type": "object"
|
|
22219
|
+
},
|
|
22220
|
+
"SmrOrchestraSteerRequest": {
|
|
22221
|
+
"additionalProperties": false,
|
|
22222
|
+
"description": "Steer an orchestra-authority run (Orchestra ``RunControl::Steer``).",
|
|
22223
|
+
"properties": {
|
|
22224
|
+
"idempotency_key": {
|
|
22225
|
+
"anyOf": [
|
|
22226
|
+
{
|
|
22227
|
+
"type": "string"
|
|
22228
|
+
},
|
|
22229
|
+
{
|
|
22230
|
+
"type": "null"
|
|
22231
|
+
}
|
|
22232
|
+
],
|
|
22233
|
+
"title": "Idempotency Key"
|
|
22234
|
+
},
|
|
22235
|
+
"message": {
|
|
22236
|
+
"minLength": 1,
|
|
22237
|
+
"title": "Message",
|
|
22238
|
+
"type": "string"
|
|
22239
|
+
}
|
|
22240
|
+
},
|
|
22241
|
+
"required": [
|
|
22242
|
+
"message"
|
|
22243
|
+
],
|
|
22244
|
+
"title": "SmrOrchestraSteerRequest",
|
|
22245
|
+
"type": "object"
|
|
22246
|
+
},
|
|
22122
22247
|
"SmrPatchVisualRequest": {
|
|
22123
22248
|
"properties": {
|
|
22124
22249
|
"summary": {
|
|
@@ -50558,6 +50683,78 @@
|
|
|
50558
50683
|
]
|
|
50559
50684
|
}
|
|
50560
50685
|
},
|
|
50686
|
+
"/smr/runs/{run_id}/actions/{action_id}/answer": {
|
|
50687
|
+
"post": {
|
|
50688
|
+
"description": "Answer an Orchestra ``pending_questions[]`` action on an orchestra run.",
|
|
50689
|
+
"operationId": "answer_run_action",
|
|
50690
|
+
"parameters": [
|
|
50691
|
+
{
|
|
50692
|
+
"in": "path",
|
|
50693
|
+
"name": "run_id",
|
|
50694
|
+
"required": true,
|
|
50695
|
+
"schema": {
|
|
50696
|
+
"title": "Run Id",
|
|
50697
|
+
"type": "string"
|
|
50698
|
+
}
|
|
50699
|
+
},
|
|
50700
|
+
{
|
|
50701
|
+
"in": "path",
|
|
50702
|
+
"name": "action_id",
|
|
50703
|
+
"required": true,
|
|
50704
|
+
"schema": {
|
|
50705
|
+
"minLength": 1,
|
|
50706
|
+
"title": "Action Id",
|
|
50707
|
+
"type": "string"
|
|
50708
|
+
}
|
|
50709
|
+
}
|
|
50710
|
+
],
|
|
50711
|
+
"requestBody": {
|
|
50712
|
+
"content": {
|
|
50713
|
+
"application/json": {
|
|
50714
|
+
"schema": {
|
|
50715
|
+
"$ref": "#/components/schemas/SmrOrchestraActionAnswerRequest"
|
|
50716
|
+
}
|
|
50717
|
+
}
|
|
50718
|
+
},
|
|
50719
|
+
"required": true
|
|
50720
|
+
},
|
|
50721
|
+
"responses": {
|
|
50722
|
+
"202": {
|
|
50723
|
+
"content": {
|
|
50724
|
+
"application/json": {
|
|
50725
|
+
"schema": {
|
|
50726
|
+
"$ref": "#/components/schemas/SmrOrchestraOperationReceiptResponse"
|
|
50727
|
+
}
|
|
50728
|
+
}
|
|
50729
|
+
},
|
|
50730
|
+
"description": "Successful Response"
|
|
50731
|
+
},
|
|
50732
|
+
"404": {
|
|
50733
|
+
"description": "Run not found in the caller's organization."
|
|
50734
|
+
},
|
|
50735
|
+
"409": {
|
|
50736
|
+
"description": "run_not_orchestra_authority | terminal_run | answer_conflict | idempotency_conflict | orchestra_run_not_launched | project_archived"
|
|
50737
|
+
},
|
|
50738
|
+
"422": {
|
|
50739
|
+
"content": {
|
|
50740
|
+
"application/json": {
|
|
50741
|
+
"schema": {
|
|
50742
|
+
"$ref": "#/components/schemas/HTTPValidationError"
|
|
50743
|
+
}
|
|
50744
|
+
}
|
|
50745
|
+
},
|
|
50746
|
+
"description": "Validation Error"
|
|
50747
|
+
},
|
|
50748
|
+
"503": {
|
|
50749
|
+
"description": "orchestra_in_doubt | orchestra_unavailable (retryable)"
|
|
50750
|
+
}
|
|
50751
|
+
},
|
|
50752
|
+
"summary": "Answer Run Action",
|
|
50753
|
+
"tags": [
|
|
50754
|
+
"smr"
|
|
50755
|
+
]
|
|
50756
|
+
}
|
|
50757
|
+
},
|
|
50561
50758
|
"/smr/runs/{run_id}/activity": {
|
|
50562
50759
|
"get": {
|
|
50563
50760
|
"description": "Return typed bounded execution activity for a swarm.",
|
|
@@ -52050,6 +52247,68 @@
|
|
|
52050
52247
|
]
|
|
52051
52248
|
}
|
|
52052
52249
|
},
|
|
52250
|
+
"/smr/runs/{run_id}/steer": {
|
|
52251
|
+
"post": {
|
|
52252
|
+
"description": "Steer an orchestra-authority run (Orchestra ``RunControl::Steer``).",
|
|
52253
|
+
"operationId": "steer_run",
|
|
52254
|
+
"parameters": [
|
|
52255
|
+
{
|
|
52256
|
+
"in": "path",
|
|
52257
|
+
"name": "run_id",
|
|
52258
|
+
"required": true,
|
|
52259
|
+
"schema": {
|
|
52260
|
+
"title": "Run Id",
|
|
52261
|
+
"type": "string"
|
|
52262
|
+
}
|
|
52263
|
+
}
|
|
52264
|
+
],
|
|
52265
|
+
"requestBody": {
|
|
52266
|
+
"content": {
|
|
52267
|
+
"application/json": {
|
|
52268
|
+
"schema": {
|
|
52269
|
+
"$ref": "#/components/schemas/SmrOrchestraSteerRequest"
|
|
52270
|
+
}
|
|
52271
|
+
}
|
|
52272
|
+
},
|
|
52273
|
+
"required": true
|
|
52274
|
+
},
|
|
52275
|
+
"responses": {
|
|
52276
|
+
"202": {
|
|
52277
|
+
"content": {
|
|
52278
|
+
"application/json": {
|
|
52279
|
+
"schema": {
|
|
52280
|
+
"$ref": "#/components/schemas/SmrOrchestraOperationReceiptResponse"
|
|
52281
|
+
}
|
|
52282
|
+
}
|
|
52283
|
+
},
|
|
52284
|
+
"description": "Successful Response"
|
|
52285
|
+
},
|
|
52286
|
+
"404": {
|
|
52287
|
+
"description": "Run not found in the caller's organization."
|
|
52288
|
+
},
|
|
52289
|
+
"409": {
|
|
52290
|
+
"description": "run_not_orchestra_authority | terminal_run | answer_conflict | idempotency_conflict | orchestra_run_not_launched | project_archived"
|
|
52291
|
+
},
|
|
52292
|
+
"422": {
|
|
52293
|
+
"content": {
|
|
52294
|
+
"application/json": {
|
|
52295
|
+
"schema": {
|
|
52296
|
+
"$ref": "#/components/schemas/HTTPValidationError"
|
|
52297
|
+
}
|
|
52298
|
+
}
|
|
52299
|
+
},
|
|
52300
|
+
"description": "Validation Error"
|
|
52301
|
+
},
|
|
52302
|
+
"503": {
|
|
52303
|
+
"description": "orchestra_in_doubt | orchestra_unavailable (retryable)"
|
|
52304
|
+
}
|
|
52305
|
+
},
|
|
52306
|
+
"summary": "Steer Run",
|
|
52307
|
+
"tags": [
|
|
52308
|
+
"smr"
|
|
52309
|
+
]
|
|
52310
|
+
}
|
|
52311
|
+
},
|
|
52053
52312
|
"/smr/runs/{run_id}/stop": {
|
|
52054
52313
|
"post": {
|
|
52055
52314
|
"operationId": "stop_run",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "synth-ai"
|
|
3
|
-
version = "0.22.2.
|
|
3
|
+
version = "0.22.2.dev680"
|
|
4
4
|
description = "Python SDK, CLI and MCP servers for Synth Index search and Swarms"
|
|
5
5
|
keywords = ["synth", "index", "search", "citations", "research", "swarms", "mcp", "sdk"]
|
|
6
6
|
authors = [{name = "Synth AI", email = "josh@usesynth.ai"}]
|
|
@@ -13,6 +13,7 @@ from uuid import UUID
|
|
|
13
13
|
from pydantic import BeforeValidator, Field, StringConstraints, field_validator, model_validator
|
|
14
14
|
|
|
15
15
|
from synth_ai.sdk.research.contracts.forge.contracts import ExactReference, Identifier
|
|
16
|
+
from synth_ai.sdk.research.contracts.forge.operations import RevisionReference
|
|
16
17
|
|
|
17
18
|
from .artifacts import ArtifactPublicationPrepareResponse, ArtifactUuid
|
|
18
19
|
from .contracts import ContributionReference, IndexContract
|
|
@@ -112,13 +113,36 @@ class ForgeResearchSource(IndexContract):
|
|
|
112
113
|
return self
|
|
113
114
|
|
|
114
115
|
|
|
116
|
+
ARCHIVE_V3 = "forge.private-archive.v3"
|
|
117
|
+
|
|
118
|
+
|
|
115
119
|
class ForgePublicResearchSource(ForgeResearchSource):
|
|
116
|
-
"""Exact private archive plus safe proposed public credit; backend decides release.
|
|
120
|
+
"""Exact private archive plus safe proposed public credit; backend decides release.
|
|
121
|
+
|
|
122
|
+
Mirrors backend ``packages/contributions/forge_release.py``. ``revision_reference``
|
|
123
|
+
(Forge decision 0001, ``forge.revision-reference.v1``) binds the selected export's
|
|
124
|
+
producer, operation and time, not only its payload; ``archive_schema_version`` names
|
|
125
|
+
the private archive version that carries those references (v3). The backend public
|
|
126
|
+
review policy refuses a Forge-origin public source that omits either
|
|
127
|
+
(``forge_revision_reference_required``, ``forge_archive_v3_required``); they stay
|
|
128
|
+
optional on the wire so older private registrations still decode.
|
|
129
|
+
"""
|
|
117
130
|
|
|
118
131
|
schema_version: Literal["synth.index.forge-source.v2"] = "synth.index.forge-source.v2"
|
|
119
132
|
archive_publication_id: ArtifactUuid
|
|
120
133
|
archive_manifest_digest_sha256: Digest
|
|
121
134
|
public_provenance: PublicScientificProvenance
|
|
135
|
+
revision_reference: RevisionReference | None = None
|
|
136
|
+
archive_schema_version: Literal["forge.private-archive.v3"] | None = None
|
|
137
|
+
|
|
138
|
+
@model_validator(mode="after")
|
|
139
|
+
def provenance_pin_names_the_export(self):
|
|
140
|
+
if (
|
|
141
|
+
self.revision_reference is not None
|
|
142
|
+
and self.revision_reference.reference != self.export
|
|
143
|
+
):
|
|
144
|
+
raise ValueError("revision reference must name the exported revision")
|
|
145
|
+
return self
|
|
122
146
|
|
|
123
147
|
|
|
124
148
|
def _legacy_source_version(value):
|
{synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/__init__.py
RENAMED
|
@@ -428,6 +428,7 @@ from synth_ai.sdk.research.contracts.runtime_stream_snapshot import (
|
|
|
428
428
|
RuntimeWorkersSnapshot,
|
|
429
429
|
SwarmRuntimeSnapshot,
|
|
430
430
|
)
|
|
431
|
+
from synth_ai.sdk.research.contracts.swarm_controls import SwarmControlReceipt
|
|
431
432
|
from synth_ai.sdk.research.contracts.swarms import (
|
|
432
433
|
ActiveActorModel,
|
|
433
434
|
ActorHarness,
|
|
@@ -610,6 +611,7 @@ def __getattr__(name: str) -> object:
|
|
|
610
611
|
|
|
611
612
|
|
|
612
613
|
__all__ = [
|
|
614
|
+
"SwarmControlReceipt",
|
|
613
615
|
"AiCacheMode",
|
|
614
616
|
"AiCachePolicy",
|
|
615
617
|
"ActiveActorModel",
|
|
@@ -10,6 +10,7 @@ from .contracts import (
|
|
|
10
10
|
Contract,
|
|
11
11
|
Digest,
|
|
12
12
|
ExactReference,
|
|
13
|
+
ForgeError,
|
|
13
14
|
Identifier,
|
|
14
15
|
Producer,
|
|
15
16
|
Scope,
|
|
@@ -67,6 +68,35 @@ class RecordRevision(Contract):
|
|
|
67
68
|
recorded_at: AwareDatetime
|
|
68
69
|
|
|
69
70
|
|
|
71
|
+
REVISION_REFERENCE_V1 = "forge.revision-reference.v1"
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class RevisionReference(Contract):
|
|
75
|
+
"""Exact identity of one complete retained revision, provenance included.
|
|
76
|
+
|
|
77
|
+
See docs/decisions/0001. ``reference.digest_sha256`` keeps its payload-only
|
|
78
|
+
meaning; ``document_digest_sha256`` binds producer, operation and time too.
|
|
79
|
+
It proves the document Forge recorded, not external producer attestation.
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
schema_version: Literal["forge.revision-reference.v1"] = REVISION_REFERENCE_V1
|
|
83
|
+
reference: ExactReference
|
|
84
|
+
document_digest_sha256: Digest
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def revision_reference(record: RecordRevision) -> RevisionReference:
|
|
88
|
+
record = RecordRevision.model_validate(record.model_dump(mode="json"))
|
|
89
|
+
if (
|
|
90
|
+
record.reference.authority != "forge"
|
|
91
|
+
or record.reference.kind != record.payload.kind
|
|
92
|
+
or record.reference.digest_sha256 != contract_digest(record.payload)
|
|
93
|
+
):
|
|
94
|
+
raise ForgeError("reference_conflict", "record differs from exact source bytes")
|
|
95
|
+
return RevisionReference(
|
|
96
|
+
reference=record.reference, document_digest_sha256=contract_digest(record)
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
|
|
70
100
|
class PublicWrite(Contract):
|
|
71
101
|
"""Public intent; backend supplies authenticated producer and canonical scope."""
|
|
72
102
|
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""Receipts for backend-owned native Swarm answer and steer operations.
|
|
2
|
+
|
|
3
|
+
# See: openapi/research-v1.json SmrOrchestraOperationReceiptResponse
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from typing import Literal, cast
|
|
10
|
+
|
|
11
|
+
from synth_ai.core.contracts.json_value import JsonValue
|
|
12
|
+
from synth_ai.sdk.research.contracts._wire import object_value, optional_text, required_text
|
|
13
|
+
from synth_ai.sdk.research.contracts.common import SwarmId
|
|
14
|
+
|
|
15
|
+
ControlKind = Literal["action_answer", "steer"]
|
|
16
|
+
ControlStatus = Literal["accepted", "duplicate"]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass(frozen=True, slots=True)
|
|
20
|
+
class SwarmControlReceipt:
|
|
21
|
+
"""Durable acceptance acknowledgement; execution delivery remains asynchronous."""
|
|
22
|
+
|
|
23
|
+
swarm_id: SwarmId
|
|
24
|
+
operation_id: str
|
|
25
|
+
kind: ControlKind
|
|
26
|
+
status: ControlStatus
|
|
27
|
+
action_id: str | None = None
|
|
28
|
+
interaction_id: str | None = None
|
|
29
|
+
control_seq: int | None = None
|
|
30
|
+
|
|
31
|
+
@classmethod
|
|
32
|
+
def from_wire(cls, value: JsonValue) -> SwarmControlReceipt:
|
|
33
|
+
payload = object_value(value, operation_id="swarm control receipt")
|
|
34
|
+
required = {"run_id", "operation_id", "kind", "status"}
|
|
35
|
+
allowed = required | {"action_id", "interaction_id", "control_seq"}
|
|
36
|
+
if required - payload.keys() or payload.keys() - allowed:
|
|
37
|
+
raise ValueError("swarm control receipt fields drifted")
|
|
38
|
+
kind, status = required_text(payload, "kind"), required_text(payload, "status")
|
|
39
|
+
if kind not in ("action_answer", "steer") or status not in ("accepted", "duplicate"):
|
|
40
|
+
raise ValueError("swarm control receipt vocabulary drifted")
|
|
41
|
+
sequence = payload.get("control_seq")
|
|
42
|
+
if sequence is not None and (type(sequence) is not int or sequence < 0):
|
|
43
|
+
raise ValueError("swarm control sequence must be a non-negative integer")
|
|
44
|
+
return cls(
|
|
45
|
+
SwarmId(required_text(payload, "run_id")),
|
|
46
|
+
required_text(payload, "operation_id"),
|
|
47
|
+
cast(ControlKind, kind),
|
|
48
|
+
cast(ControlStatus, status),
|
|
49
|
+
optional_text(payload, "action_id"),
|
|
50
|
+
optional_text(payload, "interaction_id"),
|
|
51
|
+
cast(int | None, sequence),
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
__all__ = ["SwarmControlReceipt"]
|
|
@@ -22,6 +22,16 @@ def _operation(
|
|
|
22
22
|
RESEARCH_OPERATIONS = {
|
|
23
23
|
operation.operation_id: operation
|
|
24
24
|
for operation in (
|
|
25
|
+
_operation(
|
|
26
|
+
"steer_run", HttpMethod.POST, "/smr/runs/{run_id}/steer", mutation=True, idempotent=True
|
|
27
|
+
),
|
|
28
|
+
_operation(
|
|
29
|
+
"answer_run_action",
|
|
30
|
+
HttpMethod.POST,
|
|
31
|
+
"/smr/runs/{run_id}/actions/{action_id}/answer",
|
|
32
|
+
mutation=True,
|
|
33
|
+
idempotent=True,
|
|
34
|
+
),
|
|
25
35
|
_operation(
|
|
26
36
|
"getExactDatasetRevision",
|
|
27
37
|
HttpMethod.GET,
|
|
@@ -5,6 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
import asyncio
|
|
6
6
|
import time
|
|
7
7
|
from collections.abc import AsyncIterator, Iterator, Mapping
|
|
8
|
+
from urllib.parse import quote
|
|
8
9
|
|
|
9
10
|
from synth_ai.core.contracts.json_value import JsonObject, JsonValue
|
|
10
11
|
from synth_ai.core.errors import SynthError
|
|
@@ -19,6 +20,7 @@ from synth_ai.sdk.research.contracts.common import (
|
|
|
19
20
|
ProjectId,
|
|
20
21
|
SwarmId,
|
|
21
22
|
WorkProductId,
|
|
23
|
+
require_text,
|
|
22
24
|
)
|
|
23
25
|
from synth_ai.sdk.research.contracts.evidence import (
|
|
24
26
|
ContentDisposition,
|
|
@@ -26,6 +28,7 @@ from synth_ai.sdk.research.contracts.evidence import (
|
|
|
26
28
|
)
|
|
27
29
|
from synth_ai.sdk.research.contracts.resource_settlement import RunResourceSettlement
|
|
28
30
|
from synth_ai.sdk.research.contracts.status import SwarmStatus
|
|
31
|
+
from synth_ai.sdk.research.contracts.swarm_controls import SwarmControlReceipt
|
|
29
32
|
from synth_ai.sdk.research.contracts.swarm_rollouts import SwarmRollout, swarm_rollouts_from_wire
|
|
30
33
|
from synth_ai.sdk.research.contracts.swarms import (
|
|
31
34
|
BranchResult,
|
|
@@ -100,6 +103,31 @@ def _stream_timeout(timeout_seconds: float | None) -> float | None:
|
|
|
100
103
|
return timeout_seconds
|
|
101
104
|
|
|
102
105
|
|
|
106
|
+
def _control_body(field: str, text: str, idempotency_key: str | None) -> JsonObject:
|
|
107
|
+
if not isinstance(text, str) or not text.strip() or len(text.encode("utf-8")) > 16_384:
|
|
108
|
+
raise ValueError(f"{field} must be nonblank and at most 16384 UTF-8 bytes")
|
|
109
|
+
body: JsonObject = {field: text}
|
|
110
|
+
if idempotency_key is not None:
|
|
111
|
+
key = require_text(idempotency_key, field_name="idempotency_key")
|
|
112
|
+
if len(key) > 255:
|
|
113
|
+
raise ValueError("idempotency_key must be at most 255 characters")
|
|
114
|
+
body["idempotency_key"] = key
|
|
115
|
+
return body
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _control_receipt(
|
|
119
|
+
value: JsonValue, swarm_id: SwarmId, kind: str, action_id: str | None = None
|
|
120
|
+
) -> SwarmControlReceipt:
|
|
121
|
+
receipt = SwarmControlReceipt.from_wire(value)
|
|
122
|
+
if (
|
|
123
|
+
receipt.swarm_id != swarm_id
|
|
124
|
+
or receipt.kind != kind
|
|
125
|
+
or (action_id is not None and receipt.action_id != action_id)
|
|
126
|
+
):
|
|
127
|
+
raise ValueError("swarm control receipt does not match the request scope")
|
|
128
|
+
return receipt
|
|
129
|
+
|
|
130
|
+
|
|
103
131
|
class SwarmHandle:
|
|
104
132
|
"""Handle returned when creating a Swarm."""
|
|
105
133
|
|
|
@@ -281,6 +309,18 @@ class SwarmHandle:
|
|
|
281
309
|
timeout_seconds=timeout_seconds,
|
|
282
310
|
)
|
|
283
311
|
|
|
312
|
+
def steer(self, message: str, *, idempotency_key: str | None = None) -> SwarmControlReceipt:
|
|
313
|
+
"""Request native steering; acceptance is distinct from execution delivery."""
|
|
314
|
+
return self._api.steer(self.swarm_id, message, idempotency_key=idempotency_key)
|
|
315
|
+
|
|
316
|
+
def answer_action(
|
|
317
|
+
self, action_id: str, response_text: str, *, idempotency_key: str | None = None
|
|
318
|
+
) -> SwarmControlReceipt:
|
|
319
|
+
"""Answer the correlated action exposed by authoritative native history."""
|
|
320
|
+
return self._api.answer_action(
|
|
321
|
+
self.swarm_id, action_id, response_text, idempotency_key=idempotency_key
|
|
322
|
+
)
|
|
323
|
+
|
|
284
324
|
|
|
285
325
|
class SwarmsAPI:
|
|
286
326
|
"""Swarm lifecycle operations."""
|
|
@@ -731,6 +771,38 @@ class SwarmsAPI:
|
|
|
731
771
|
):
|
|
732
772
|
yield decode_swarm_event(event)
|
|
733
773
|
|
|
774
|
+
def steer(
|
|
775
|
+
self, swarm_id: SwarmId, message: str, *, idempotency_key: str | None = None
|
|
776
|
+
) -> SwarmControlReceipt:
|
|
777
|
+
"""Steer through the backend's native control ledger; reuse a key for retries."""
|
|
778
|
+
value = self._transport.execute(
|
|
779
|
+
_request(
|
|
780
|
+
"steer_run",
|
|
781
|
+
f"/smr/runs/{swarm_id}/steer",
|
|
782
|
+
body=_control_body("message", message, idempotency_key),
|
|
783
|
+
)
|
|
784
|
+
)
|
|
785
|
+
return _control_receipt(value, swarm_id, "steer")
|
|
786
|
+
|
|
787
|
+
def answer_action(
|
|
788
|
+
self,
|
|
789
|
+
swarm_id: SwarmId,
|
|
790
|
+
action_id: str,
|
|
791
|
+
response_text: str,
|
|
792
|
+
*,
|
|
793
|
+
idempotency_key: str | None = None,
|
|
794
|
+
) -> SwarmControlReceipt:
|
|
795
|
+
"""Answer a native action; changed bytes with the same key conflict server-side."""
|
|
796
|
+
action = require_text(action_id, field_name="action_id")
|
|
797
|
+
value = self._transport.execute(
|
|
798
|
+
_request(
|
|
799
|
+
"answer_run_action",
|
|
800
|
+
f"/smr/runs/{swarm_id}/actions/{quote(action, safe='')}/answer",
|
|
801
|
+
body=_control_body("response_text", response_text, idempotency_key),
|
|
802
|
+
)
|
|
803
|
+
)
|
|
804
|
+
return _control_receipt(value, swarm_id, "action_answer", action)
|
|
805
|
+
|
|
734
806
|
|
|
735
807
|
class AsyncSwarmHandle:
|
|
736
808
|
"""Handle returned when creating a Swarm."""
|
|
@@ -918,6 +990,20 @@ class AsyncSwarmHandle:
|
|
|
918
990
|
):
|
|
919
991
|
yield event
|
|
920
992
|
|
|
993
|
+
async def steer(
|
|
994
|
+
self, message: str, *, idempotency_key: str | None = None
|
|
995
|
+
) -> SwarmControlReceipt:
|
|
996
|
+
"""Request native steering; acceptance is distinct from execution delivery."""
|
|
997
|
+
return await self._api.steer(self.swarm_id, message, idempotency_key=idempotency_key)
|
|
998
|
+
|
|
999
|
+
async def answer_action(
|
|
1000
|
+
self, action_id: str, response_text: str, *, idempotency_key: str | None = None
|
|
1001
|
+
) -> SwarmControlReceipt:
|
|
1002
|
+
"""Answer the correlated action exposed by authoritative native history."""
|
|
1003
|
+
return await self._api.answer_action(
|
|
1004
|
+
self.swarm_id, action_id, response_text, idempotency_key=idempotency_key
|
|
1005
|
+
)
|
|
1006
|
+
|
|
921
1007
|
|
|
922
1008
|
class AsyncSwarmsAPI:
|
|
923
1009
|
"""Swarm lifecycle operations."""
|
|
@@ -1340,6 +1426,38 @@ class AsyncSwarmsAPI:
|
|
|
1340
1426
|
):
|
|
1341
1427
|
yield decode_swarm_event(event)
|
|
1342
1428
|
|
|
1429
|
+
async def steer(
|
|
1430
|
+
self, swarm_id: SwarmId, message: str, *, idempotency_key: str | None = None
|
|
1431
|
+
) -> SwarmControlReceipt:
|
|
1432
|
+
"""Steer through the backend's native control ledger; reuse a key for retries."""
|
|
1433
|
+
value = await self._transport.execute(
|
|
1434
|
+
_request(
|
|
1435
|
+
"steer_run",
|
|
1436
|
+
f"/smr/runs/{swarm_id}/steer",
|
|
1437
|
+
body=_control_body("message", message, idempotency_key),
|
|
1438
|
+
)
|
|
1439
|
+
)
|
|
1440
|
+
return _control_receipt(value, swarm_id, "steer")
|
|
1441
|
+
|
|
1442
|
+
async def answer_action(
|
|
1443
|
+
self,
|
|
1444
|
+
swarm_id: SwarmId,
|
|
1445
|
+
action_id: str,
|
|
1446
|
+
response_text: str,
|
|
1447
|
+
*,
|
|
1448
|
+
idempotency_key: str | None = None,
|
|
1449
|
+
) -> SwarmControlReceipt:
|
|
1450
|
+
"""Answer a native action; changed bytes with the same key conflict server-side."""
|
|
1451
|
+
action = require_text(action_id, field_name="action_id")
|
|
1452
|
+
value = await self._transport.execute(
|
|
1453
|
+
_request(
|
|
1454
|
+
"answer_run_action",
|
|
1455
|
+
f"/smr/runs/{swarm_id}/actions/{quote(action, safe='')}/answer",
|
|
1456
|
+
body=_control_body("response_text", response_text, idempotency_key),
|
|
1457
|
+
)
|
|
1458
|
+
)
|
|
1459
|
+
return _control_receipt(value, swarm_id, "action_answer", action)
|
|
1460
|
+
|
|
1343
1461
|
|
|
1344
1462
|
ResearchSwarmHandle = SwarmHandle
|
|
1345
1463
|
ResearchSwarmsAPI = SwarmsAPI
|
|
@@ -276,6 +276,7 @@ synth_ai/sdk/research/contracts/smr_runtime_kinds.py
|
|
|
276
276
|
synth_ai/sdk/research/contracts/smr_tool_providers.py
|
|
277
277
|
synth_ai/sdk/research/contracts/smr_work_modes.py
|
|
278
278
|
synth_ai/sdk/research/contracts/status.py
|
|
279
|
+
synth_ai/sdk/research/contracts/swarm_controls.py
|
|
279
280
|
synth_ai/sdk/research/contracts/swarm_rollouts.py
|
|
280
281
|
synth_ai/sdk/research/contracts/swarms.py
|
|
281
282
|
synth_ai/sdk/research/contracts/tag.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|