synth-ai 0.21.2.dev658__tar.gz → 0.21.3.dev660__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.21.2.dev658/synth_ai.egg-info → synth_ai-0.21.3.dev660}/PKG-INFO +1 -1
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/openapi/research-v1.json +2 -1
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/pyproject.toml +1 -1
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/client.py +83 -13
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/public_search.py +25 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/evidence.py +43 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/intern_blockers.py +40 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/intern_resources.py +59 -1
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/intern_usage.py +72 -1
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/projects.py +2 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/resource_settlement.py +39 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_control.py +10 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_state.py +2 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_run_policy.py +1 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/swarm_rollouts.py +230 -3
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/swarms.py +74 -2
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/transcript.py +43 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/usage.py +1 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/workspaces.py +18 -2
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/intern_blockers.py +125 -6
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/operations.py +0 -6
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/swarms.py +42 -2
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660/synth_ai.egg-info}/PKG-INFO +1 -1
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/LICENSE +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/MANIFEST.in +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/README.md +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/openapi/index-v1.json +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/openapi/messaging-v1.json +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/setup.cfg +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/setup.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/README.md +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/__main__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/AGENTS.md +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/README.md +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/__main__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/index.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/main.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/research.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/research_environments.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/research_image_releases.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/research_projects.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/README.md +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/auth/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/auth/credentials.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/contracts/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/contracts/json_value.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/contracts/pagination.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/errors.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/http/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/http/async_transport.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/http/request.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/http/retry.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/http/streaming.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/http/transport.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/research/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/utils/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/utils/env.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/utils/log_filter.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/utils/paths.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/utils/urls.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/README.md +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/__main__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/objective_tools.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/registry.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/request_models.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/server.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/approvals.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/artifacts.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/datasets.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/environments.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/exports.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/factories.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/factory_results.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/files.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/image_releases.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/index.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/integrations.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/intern_program.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/local_files.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/logs.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/models.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/outputs.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/policy_schemas.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/progress.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/project_data.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/projects.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/prs.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/readiness.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/repos.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/research_intern.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/resources.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/runs.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/trained_models.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/usage.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/visuals.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/workspace_inputs.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/pools.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/py.typed +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/README.md +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/AGENT_SETUP_PROMPT.md +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/README.md +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/agent_policy.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/artifacts.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/catalog.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/client.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/contracts.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/contributions.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/errors.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/lifecycle.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/package.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/public.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/research_intake.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/retry.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/search.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/submission.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/timeouts.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/transfer.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/usage_accounting.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/wallet_search.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/messaging/README.md +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/messaging/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/messaging/client.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/messaging/contracts.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/optimizers/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/optimizers/client.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/optimizers/contracts.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/pagination.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/_internal/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/_internal/crypto.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/_internal/env.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/_internal/urls.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/account.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/advanced.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/advanced_factories.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/advanced_swarms.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/artifacts.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/auth.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/client.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/container_pools/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/container_pools/api.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/container_pools/contracts.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/container_pools/operations.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/container_pools/packaging.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/_activity_wire.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/_environment_wire.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/_transcript_wire.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/_wire.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/activity.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/activity_items.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/actor_images.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/billing.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/canonical_usage.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/checkpoints.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/cloud_deployment_claims.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/cloud_deployments.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/common.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/dataset_revisions.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/deliveries.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/dev_environment_evidence.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/economics.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/environment_manifest.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/environments.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/factories.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/factory_evidence.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/factory_lenses.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/factory_operations.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/factory_role_receipts.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/failure.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/image_releases.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/intern_grants.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/intern_program.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/limit_evidence.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/local_execution_profile.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/operator_evidence.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/project.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/project_data.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/project_runtime.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/project_workspace.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/project_workspace_evidence.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/promotions.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/research_intern.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_authority.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_diagnostics.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_events.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_execution.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_launch.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_observability.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_timeline.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/runtime_image.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/runtime_intent.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/runtime_stream.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/runtime_stream_snapshot.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/scientific_integrity.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_actor_models.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_actor_policy_data.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_agent_harnesses.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_agent_kinds.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_agent_models.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_branching.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_credential_providers.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_environment_kinds.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_evidence_obligations.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_funding_sources.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_horizons.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_host_kinds.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_inference_providers.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_network_topology.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_providers.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_resource_kinds.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_roles.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_runbooks.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_runnable_project.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_runtime_kinds.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_tool_providers.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_work_modes.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/status.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/tag.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/traces.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/types.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/visuals.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/wire_models.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/wire_models_README.md +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/work_products.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/economics.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/efforts.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/environments.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/errors.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/events.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/experiments.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/facade.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/factories.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/factory_storage.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/image_releases.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/intern_program.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/knowledge.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/models.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/project_data.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/project_deliveries.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/project_workspaces.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/projects.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/public.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/readouts.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/research_intern.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/secrets.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/README.md +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/_base.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/_client_helpers.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/_run_authority_mixin.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/approvals.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/billing.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/client.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/cloud_deployments.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/config.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/cost.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/datasets.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/dev_environments.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/environments.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/exports.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/factories.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/factory_evidence.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/files.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/github.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/image_releases.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/images.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/logs.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/models.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/outputs.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/progress.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/project.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/projects.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/prs.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/readiness.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/repositories.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/runs.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/secrets.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/setup.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/tag.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/trained_models.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/transport.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/usage.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/work_products.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/workspace_inputs.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/surface_parity.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/traces.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/transport/__init__.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/transport/http.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/transport/pagination.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/version.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/visuals.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/wiki.py +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai.egg-info/SOURCES.txt +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai.egg-info/dependency_links.txt +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai.egg-info/entry_points.txt +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai.egg-info/requires.txt +0 -0
- {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai.egg-info/top_level.txt +0 -0
|
@@ -2087,6 +2087,7 @@
|
|
|
2087
2087
|
"enterprise",
|
|
2088
2088
|
"demo_internal",
|
|
2089
2089
|
"private_alpha",
|
|
2090
|
+
"internal_test",
|
|
2090
2091
|
"other"
|
|
2091
2092
|
],
|
|
2092
2093
|
"title": "BillingProfileCode",
|
|
@@ -23071,7 +23072,7 @@
|
|
|
23071
23072
|
"type": "null"
|
|
23072
23073
|
}
|
|
23073
23074
|
],
|
|
23074
|
-
"description": "Override one shared agent model for this run. Shared top-level values are 'baseten/moonshotai/Kimi-K3', 'baseten/zai-org/GLM-5.2', 'cursor/composer-2.5', 'deepseek/deepseek-v4-flash', 'deepseek/deepseek-v4-flash-direct', 'deepseek/deepseek-v4-pro', 'deepseek/deepseek-v4-pro-direct', 'gpt-5.4', 'gpt-5.4-mini', 'gpt-5.5', 'gpt-5.6-luna', 'modal/moonshotai/Kimi-K3', 'openrouter/openai/gpt-5.6-luna', 'openrouter/poolside/laguna-s-2.1', 'poolside/laguna-s-2.1', 'synth_internal/laguna-s-2.1-nvfp4'
|
|
23075
|
+
"description": "Override one shared agent model for this run. Shared top-level values are 'baseten/moonshotai/Kimi-K3', 'baseten/zai-org/GLM-5.2', 'cursor/composer-2.5', 'deepseek/deepseek-v4-flash', 'deepseek/deepseek-v4-flash-direct', 'deepseek/deepseek-v4-pro', 'deepseek/deepseek-v4-pro-direct', 'gpt-5.4', 'gpt-5.4-mini', 'gpt-5.5', 'gpt-5.6-luna', 'modal/moonshotai/Kimi-K3', 'openrouter/openai/gpt-5.6-luna', 'openrouter/poolside/laguna-s-2.1', 'poolside/laguna-s-2.1', 'synth_internal/laguna-s-2.1-nvfp4'. Use actor_model_overrides for actor-specific model selection."
|
|
23075
23076
|
},
|
|
23076
23077
|
"agent_model_params": {
|
|
23077
23078
|
"anyOf": [
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "synth-ai"
|
|
3
|
-
version = "0.21.
|
|
3
|
+
version = "0.21.3.dev660"
|
|
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"}]
|
|
@@ -29,10 +29,18 @@ def _resolve_base_url(base_url: str | None) -> str:
|
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
class SynthClient:
|
|
32
|
-
"""
|
|
32
|
+
"""Synchronous entry point for Index, Research, Messaging and hosted optimizers.
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
Namespaces and their transports are created lazily. Closing the client closes
|
|
35
|
+
all transports that it opened. Factory APIs remain available for compatibility.
|
|
36
|
+
|
|
37
|
+
Example:
|
|
38
|
+
```python
|
|
39
|
+
from synth_ai import SynthClient
|
|
40
|
+
|
|
41
|
+
with SynthClient(api_key="YOUR_SYNTH_API_KEY") as client:
|
|
42
|
+
index = client.index
|
|
43
|
+
```
|
|
36
44
|
"""
|
|
37
45
|
|
|
38
46
|
def __init__(
|
|
@@ -42,6 +50,14 @@ class SynthClient:
|
|
|
42
50
|
base_url: str | None = None,
|
|
43
51
|
timeout_seconds: float | None = None,
|
|
44
52
|
) -> None:
|
|
53
|
+
"""Configure credentials, endpoint and transport timeouts without making requests.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
api_key: Explicit Synth API credential; None uses the configured credential resolver.
|
|
57
|
+
base_url: Backend URL override; None uses the SDK's configured backend base URL.
|
|
58
|
+
timeout_seconds: Transport timeout in seconds. None uses 30 seconds for
|
|
59
|
+
Research, Messaging and Optimizers, and the Index transport default for Index.
|
|
60
|
+
"""
|
|
45
61
|
self.api_key = _resolve_api_key(api_key)
|
|
46
62
|
self.base_url = _resolve_base_url(base_url)
|
|
47
63
|
self.timeout_seconds = 30.0 if timeout_seconds is None else timeout_seconds
|
|
@@ -56,7 +72,11 @@ class SynthClient:
|
|
|
56
72
|
|
|
57
73
|
@property
|
|
58
74
|
def index(self) -> IndexAPI:
|
|
59
|
-
"""
|
|
75
|
+
"""Return the lazily initialized Index namespace.
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
IndexAPI using this client's credential, backend URL and Index timeout.
|
|
79
|
+
"""
|
|
60
80
|
if self._index_api is None:
|
|
61
81
|
from synth_ai.core.http.transport import HttpTransport
|
|
62
82
|
from synth_ai.sdk.index.client import IndexAPI
|
|
@@ -71,7 +91,11 @@ class SynthClient:
|
|
|
71
91
|
|
|
72
92
|
@property
|
|
73
93
|
def messaging(self) -> MessagingClient:
|
|
74
|
-
"""
|
|
94
|
+
"""Return the lazily initialized Messaging namespace.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
MessagingClient for typed threads, history and explicit Workshop device grants.
|
|
98
|
+
"""
|
|
75
99
|
if self._messaging_client is None:
|
|
76
100
|
from synth_ai.sdk.messaging import MessagingClient
|
|
77
101
|
|
|
@@ -84,7 +108,11 @@ class SynthClient:
|
|
|
84
108
|
|
|
85
109
|
@property
|
|
86
110
|
def research(self) -> ResearchClient:
|
|
87
|
-
"""
|
|
111
|
+
"""Return the lazily initialized Research namespace.
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
ResearchClient for hosted projects and swarms, with compatibility Factory APIs.
|
|
115
|
+
"""
|
|
88
116
|
if self._research_client is None:
|
|
89
117
|
from synth_ai.sdk.research.facade import ResearchClient
|
|
90
118
|
|
|
@@ -113,7 +141,11 @@ class SynthClient:
|
|
|
113
141
|
|
|
114
142
|
@property
|
|
115
143
|
def optimizers(self) -> OptimizersClient:
|
|
116
|
-
"""
|
|
144
|
+
"""Return the lazily initialized hosted Optimizers namespace.
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
OptimizersClient for hosted training model discovery and saved-LoRA lineage.
|
|
148
|
+
"""
|
|
117
149
|
if self._optimizers_client is None:
|
|
118
150
|
from synth_ai.sdk.optimizers import OptimizersClient
|
|
119
151
|
|
|
@@ -132,7 +164,17 @@ class SynthClient:
|
|
|
132
164
|
|
|
133
165
|
|
|
134
166
|
class AsyncSynthClient:
|
|
135
|
-
"""
|
|
167
|
+
"""Asynchronous entry point with lazily initialized SDK namespaces.
|
|
168
|
+
|
|
169
|
+
Example:
|
|
170
|
+
```python
|
|
171
|
+
from synth_ai import AsyncSynthClient
|
|
172
|
+
|
|
173
|
+
async def inspect_namespace():
|
|
174
|
+
async with AsyncSynthClient(api_key="YOUR_SYNTH_API_KEY") as client:
|
|
175
|
+
index = client.index
|
|
176
|
+
```
|
|
177
|
+
"""
|
|
136
178
|
|
|
137
179
|
def __init__(
|
|
138
180
|
self,
|
|
@@ -141,6 +183,14 @@ class AsyncSynthClient:
|
|
|
141
183
|
base_url: str | None = None,
|
|
142
184
|
timeout_seconds: float | None = None,
|
|
143
185
|
) -> None:
|
|
186
|
+
"""Configure credentials, endpoint and transport timeouts without making requests.
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
api_key: Explicit Synth API credential; None uses the configured credential resolver.
|
|
190
|
+
base_url: Backend URL override; None uses the SDK's configured backend base URL.
|
|
191
|
+
timeout_seconds: Transport timeout in seconds. None uses 30 seconds for
|
|
192
|
+
Research, Messaging and Optimizers, and the Index transport default for Index.
|
|
193
|
+
"""
|
|
144
194
|
self.api_key = _resolve_api_key(api_key)
|
|
145
195
|
self.base_url = _resolve_base_url(base_url)
|
|
146
196
|
self.timeout_seconds = 30.0 if timeout_seconds is None else timeout_seconds
|
|
@@ -156,7 +206,11 @@ class AsyncSynthClient:
|
|
|
156
206
|
|
|
157
207
|
@property
|
|
158
208
|
def index(self) -> AsyncIndexAPI:
|
|
159
|
-
"""
|
|
209
|
+
"""Return the lazily initialized asynchronous Index namespace.
|
|
210
|
+
|
|
211
|
+
Returns:
|
|
212
|
+
AsyncIndexAPI using this client's credential, backend URL and Index timeout.
|
|
213
|
+
"""
|
|
160
214
|
if self._index_api is None:
|
|
161
215
|
from synth_ai.core.http.async_transport import AsyncHttpTransport
|
|
162
216
|
from synth_ai.sdk.index.client import AsyncIndexAPI
|
|
@@ -171,7 +225,11 @@ class AsyncSynthClient:
|
|
|
171
225
|
|
|
172
226
|
@property
|
|
173
227
|
def messaging(self) -> AsyncMessagingClient:
|
|
174
|
-
"""
|
|
228
|
+
"""Return the lazily initialized asynchronous Messaging namespace.
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
AsyncMessagingClient for threads, history and explicit Workshop device grants.
|
|
232
|
+
"""
|
|
175
233
|
if self._async_messaging_client is None:
|
|
176
234
|
from synth_ai.sdk.messaging import AsyncMessagingClient
|
|
177
235
|
|
|
@@ -184,7 +242,11 @@ class AsyncSynthClient:
|
|
|
184
242
|
|
|
185
243
|
@property
|
|
186
244
|
def research(self) -> AsyncResearchClient:
|
|
187
|
-
"""
|
|
245
|
+
"""Return the lazily initialized asynchronous Research namespace.
|
|
246
|
+
|
|
247
|
+
Returns:
|
|
248
|
+
AsyncResearchClient using this client's credential, backend URL and timeout.
|
|
249
|
+
"""
|
|
188
250
|
if self._async_research_client is None:
|
|
189
251
|
from synth_ai.sdk.research import AsyncResearchClient
|
|
190
252
|
|
|
@@ -216,7 +278,11 @@ class AsyncSynthClient:
|
|
|
216
278
|
|
|
217
279
|
@property
|
|
218
280
|
def async_research(self) -> AsyncResearchClient:
|
|
219
|
-
"""Deprecated alias for :attr:`research`.
|
|
281
|
+
"""Deprecated alias for :attr:`research`.
|
|
282
|
+
|
|
283
|
+
Returns:
|
|
284
|
+
The same AsyncResearchClient instance as research, after a deprecation warning.
|
|
285
|
+
"""
|
|
220
286
|
warnings.warn(
|
|
221
287
|
"AsyncSynthClient.async_research is deprecated; use .research.",
|
|
222
288
|
DeprecationWarning,
|
|
@@ -253,7 +319,11 @@ class AsyncSynthClient:
|
|
|
253
319
|
|
|
254
320
|
@property
|
|
255
321
|
def optimizers(self) -> AsyncOptimizersClient:
|
|
256
|
-
"""
|
|
322
|
+
"""Return the lazily initialized asynchronous hosted Optimizers namespace.
|
|
323
|
+
|
|
324
|
+
Returns:
|
|
325
|
+
AsyncOptimizersClient using this client's credential, backend URL and timeout.
|
|
326
|
+
"""
|
|
257
327
|
if self._async_optimizers_client is None:
|
|
258
328
|
from synth_ai.sdk.optimizers import AsyncOptimizersClient
|
|
259
329
|
|
|
@@ -143,6 +143,15 @@ class PublicSearchRateLimitedError(PublicSearchError):
|
|
|
143
143
|
failure: SynthFailure | None = None,
|
|
144
144
|
status: int | None = 429,
|
|
145
145
|
) -> None:
|
|
146
|
+
"""Preserve the rate-limit scope and server retry guidance.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
message: Human-readable server failure message.
|
|
150
|
+
scope: Server rate-limit scope, or None when the server omits it.
|
|
151
|
+
retry_after_s: Server retry delay in seconds, or None when unavailable.
|
|
152
|
+
failure: Structured Synth failure envelope, when available.
|
|
153
|
+
status: HTTP status associated with the failure; defaults to 429.
|
|
154
|
+
"""
|
|
146
155
|
super().__init__(message, failure=failure, status=status)
|
|
147
156
|
self.scope = scope
|
|
148
157
|
self.retry_after_s = retry_after_s
|
|
@@ -181,6 +190,15 @@ class PublicSearchBudgetExhaustedError(PublicSearchUnavailableError):
|
|
|
181
190
|
failure: SynthFailure | None = None,
|
|
182
191
|
status: int | None = 503,
|
|
183
192
|
) -> None:
|
|
193
|
+
"""Preserve the exhausted budget scope and server retry guidance.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
message: Human-readable server failure message.
|
|
197
|
+
scope: Known exhausted budget scope, or None when the server omits it.
|
|
198
|
+
retry_after_s: Server retry delay in seconds, or None when unavailable.
|
|
199
|
+
failure: Structured Synth failure envelope, when available.
|
|
200
|
+
status: HTTP status associated with the failure; defaults to 503.
|
|
201
|
+
"""
|
|
184
202
|
super().__init__(message, failure=failure, status=status)
|
|
185
203
|
self.scope = scope
|
|
186
204
|
self.retry_after_s = retry_after_s
|
|
@@ -836,6 +854,13 @@ def public_search_result_payload(result: PublicSearchResult) -> dict[str, Any]:
|
|
|
836
854
|
|
|
837
855
|
Carries no search token. ``route`` names the anonymous public route so a
|
|
838
856
|
caller can tell it from a keyed (paid) result without inspecting charges.
|
|
857
|
+
|
|
858
|
+
Args:
|
|
859
|
+
result: Delivered public search envelope to project into JSON-compatible values.
|
|
860
|
+
|
|
861
|
+
Returns:
|
|
862
|
+
Public route, search identity, status, response, citations and charge metadata,
|
|
863
|
+
excluding the per-search credential.
|
|
839
864
|
"""
|
|
840
865
|
return {
|
|
841
866
|
"route": "public",
|
{synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/evidence.py
RENAMED
|
@@ -281,6 +281,7 @@ class EvidenceFreshness:
|
|
|
281
281
|
run_is_terminal: bool
|
|
282
282
|
# Backend SmrSwarmEvidenceFreshnessResponse.tool_call_count (default 0);
|
|
283
283
|
# older backends omit it, so it is accepted but not required.
|
|
284
|
+
#: Non-negative recorded tool-call count; defaults to zero for older backend responses.
|
|
284
285
|
tool_call_count: int = 0
|
|
285
286
|
|
|
286
287
|
@classmethod
|
|
@@ -312,6 +313,7 @@ class EvidenceFreshness:
|
|
|
312
313
|
|
|
313
314
|
|
|
314
315
|
class SwarmToolCallStatus(StrEnum):
|
|
316
|
+
"""Durable MCP invocation outcomes, including unresolved tool names."""
|
|
315
317
|
SUCCEEDED = "succeeded"
|
|
316
318
|
FAILED = "failed"
|
|
317
319
|
UNKNOWN_TOOL = "unknown_tool"
|
|
@@ -341,23 +343,58 @@ class SwarmToolCallEvidence:
|
|
|
341
343
|
|
|
342
344
|
Mirrors backend ``SmrSwarmToolCallEvidenceResponse``; arguments are only a
|
|
343
345
|
digest, never the values.
|
|
346
|
+
|
|
347
|
+
```python
|
|
348
|
+
from synth_ai.sdk.research.contracts.evidence import SwarmToolCallEvidence
|
|
349
|
+
|
|
350
|
+
from datetime import datetime, timezone
|
|
351
|
+
from synth_ai.sdk.research.contracts.evidence import SwarmToolCallStatus
|
|
352
|
+
|
|
353
|
+
call = SwarmToolCallEvidence(
|
|
354
|
+
tool_call_id="call-1", actor_role="worker", tool_name="search",
|
|
355
|
+
arguments_digest="sha256:" + "0" * 64,
|
|
356
|
+
status=SwarmToolCallStatus.SUCCEEDED, retryable=False,
|
|
357
|
+
duration_ms=10, occurred_at=datetime.now(timezone.utc),
|
|
358
|
+
)
|
|
359
|
+
assert SwarmToolCallEvidence.from_wire(call.to_wire()) == call
|
|
360
|
+
```
|
|
344
361
|
"""
|
|
345
362
|
|
|
363
|
+
#: Identity of the durable MCP invocation outcome.
|
|
346
364
|
tool_call_id: str
|
|
365
|
+
#: Role of the invoking actor.
|
|
347
366
|
actor_role: str
|
|
367
|
+
#: Invoked MCP tool name.
|
|
348
368
|
tool_name: str
|
|
369
|
+
#: Digest of invocation arguments; raw argument values are not included.
|
|
349
370
|
arguments_digest: str
|
|
371
|
+
#: Recorded invocation outcome.
|
|
350
372
|
status: SwarmToolCallStatus
|
|
373
|
+
#: Backend indication that the failed invocation can be retried.
|
|
351
374
|
retryable: bool
|
|
375
|
+
#: Non-negative invocation duration in milliseconds.
|
|
352
376
|
duration_ms: int
|
|
377
|
+
#: Timestamp of the invocation outcome.
|
|
353
378
|
occurred_at: datetime
|
|
379
|
+
#: Stable identity of the invoking actor, when recorded.
|
|
354
380
|
stable_actor_key: str | None = None
|
|
381
|
+
#: Invocation correlation key, when recorded.
|
|
355
382
|
correlation_id: str | None = None
|
|
383
|
+
#: MCP bundle containing the tool, when recorded.
|
|
356
384
|
bundle_name: str | None = None
|
|
385
|
+
#: Backend failure code, when recorded.
|
|
357
386
|
error_code: str | None = None
|
|
358
387
|
|
|
359
388
|
@classmethod
|
|
360
389
|
def from_wire(cls, value: JsonValue) -> SwarmToolCallEvidence:
|
|
390
|
+
"""Parse the backend wire representation of SwarmToolCallEvidence.
|
|
391
|
+
|
|
392
|
+
Args:
|
|
393
|
+
value: Backend response object to validate and convert.
|
|
394
|
+
|
|
395
|
+
Returns:
|
|
396
|
+
The parsed SwarmToolCallEvidence with backend values preserved.
|
|
397
|
+
"""
|
|
361
398
|
payload = _exact_object(
|
|
362
399
|
value, label="retrieve_swarm_evidence.tool_calls", fields=_TOOL_CALL_FIELDS
|
|
363
400
|
)
|
|
@@ -377,6 +414,11 @@ class SwarmToolCallEvidence:
|
|
|
377
414
|
)
|
|
378
415
|
|
|
379
416
|
def to_wire(self) -> JsonObject:
|
|
417
|
+
"""Serialize this contract to its backend JSON representation.
|
|
418
|
+
|
|
419
|
+
Returns:
|
|
420
|
+
A new JSON object using backend field names and enum values.
|
|
421
|
+
"""
|
|
380
422
|
return {
|
|
381
423
|
"tool_call_id": self.tool_call_id,
|
|
382
424
|
"stable_actor_key": self.stable_actor_key,
|
|
@@ -400,6 +442,7 @@ class SwarmEvidence:
|
|
|
400
442
|
artifacts: tuple[EvidenceArtifact, ...]
|
|
401
443
|
work_products: tuple[EvidenceWorkProduct, ...]
|
|
402
444
|
freshness: EvidenceFreshness
|
|
445
|
+
#: Durable run-scoped MCP invocation outcomes containing argument digests, never argument values.
|
|
403
446
|
tool_calls: tuple[SwarmToolCallEvidence, ...] = ()
|
|
404
447
|
|
|
405
448
|
def __post_init__(self) -> None:
|
{synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/intern_blockers.py
RENAMED
|
@@ -19,54 +19,90 @@ class _Contract(BaseModel):
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class InternBlockerOpenSyncRequest(_Contract):
|
|
22
|
+
"""Idempotent request to open an operator handoff without resolving the blocker."""
|
|
23
|
+
#: Caller retry key for opening this handoff; 1–512 characters.
|
|
22
24
|
idempotency_key: str = Field(min_length=1, max_length=512)
|
|
23
25
|
|
|
24
26
|
|
|
25
27
|
class InternBlockerHandoffContext(_Contract):
|
|
28
|
+
"""Versioned snapshot of the blocked Async action for operator intervention."""
|
|
29
|
+
#: Version discriminator for the async-blocker handoff context.
|
|
26
30
|
schema_version: Literal["smr.intern-async-blocker-handoff-context.v1"] = (
|
|
27
31
|
"smr.intern-async-blocker-handoff-context.v1"
|
|
28
32
|
)
|
|
33
|
+
#: Blocked action whose context is being handed off.
|
|
29
34
|
blocker_id: str
|
|
35
|
+
#: Async assignment that owns the blocked action.
|
|
30
36
|
async_assignment_id: str
|
|
37
|
+
#: Runtime binding carried into the operator handoff.
|
|
31
38
|
binding: InternRuntimeBinding
|
|
39
|
+
#: Schema version of the blocked action.
|
|
32
40
|
action_schema_version: str
|
|
41
|
+
#: Kind of action requiring operator intervention.
|
|
33
42
|
action_kind: str
|
|
43
|
+
#: 64-character lowercase SHA-256 hex digest of the action.
|
|
34
44
|
action_digest: str = Field(pattern=r"^[0-9a-f]{64}$")
|
|
45
|
+
#: Operator-facing description of the blocked action; at most 2,000 characters.
|
|
35
46
|
summary: str = Field(min_length=1, max_length=2000)
|
|
47
|
+
#: Reason for the handoff; at most 4,000 characters.
|
|
36
48
|
rationale: str = Field(min_length=1, max_length=4000)
|
|
49
|
+
#: Preauthorization rule associated with the blocked action.
|
|
37
50
|
preauthorization_rule: str
|
|
51
|
+
#: Produced-resource references supporting the handoff.
|
|
38
52
|
evidence_resources: tuple[InternProducedResourceReference, ...] = ()
|
|
53
|
+
#: Capability required of the operator handling this action.
|
|
39
54
|
required_operator_capability: str
|
|
40
55
|
|
|
41
56
|
|
|
42
57
|
class InternBlockerHandoffReceipt(_Contract):
|
|
58
|
+
"""Durable evidence tying an Async blocker to its operator Sync session."""
|
|
59
|
+
#: Version discriminator for the durable handoff receipt.
|
|
43
60
|
schema_version: Literal["smr.intern-async-blocker-handoff-receipt.v1"] = (
|
|
44
61
|
"smr.intern-async-blocker-handoff-receipt.v1"
|
|
45
62
|
)
|
|
63
|
+
#: Identity of the durable handoff receipt.
|
|
46
64
|
handoff_receipt_id: str
|
|
65
|
+
#: Blocker associated with this receipt.
|
|
47
66
|
blocker_id: str
|
|
67
|
+
#: Organization that owns the handoff.
|
|
48
68
|
org_id: str
|
|
69
|
+
#: Sync session opened for operator intervention.
|
|
49
70
|
sync_session_id: str
|
|
71
|
+
#: User recorded as opening the handoff.
|
|
50
72
|
opened_by_user_id: str
|
|
73
|
+
#: Retry key used to open this handoff.
|
|
51
74
|
idempotency_key: str
|
|
75
|
+
#: Snapshot of the blocked action and its runtime binding.
|
|
52
76
|
context: InternBlockerHandoffContext
|
|
77
|
+
#: 64-character lowercase SHA-256 hex digest of the context.
|
|
53
78
|
context_digest: str = Field(pattern=r"^[0-9a-f]{64}$")
|
|
79
|
+
#: Backend timestamp when the handoff receipt was created.
|
|
54
80
|
created_at: datetime
|
|
55
81
|
|
|
56
82
|
|
|
57
83
|
class InternBlockerOpenSyncResponse(_Contract):
|
|
84
|
+
"""Opened operator handoff, its Sync session, and durable context receipt."""
|
|
85
|
+
#: Version discriminator for the open-sync response.
|
|
58
86
|
schema_version: Literal["smr.intern-async-blocker-open-sync.v1"] = (
|
|
59
87
|
"smr.intern-async-blocker-open-sync.v1"
|
|
60
88
|
)
|
|
89
|
+
#: Blocker after the handoff was opened; opening alone does not resolve it.
|
|
61
90
|
blocker: InternAsyncBlocker
|
|
91
|
+
#: Sync session available for the operator handoff.
|
|
62
92
|
sync_session: InternSyncSession
|
|
93
|
+
#: Durable receipt tying the blocker, context, and Sync session together.
|
|
63
94
|
handoff_receipt: InternBlockerHandoffReceipt
|
|
64
95
|
|
|
65
96
|
|
|
66
97
|
class InternBlockerResolveRequest(_Contract):
|
|
98
|
+
"""Explicit blocker disposition with optional supporting receipts."""
|
|
99
|
+
#: Caller retry key for this resolution; 1–512 characters.
|
|
67
100
|
idempotency_key: str = Field(min_length=1, max_length=512)
|
|
101
|
+
#: Explicit completed, denied, or superseded disposition.
|
|
68
102
|
outcome: Literal["completed", "denied", "superseded"]
|
|
103
|
+
#: Optional operator explanation; at most 4,000 characters.
|
|
69
104
|
comment: str | None = Field(default=None, max_length=4000)
|
|
105
|
+
#: Up to 128 unique, non-blank supporting receipt IDs, each at most 512 characters.
|
|
70
106
|
supporting_receipt_ids: tuple[str, ...] = Field(default=(), max_length=128)
|
|
71
107
|
|
|
72
108
|
@model_validator(mode="after")
|
|
@@ -79,8 +115,12 @@ class InternBlockerResolveRequest(_Contract):
|
|
|
79
115
|
|
|
80
116
|
|
|
81
117
|
class InternBlockerResolveResponse(_Contract):
|
|
118
|
+
"""Resolved blocker and durable continuation-command receipt."""
|
|
119
|
+
#: Version discriminator for the resolution response.
|
|
82
120
|
schema_version: Literal["smr.intern-async-blocker-resolution.v1"] = (
|
|
83
121
|
"smr.intern-async-blocker-resolution.v1"
|
|
84
122
|
)
|
|
123
|
+
#: Blocker carrying the durable resolution receipt.
|
|
85
124
|
blocker: InternAsyncBlocker
|
|
125
|
+
#: Durable command receipt for continuation of the owning Async assignment.
|
|
86
126
|
continuation_command: InternAsyncCommandReceipt
|
|
@@ -22,14 +22,23 @@ InternRuntimeClosureKind = Literal[
|
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
class InternResourceDisposition(BaseModel):
|
|
25
|
+
"""Ownership relation and recorded cleanup disposition for one registered resource."""
|
|
25
26
|
model_config = ConfigDict(extra="forbid", frozen=True)
|
|
27
|
+
#: Registered resource type.
|
|
26
28
|
resource_kind: str
|
|
29
|
+
#: Identity of the registered resource.
|
|
27
30
|
resource_id: str
|
|
31
|
+
#: Run responsible for cleanup, when known.
|
|
28
32
|
cleanup_owner_run_id: str | None = None
|
|
33
|
+
#: Ownership relation to this runtime: self, owned, borrowed, shared, or retained.
|
|
29
34
|
relation: Literal["self", "owned", "borrowed", "shared", "retained"]
|
|
35
|
+
#: Recorded cleanup disposition; unknown and pending do not mean settled.
|
|
30
36
|
disposition: InternResourceDispositionValue
|
|
37
|
+
#: Backend explanation for the recorded disposition.
|
|
31
38
|
reason: str
|
|
39
|
+
#: Cleanup owner label, when recorded.
|
|
32
40
|
cleanup_owner: str | None = None
|
|
41
|
+
#: Non-negative admission epoch associated with the resource, when known.
|
|
33
42
|
epoch: int | None = Field(default=None, ge=0)
|
|
34
43
|
|
|
35
44
|
|
|
@@ -37,9 +46,12 @@ class InternResourceStopEffect(BaseModel):
|
|
|
37
46
|
"""An effect actually performed when a runtime epoch closed."""
|
|
38
47
|
|
|
39
48
|
model_config = ConfigDict(extra="forbid", frozen=True)
|
|
49
|
+
#: Resource type affected by runtime closure.
|
|
40
50
|
resource_kind: str
|
|
51
|
+
#: Identity of the resource affected by closure.
|
|
41
52
|
resource_id: str
|
|
42
53
|
# Close-time effects, then the real outcome of each internal run stop.
|
|
54
|
+
#: Recorded closure effect or actual internal-run stop outcome.
|
|
43
55
|
effect: Literal[
|
|
44
56
|
"stop_requested",
|
|
45
57
|
"already_settled",
|
|
@@ -50,7 +62,9 @@ class InternResourceStopEffect(BaseModel):
|
|
|
50
62
|
"stop_accepted",
|
|
51
63
|
"stop_failed",
|
|
52
64
|
]
|
|
65
|
+
#: Owner recorded for this effect, when available.
|
|
53
66
|
owner: str | None = None
|
|
67
|
+
#: Backend explanation of the closure effect.
|
|
54
68
|
reason: str
|
|
55
69
|
|
|
56
70
|
|
|
@@ -58,32 +72,76 @@ class InternRuntimeResourceEpoch(BaseModel):
|
|
|
58
72
|
"""One admission epoch; closed epochs remain enumerated for recovery."""
|
|
59
73
|
|
|
60
74
|
model_config = ConfigDict(extra="forbid", frozen=True)
|
|
75
|
+
#: Non-negative admission epoch number.
|
|
61
76
|
epoch: int = Field(ge=0)
|
|
77
|
+
#: Whether the epoch accepts new resources.
|
|
62
78
|
admission: Literal["open", "closed"]
|
|
79
|
+
#: Reason admission closed; absent while no closure is recorded.
|
|
63
80
|
closure_kind: InternRuntimeClosureKind | None = None
|
|
81
|
+
#: Timestamp when the admission epoch opened.
|
|
64
82
|
opened_at: datetime
|
|
83
|
+
#: Timestamp when admission closed, if recorded.
|
|
65
84
|
closed_at: datetime | None = None
|
|
85
|
+
#: Effects recorded when this epoch closed, including internal-run stop outcomes.
|
|
66
86
|
effects: list[InternResourceStopEffect] = Field(default_factory=list)
|
|
67
87
|
# Null while the backend re-drive pass is still converging this epoch.
|
|
88
|
+
#: Cleanup settlement timestamp; null while backend recovery is still converging.
|
|
68
89
|
cleanup_settled_at: datetime | None = None
|
|
69
90
|
|
|
70
91
|
|
|
71
92
|
class InternResourceInventory(BaseModel):
|
|
93
|
+
"""Runtime resource observation; creator coverage and cleanup completeness are separate.
|
|
94
|
+
|
|
95
|
+
```python
|
|
96
|
+
from synth_ai.sdk.research.contracts.intern_resources import InternResourceInventory
|
|
97
|
+
|
|
98
|
+
inventory = InternResourceInventory.from_wire({
|
|
99
|
+
"runtime_kind": "sync", "runtime_id": "session-1",
|
|
100
|
+
"observed_at": "2026-09-29T12:00:00+00:00",
|
|
101
|
+
"coverage": "registered-runtime-resources-v1",
|
|
102
|
+
"coverage_complete": False, "resources": [],
|
|
103
|
+
})
|
|
104
|
+
assert not inventory.disposition_complete
|
|
105
|
+
```
|
|
106
|
+
"""
|
|
107
|
+
|
|
72
108
|
model_config = ConfigDict(extra="forbid", frozen=True)
|
|
109
|
+
#: Sync session or Async assignment inventory kind.
|
|
73
110
|
runtime_kind: Literal["sync", "async"]
|
|
111
|
+
#: Identity of the session or assignment whose resources were observed.
|
|
74
112
|
runtime_id: str
|
|
113
|
+
#: Backend timestamp of this inventory observation.
|
|
75
114
|
observed_at: datetime
|
|
115
|
+
#: Inventory contract discriminator: registered-runtime-resources-v1.
|
|
76
116
|
coverage: Literal["registered-runtime-resources-v1"]
|
|
117
|
+
#: Whether creator coverage is complete; separate from resource cleanup.
|
|
77
118
|
coverage_complete: StrictBool
|
|
119
|
+
#: Backend reasons creator coverage is incomplete.
|
|
78
120
|
incomplete_reasons: list[str] = Field(default_factory=list)
|
|
121
|
+
#: Registered resources and their individual dispositions.
|
|
79
122
|
resources: list[InternResourceDisposition]
|
|
123
|
+
#: Recorded creator-set identifier, when available.
|
|
80
124
|
creator_set: str | None = None
|
|
125
|
+
#: Inventory profile recorded by the backend, when available.
|
|
81
126
|
profile: str | None = None
|
|
127
|
+
#: Whether cleanup is complete; cannot be true with incomplete creator coverage.
|
|
82
128
|
disposition_complete: StrictBool = False
|
|
129
|
+
#: Admission epochs retained for recovery, including closed epochs.
|
|
83
130
|
epochs: list[InternRuntimeResourceEpoch] = Field(default_factory=list)
|
|
84
131
|
|
|
85
132
|
@classmethod
|
|
86
|
-
def from_wire(cls, value):
|
|
133
|
+
def from_wire(cls, value: object) -> "InternResourceInventory":
|
|
134
|
+
"""Parse the backend wire representation of InternResourceInventory.
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
value: Backend response object to validate and convert.
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
The parsed InternResourceInventory with backend values preserved.
|
|
141
|
+
|
|
142
|
+
Raises:
|
|
143
|
+
ValueError: Cleanup is reported complete despite incomplete creator coverage.
|
|
144
|
+
"""
|
|
87
145
|
inventory = cls.model_validate(value)
|
|
88
146
|
# A complete cleanup can never rest on incomplete creator coverage.
|
|
89
147
|
if inventory.disposition_complete and not inventory.coverage_complete:
|