synth-ai 0.21.1.dev652__tar.gz → 0.21.1.dev654__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.1.dev652/synth_ai.egg-info → synth_ai-0.21.1.dev654}/PKG-INFO +81 -75
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/README.md +78 -73
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/pyproject.toml +3 -2
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/README.md +7 -4
- synth_ai-0.21.1.dev654/synth_ai/cli/README.md +48 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/index.py +204 -16
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/main.py +2 -2
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/research.py +1 -1
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/README.md +24 -8
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/index.py +10 -18
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/README.md +8 -5
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/AGENT_SETUP_PROMPT.md +24 -13
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/README.md +89 -24
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/__init__.py +2 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/public.py +6 -4
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/public_search.py +25 -1
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/wallet_search.py +4 -2
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654/synth_ai.egg-info}/PKG-INFO +81 -75
- synth_ai-0.21.1.dev652/synth_ai/cli/README.md +0 -35
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/LICENSE +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/MANIFEST.in +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/openapi/index-v1.json +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/openapi/messaging-v1.json +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/openapi/research-v1.json +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/setup.cfg +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/setup.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/__main__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/AGENTS.md +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/__main__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/research_environments.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/research_image_releases.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/research_projects.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/client.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/README.md +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/auth/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/auth/credentials.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/contracts/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/contracts/json_value.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/contracts/pagination.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/errors.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/http/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/http/async_transport.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/http/request.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/http/retry.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/http/streaming.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/http/transport.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/research/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/utils/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/utils/env.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/utils/log_filter.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/utils/paths.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/utils/urls.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/__main__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/objective_tools.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/registry.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/request_models.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/server.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/approvals.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/artifacts.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/datasets.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/environments.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/exports.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/factories.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/factory_results.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/files.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/image_releases.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/integrations.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/intern_program.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/local_files.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/logs.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/models.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/outputs.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/policy_schemas.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/progress.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/project_data.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/projects.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/prs.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/readiness.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/repos.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/research_intern.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/resources.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/runs.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/trained_models.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/usage.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/visuals.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/workspace_inputs.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/pools.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/py.typed +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/agent_policy.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/artifacts.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/catalog.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/client.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/contracts.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/contributions.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/errors.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/lifecycle.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/package.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/research_intake.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/retry.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/search.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/submission.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/timeouts.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/transfer.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/usage_accounting.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/messaging/README.md +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/messaging/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/messaging/client.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/messaging/contracts.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/optimizers/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/optimizers/client.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/optimizers/contracts.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/pagination.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/_internal/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/_internal/crypto.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/_internal/env.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/_internal/urls.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/account.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/advanced.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/advanced_factories.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/advanced_swarms.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/artifacts.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/auth.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/client.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/container_pools/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/container_pools/api.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/container_pools/contracts.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/container_pools/operations.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/container_pools/packaging.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/_activity_wire.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/_environment_wire.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/_transcript_wire.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/_wire.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/activity.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/activity_items.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/actor_images.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/billing.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/canonical_usage.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/checkpoints.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/cloud_deployment_claims.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/cloud_deployments.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/common.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/dataset_revisions.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/deliveries.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/dev_environment_evidence.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/economics.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/environment_manifest.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/environments.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/evidence.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/factories.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/factory_evidence.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/factory_lenses.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/factory_operations.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/factory_role_receipts.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/failure.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/image_releases.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/intern_blockers.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/intern_grants.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/intern_program.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/intern_resources.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/intern_usage.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/limit_evidence.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/local_execution_profile.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/operator_evidence.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/project.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/project_data.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/project_runtime.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/project_workspace.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/project_workspace_evidence.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/projects.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/promotions.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/research_intern.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/resource_settlement.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_authority.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_control.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_diagnostics.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_events.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_execution.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_launch.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_observability.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_state.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_timeline.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/runtime_image.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/runtime_intent.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/runtime_stream.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/runtime_stream_snapshot.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/scientific_integrity.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_actor_models.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_actor_policy_data.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_agent_harnesses.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_agent_kinds.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_agent_models.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_branching.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_credential_providers.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_environment_kinds.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_evidence_obligations.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_funding_sources.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_horizons.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_host_kinds.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_inference_providers.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_network_topology.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_providers.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_resource_kinds.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_roles.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_run_policy.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_runbooks.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_runnable_project.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_runtime_kinds.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_tool_providers.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_work_modes.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/status.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/swarm_rollouts.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/swarms.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/tag.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/traces.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/transcript.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/types.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/usage.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/visuals.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/wire_models.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/wire_models_README.md +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/work_products.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/workspaces.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/economics.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/efforts.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/environments.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/errors.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/events.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/experiments.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/facade.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/factories.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/factory_storage.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/image_releases.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/intern_blockers.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/intern_program.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/knowledge.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/models.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/operations.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/project_data.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/project_deliveries.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/project_workspaces.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/projects.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/public.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/readouts.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/research_intern.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/secrets.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/README.md +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/_base.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/_client_helpers.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/_run_authority_mixin.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/approvals.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/billing.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/client.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/cloud_deployments.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/config.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/cost.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/datasets.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/dev_environments.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/environments.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/exports.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/factories.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/factory_evidence.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/files.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/github.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/image_releases.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/images.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/logs.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/models.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/outputs.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/progress.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/project.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/projects.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/prs.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/readiness.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/repositories.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/runs.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/secrets.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/setup.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/tag.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/trained_models.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/transport.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/usage.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/work_products.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/workspace_inputs.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/surface_parity.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/swarms.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/traces.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/transport/__init__.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/transport/http.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/transport/pagination.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/version.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/visuals.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/wiki.py +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai.egg-info/SOURCES.txt +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai.egg-info/dependency_links.txt +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai.egg-info/entry_points.txt +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai.egg-info/requires.txt +0 -0
- {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai.egg-info/top_level.txt +0 -0
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: synth-ai
|
|
3
|
-
Version: 0.21.1.
|
|
4
|
-
Summary: Python SDK and
|
|
3
|
+
Version: 0.21.1.dev654
|
|
4
|
+
Summary: Python SDK, CLI and MCP servers for Synth Index search and Swarms
|
|
5
5
|
Author-email: Synth AI <josh@usesynth.ai>
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/synth-laboratories/synth-ai
|
|
8
8
|
Project-URL: Repository, https://github.com/synth-laboratories/synth-ai
|
|
9
9
|
Project-URL: Issues, https://github.com/synth-laboratories/synth-ai/issues
|
|
10
|
+
Keywords: synth,index,search,citations,research,swarms,mcp,sdk
|
|
10
11
|
Requires-Python: >=3.11
|
|
11
12
|
Description-Content-Type: text/markdown
|
|
12
13
|
License-File: LICENSE
|
|
@@ -29,13 +30,14 @@ Dynamic: license-file
|
|
|
29
30
|
|
|
30
31
|
# Synth AI SDK
|
|
31
32
|
|
|
32
|
-
<!-- CI release pins: PyPI-0.21.
|
|
33
|
+
<!-- CI release pins: PyPI-0.21.1-orange synth-ai==0.21.1 -->
|
|
33
34
|
|
|
34
35
|
[](https://pypi.org/project/synth-ai/)
|
|
35
36
|
[](https://pypi.org/project/synth-ai/)
|
|
36
37
|
[](https://pypi.org/project/synth-ai/)
|
|
37
38
|
|
|
38
|
-
Python SDK and
|
|
39
|
+
Python SDK, CLI and MCP servers for **Synth Index** (cited search over reviewed
|
|
40
|
+
research) and **Swarms** (hosted research runs under `client.research.swarms`).
|
|
39
41
|
|
|
40
42
|
**Documentation:** https://docs.usesynth.ai/sdk/overview
|
|
41
43
|
|
|
@@ -47,12 +49,15 @@ uv add synth-ai
|
|
|
47
49
|
|
|
48
50
|
## Authenticate
|
|
49
51
|
|
|
50
|
-
|
|
52
|
+
Free anonymous public Index Search needs no key (see [Synth Index](#synth-index)).
|
|
53
|
+
Keyed Index Search, private collections and Swarms need `SYNTH_API_KEY`:
|
|
51
54
|
|
|
52
55
|
```bash
|
|
53
56
|
export SYNTH_API_KEY="sk_..."
|
|
54
57
|
```
|
|
55
58
|
|
|
59
|
+
A key selects the paid keyed Index route; it never makes a public request free.
|
|
60
|
+
|
|
56
61
|
## Local Workspaces
|
|
57
62
|
|
|
58
63
|
For local multi-repo development, `synth-ai` treats workspace resolution as a
|
|
@@ -74,7 +79,7 @@ client = SynthClient(base_url="http://127.0.0.1:8000")
|
|
|
74
79
|
|
|
75
80
|
The CLI also reads `SYNTH_BACKEND_URL` and accepts `--backend-url`.
|
|
76
81
|
|
|
77
|
-
## Quickstart
|
|
82
|
+
## Quickstart: Swarms
|
|
78
83
|
|
|
79
84
|
```python
|
|
80
85
|
from synth_ai import SynthClient
|
|
@@ -110,10 +115,11 @@ strict counts and lifecycle freshness. Artifact and WorkProduct content reads
|
|
|
110
115
|
use the same typed transport and return bytes; they do not expose storage
|
|
111
116
|
authority.
|
|
112
117
|
|
|
113
|
-
## Research SDK
|
|
118
|
+
## Research SDK (Swarms)
|
|
114
119
|
|
|
115
|
-
|
|
116
|
-
|
|
120
|
+
`SynthClient().research` hosts Swarms. Its stable namespaces are `projects`,
|
|
121
|
+
`swarms`, and `factories` (the last is a supported compatibility API; it is not
|
|
122
|
+
part of this release's recommended path).
|
|
117
123
|
|
|
118
124
|
Create a durable project when work needs reusable configuration:
|
|
119
125
|
|
|
@@ -139,25 +145,6 @@ with SynthClient() as client:
|
|
|
139
145
|
print(swarm.wait().state)
|
|
140
146
|
```
|
|
141
147
|
|
|
142
|
-
Factories provide a typed durable optimization loop with native sync/async
|
|
143
|
-
parity:
|
|
144
|
-
|
|
145
|
-
```python
|
|
146
|
-
from synth_ai import SynthClient
|
|
147
|
-
from synth_ai.sdk.research.public import EffortSpec, FactorySpec, ProjectId
|
|
148
|
-
|
|
149
|
-
with SynthClient() as client:
|
|
150
|
-
factory = client.research.factories.create(FactorySpec(name="Prompt optimizer"))
|
|
151
|
-
effort = client.research.factories.efforts.create(
|
|
152
|
-
EffortSpec(
|
|
153
|
-
factory_id=factory.factory_id,
|
|
154
|
-
project_id=ProjectId("project_existing"),
|
|
155
|
-
name="Improve the system prompt",
|
|
156
|
-
)
|
|
157
|
-
)
|
|
158
|
-
print(effort.effort_id, effort.state)
|
|
159
|
-
```
|
|
160
|
-
|
|
161
148
|
Limits, economics, secrets, Tag, rich evidence projections, and administrative
|
|
162
149
|
resource APIs remain available under `client.research.advanced` while their
|
|
163
150
|
contracts are stabilized. Advanced APIs are not covered by the stable surface
|
|
@@ -199,48 +186,43 @@ containers wheel; an unpublished candidate extra is not a release claim.
|
|
|
199
186
|
|
|
200
187
|
```bash
|
|
201
188
|
synth-ai --help
|
|
202
|
-
synth-ai
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
## Synth Index (alpha v0.1)
|
|
206
|
-
|
|
207
|
-
Synth Index alpha v0.1 offers authenticated, paid FAST and DEEP Search over
|
|
208
|
-
reviewed, published research. DEEP is in beta. Install `synth-ai>=0.20.2`:
|
|
209
|
-
|
|
210
|
-
```bash
|
|
211
|
-
uv add "synth-ai>=0.20.2"
|
|
189
|
+
synth-ai index --help # Synth Index Search and research intake
|
|
190
|
+
synth-ai research --help # Swarms and Research projects
|
|
212
191
|
```
|
|
213
192
|
|
|
214
|
-
|
|
215
|
-
An example is under [Public Surface](#public-surface). The
|
|
216
|
-
[Index SDK guide](synth_ai/sdk/index/README.md) covers DEEP's durable Search
|
|
217
|
-
ID, reconnect and cancel.
|
|
218
|
-
- **MCP:** `synth-ai-index-mcp` is an Index-only stdio server and is read-only
|
|
219
|
-
by default. Search tools are advertised only when `SYNTH_API_KEY` is set.
|
|
220
|
-
Setup is in the [Index SDK guide](synth_ai/sdk/index/README.md#external-agents-over-stdio-mcp).
|
|
221
|
-
- Every Search needs an API key, an authorized organization and funding.
|
|
193
|
+
## Synth Index
|
|
222
194
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
free, anonymous or zero-data-retention Search. Contributing research to the
|
|
226
|
-
Index is planned for Index v0.2.
|
|
195
|
+
Index Search returns a cited `response` plus the exact Contribution revisions it
|
|
196
|
+
cites. There are two routes, chosen explicitly by the client you use:
|
|
227
197
|
|
|
228
|
-
|
|
198
|
+
| | Public route | Keyed route |
|
|
199
|
+
| --- | --- | --- |
|
|
200
|
+
| Caller | Anonymous only: no API key or session is sent | `SYNTH_API_KEY` (or a Clerk session) |
|
|
201
|
+
| Python | `PublicIndexClient().public_search(...)` | `SynthClient().index.search(...)` |
|
|
202
|
+
| CLI | `synth-ai index search --public` (0.21.1+) | `synth-ai index search --keyed` |
|
|
203
|
+
| MCP `index_search` | No `SYNTH_API_KEY` in the server env | `SYNTH_API_KEY` set; runs only after the org turns on wallet payments |
|
|
204
|
+
| Corpus | Published public Contributions | Public, or authorized private collections |
|
|
205
|
+
| Price | Free to the caller | Paid: Fast is 5 cents per delivered Search; Deep is 5 cents plus measured model cost, capped by your `max_charge_cents` and at $1 per Search. The backend publishes the current price. |
|
|
206
|
+
| Funding | None | Index promo credit, then the wallet with explicit consent (`allow_wallet`, `max_charge_cents`) |
|
|
207
|
+
| Limits | Per-caller and platform-wide per-minute/per-day limits, a daily service budget and a Deep concurrency cap, published in `capabilities().public_search` | Your organization's mode grants, monthly caps and per-mode concurrency |
|
|
208
|
+
| Retention | Published in `capabilities().public_search` (`retention`, `privacy_copy`) | Your organization's terms; public terms do not describe keyed Search |
|
|
209
|
+
|
|
210
|
+
The public route exists only where the backend enables it (`public_search.enabled`
|
|
211
|
+
in capabilities); otherwise it fails closed with `PublicSearchDisabledError`.
|
|
212
|
+
The public route refuses any credential (409, `PublicSearchAuthenticatedError`),
|
|
213
|
+
so a key never turns a public request into a free keyed one, and the SDK and CLI
|
|
214
|
+
never switch routes on their own.
|
|
229
215
|
|
|
230
|
-
|
|
216
|
+
```python
|
|
217
|
+
from synth_ai.sdk.index import PublicIndexClient
|
|
231
218
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
219
|
+
with PublicIndexClient() as index: # anonymous: sends no key
|
|
220
|
+
print(index.public_search_terms().lines) # price, limits, privacy from capabilities
|
|
221
|
+
result = index.public_search("RLVR verifier design", mode="fast", max_results=5)
|
|
222
|
+
print(result.response, [item.citation for item in result.citations])
|
|
223
|
+
```
|
|
237
224
|
|
|
238
|
-
|
|
239
|
-
catalog and known-ID Contribution reads use `PublicIndexClient`; even a
|
|
240
|
-
public-scope Search requires an API key, an authorized organization, and
|
|
241
|
-
funding. An Index-only MCP server starts read-only, advertising public browse
|
|
242
|
-
without a key and Search only when a key is configured. Contribution writes
|
|
243
|
-
require a separate explicit opt-in and grant.
|
|
225
|
+
Keyed (paid) Search:
|
|
244
226
|
|
|
245
227
|
```python
|
|
246
228
|
from uuid import uuid4
|
|
@@ -259,19 +241,45 @@ with SynthClient() as synth: # Reads SYNTH_API_KEY.
|
|
|
259
241
|
print(result.response, result.usage)
|
|
260
242
|
```
|
|
261
243
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
244
|
+
CLI:
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
synth-ai index search "RLVR verifier design" --public
|
|
248
|
+
synth-ai index search "RLVR verifier design" --keyed --allow-wallet --max-charge-cents 5
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
With no key and no route flag the CLI refuses and asks for one. With an inherited
|
|
252
|
+
`SYNTH_API_KEY`, `--public` still sends no key; without a flag the CLI uses the
|
|
253
|
+
keyed route and says so on stderr.
|
|
267
254
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
255
|
+
- **MCP:** `synth-ai-index-mcp` is an Index-only stdio server, read-only by
|
|
256
|
+
default. Setup and per-configuration economics are in the
|
|
257
|
+
[Index SDK guide](synth_ai/sdk/index/README.md#external-agents-over-stdio-mcp).
|
|
258
|
+
- **Errors:** public-route refusals have their own types (rate limit, budget
|
|
259
|
+
exhausted, disabled route, credential conflict); see the
|
|
260
|
+
[Index SDK guide](synth_ai/sdk/index/README.md#errors).
|
|
271
261
|
|
|
272
|
-
|
|
262
|
+
These calls require a deployed Index API; installing the SDK alone does not make
|
|
263
|
+
a Search available.
|
|
264
|
+
|
|
265
|
+
## Public Surface
|
|
273
266
|
|
|
274
|
-
|
|
267
|
+
Use `SynthClient` as the front door:
|
|
268
|
+
|
|
269
|
+
| Surface | Client namespace | Use it for |
|
|
270
|
+
| --- | --- | --- |
|
|
271
|
+
| **Index** | `client.index`, `PublicIndexClient` | Keyed (paid) and anonymous public (free) Search, exact contents. |
|
|
272
|
+
| **Swarms** | `client.research.swarms` | Hosted research runs, events, usage and evidence. |
|
|
273
|
+
| Research projects | `client.research.projects` | Reusable Swarm configuration. |
|
|
274
|
+
| CLI / MCP | `synth-ai`, `synth-ai-index-mcp` | Terminal commands and an Index-only coding-agent server. |
|
|
275
|
+
|
|
276
|
+
Swarms run on Synth's hosted research workers; see the
|
|
277
|
+
[Managed Research docs](https://docs.usesynth.ai/managed-research/intro) for
|
|
278
|
+
repo runs, evidence, checkpoints and final reports.
|
|
279
|
+
|
|
280
|
+
## Swarms Billing
|
|
281
|
+
|
|
282
|
+
Swarms and other Managed Research work draw from the same org-level allowance and
|
|
275
283
|
flex-credit wallet. Free, Standard ($20/month), and Max ($200/month) expose
|
|
276
284
|
premium and value usage windows with reset times, then use explicit flex credits
|
|
277
285
|
after included usage is exhausted. Premium models consume allowance faster;
|
|
@@ -309,5 +317,3 @@ make docs-dev # preview at http://localhost:3000/overview
|
|
|
309
317
|
Optional: install [Lefthook](https://github.com/evilmartians/lefthook) and run
|
|
310
318
|
`lefthook install` to run formatting, linting, and type checks on staged Python
|
|
311
319
|
files.
|
|
312
|
-
|
|
313
|
-
[SMR Handoff X thread](https://github.com/usesynth/smr-handoff/blob/main/marketing/smr-handoff-x-thread.md) — hand agent tasks to [Managed Research](https://usesynth.ai/smr) from Cursor, Codex, or Claude Code ([repo](https://github.com/usesynth/smr-handoff)).
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
# Synth AI SDK
|
|
2
2
|
|
|
3
|
-
<!-- CI release pins: PyPI-0.21.
|
|
3
|
+
<!-- CI release pins: PyPI-0.21.1-orange synth-ai==0.21.1 -->
|
|
4
4
|
|
|
5
5
|
[](https://pypi.org/project/synth-ai/)
|
|
6
6
|
[](https://pypi.org/project/synth-ai/)
|
|
7
7
|
[](https://pypi.org/project/synth-ai/)
|
|
8
8
|
|
|
9
|
-
Python SDK and
|
|
9
|
+
Python SDK, CLI and MCP servers for **Synth Index** (cited search over reviewed
|
|
10
|
+
research) and **Swarms** (hosted research runs under `client.research.swarms`).
|
|
10
11
|
|
|
11
12
|
**Documentation:** https://docs.usesynth.ai/sdk/overview
|
|
12
13
|
|
|
@@ -18,12 +19,15 @@ uv add synth-ai
|
|
|
18
19
|
|
|
19
20
|
## Authenticate
|
|
20
21
|
|
|
21
|
-
|
|
22
|
+
Free anonymous public Index Search needs no key (see [Synth Index](#synth-index)).
|
|
23
|
+
Keyed Index Search, private collections and Swarms need `SYNTH_API_KEY`:
|
|
22
24
|
|
|
23
25
|
```bash
|
|
24
26
|
export SYNTH_API_KEY="sk_..."
|
|
25
27
|
```
|
|
26
28
|
|
|
29
|
+
A key selects the paid keyed Index route; it never makes a public request free.
|
|
30
|
+
|
|
27
31
|
## Local Workspaces
|
|
28
32
|
|
|
29
33
|
For local multi-repo development, `synth-ai` treats workspace resolution as a
|
|
@@ -45,7 +49,7 @@ client = SynthClient(base_url="http://127.0.0.1:8000")
|
|
|
45
49
|
|
|
46
50
|
The CLI also reads `SYNTH_BACKEND_URL` and accepts `--backend-url`.
|
|
47
51
|
|
|
48
|
-
## Quickstart
|
|
52
|
+
## Quickstart: Swarms
|
|
49
53
|
|
|
50
54
|
```python
|
|
51
55
|
from synth_ai import SynthClient
|
|
@@ -81,10 +85,11 @@ strict counts and lifecycle freshness. Artifact and WorkProduct content reads
|
|
|
81
85
|
use the same typed transport and return bytes; they do not expose storage
|
|
82
86
|
authority.
|
|
83
87
|
|
|
84
|
-
## Research SDK
|
|
88
|
+
## Research SDK (Swarms)
|
|
85
89
|
|
|
86
|
-
|
|
87
|
-
|
|
90
|
+
`SynthClient().research` hosts Swarms. Its stable namespaces are `projects`,
|
|
91
|
+
`swarms`, and `factories` (the last is a supported compatibility API; it is not
|
|
92
|
+
part of this release's recommended path).
|
|
88
93
|
|
|
89
94
|
Create a durable project when work needs reusable configuration:
|
|
90
95
|
|
|
@@ -110,25 +115,6 @@ with SynthClient() as client:
|
|
|
110
115
|
print(swarm.wait().state)
|
|
111
116
|
```
|
|
112
117
|
|
|
113
|
-
Factories provide a typed durable optimization loop with native sync/async
|
|
114
|
-
parity:
|
|
115
|
-
|
|
116
|
-
```python
|
|
117
|
-
from synth_ai import SynthClient
|
|
118
|
-
from synth_ai.sdk.research.public import EffortSpec, FactorySpec, ProjectId
|
|
119
|
-
|
|
120
|
-
with SynthClient() as client:
|
|
121
|
-
factory = client.research.factories.create(FactorySpec(name="Prompt optimizer"))
|
|
122
|
-
effort = client.research.factories.efforts.create(
|
|
123
|
-
EffortSpec(
|
|
124
|
-
factory_id=factory.factory_id,
|
|
125
|
-
project_id=ProjectId("project_existing"),
|
|
126
|
-
name="Improve the system prompt",
|
|
127
|
-
)
|
|
128
|
-
)
|
|
129
|
-
print(effort.effort_id, effort.state)
|
|
130
|
-
```
|
|
131
|
-
|
|
132
118
|
Limits, economics, secrets, Tag, rich evidence projections, and administrative
|
|
133
119
|
resource APIs remain available under `client.research.advanced` while their
|
|
134
120
|
contracts are stabilized. Advanced APIs are not covered by the stable surface
|
|
@@ -170,48 +156,43 @@ containers wheel; an unpublished candidate extra is not a release claim.
|
|
|
170
156
|
|
|
171
157
|
```bash
|
|
172
158
|
synth-ai --help
|
|
173
|
-
synth-ai
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
## Synth Index (alpha v0.1)
|
|
177
|
-
|
|
178
|
-
Synth Index alpha v0.1 offers authenticated, paid FAST and DEEP Search over
|
|
179
|
-
reviewed, published research. DEEP is in beta. Install `synth-ai>=0.20.2`:
|
|
180
|
-
|
|
181
|
-
```bash
|
|
182
|
-
uv add "synth-ai>=0.20.2"
|
|
159
|
+
synth-ai index --help # Synth Index Search and research intake
|
|
160
|
+
synth-ai research --help # Swarms and Research projects
|
|
183
161
|
```
|
|
184
162
|
|
|
185
|
-
|
|
186
|
-
An example is under [Public Surface](#public-surface). The
|
|
187
|
-
[Index SDK guide](synth_ai/sdk/index/README.md) covers DEEP's durable Search
|
|
188
|
-
ID, reconnect and cancel.
|
|
189
|
-
- **MCP:** `synth-ai-index-mcp` is an Index-only stdio server and is read-only
|
|
190
|
-
by default. Search tools are advertised only when `SYNTH_API_KEY` is set.
|
|
191
|
-
Setup is in the [Index SDK guide](synth_ai/sdk/index/README.md#external-agents-over-stdio-mcp).
|
|
192
|
-
- Every Search needs an API key, an authorized organization and funding.
|
|
163
|
+
## Synth Index
|
|
193
164
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
free, anonymous or zero-data-retention Search. Contributing research to the
|
|
197
|
-
Index is planned for Index v0.2.
|
|
165
|
+
Index Search returns a cited `response` plus the exact Contribution revisions it
|
|
166
|
+
cites. There are two routes, chosen explicitly by the client you use:
|
|
198
167
|
|
|
199
|
-
|
|
168
|
+
| | Public route | Keyed route |
|
|
169
|
+
| --- | --- | --- |
|
|
170
|
+
| Caller | Anonymous only: no API key or session is sent | `SYNTH_API_KEY` (or a Clerk session) |
|
|
171
|
+
| Python | `PublicIndexClient().public_search(...)` | `SynthClient().index.search(...)` |
|
|
172
|
+
| CLI | `synth-ai index search --public` (0.21.1+) | `synth-ai index search --keyed` |
|
|
173
|
+
| MCP `index_search` | No `SYNTH_API_KEY` in the server env | `SYNTH_API_KEY` set; runs only after the org turns on wallet payments |
|
|
174
|
+
| Corpus | Published public Contributions | Public, or authorized private collections |
|
|
175
|
+
| Price | Free to the caller | Paid: Fast is 5 cents per delivered Search; Deep is 5 cents plus measured model cost, capped by your `max_charge_cents` and at $1 per Search. The backend publishes the current price. |
|
|
176
|
+
| Funding | None | Index promo credit, then the wallet with explicit consent (`allow_wallet`, `max_charge_cents`) |
|
|
177
|
+
| Limits | Per-caller and platform-wide per-minute/per-day limits, a daily service budget and a Deep concurrency cap, published in `capabilities().public_search` | Your organization's mode grants, monthly caps and per-mode concurrency |
|
|
178
|
+
| Retention | Published in `capabilities().public_search` (`retention`, `privacy_copy`) | Your organization's terms; public terms do not describe keyed Search |
|
|
179
|
+
|
|
180
|
+
The public route exists only where the backend enables it (`public_search.enabled`
|
|
181
|
+
in capabilities); otherwise it fails closed with `PublicSearchDisabledError`.
|
|
182
|
+
The public route refuses any credential (409, `PublicSearchAuthenticatedError`),
|
|
183
|
+
so a key never turns a public request into a free keyed one, and the SDK and CLI
|
|
184
|
+
never switch routes on their own.
|
|
200
185
|
|
|
201
|
-
|
|
186
|
+
```python
|
|
187
|
+
from synth_ai.sdk.index import PublicIndexClient
|
|
202
188
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
189
|
+
with PublicIndexClient() as index: # anonymous: sends no key
|
|
190
|
+
print(index.public_search_terms().lines) # price, limits, privacy from capabilities
|
|
191
|
+
result = index.public_search("RLVR verifier design", mode="fast", max_results=5)
|
|
192
|
+
print(result.response, [item.citation for item in result.citations])
|
|
193
|
+
```
|
|
208
194
|
|
|
209
|
-
|
|
210
|
-
catalog and known-ID Contribution reads use `PublicIndexClient`; even a
|
|
211
|
-
public-scope Search requires an API key, an authorized organization, and
|
|
212
|
-
funding. An Index-only MCP server starts read-only, advertising public browse
|
|
213
|
-
without a key and Search only when a key is configured. Contribution writes
|
|
214
|
-
require a separate explicit opt-in and grant.
|
|
195
|
+
Keyed (paid) Search:
|
|
215
196
|
|
|
216
197
|
```python
|
|
217
198
|
from uuid import uuid4
|
|
@@ -230,19 +211,45 @@ with SynthClient() as synth: # Reads SYNTH_API_KEY.
|
|
|
230
211
|
print(result.response, result.usage)
|
|
231
212
|
```
|
|
232
213
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
214
|
+
CLI:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
synth-ai index search "RLVR verifier design" --public
|
|
218
|
+
synth-ai index search "RLVR verifier design" --keyed --allow-wallet --max-charge-cents 5
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
With no key and no route flag the CLI refuses and asks for one. With an inherited
|
|
222
|
+
`SYNTH_API_KEY`, `--public` still sends no key; without a flag the CLI uses the
|
|
223
|
+
keyed route and says so on stderr.
|
|
238
224
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
225
|
+
- **MCP:** `synth-ai-index-mcp` is an Index-only stdio server, read-only by
|
|
226
|
+
default. Setup and per-configuration economics are in the
|
|
227
|
+
[Index SDK guide](synth_ai/sdk/index/README.md#external-agents-over-stdio-mcp).
|
|
228
|
+
- **Errors:** public-route refusals have their own types (rate limit, budget
|
|
229
|
+
exhausted, disabled route, credential conflict); see the
|
|
230
|
+
[Index SDK guide](synth_ai/sdk/index/README.md#errors).
|
|
242
231
|
|
|
243
|
-
|
|
232
|
+
These calls require a deployed Index API; installing the SDK alone does not make
|
|
233
|
+
a Search available.
|
|
234
|
+
|
|
235
|
+
## Public Surface
|
|
244
236
|
|
|
245
|
-
|
|
237
|
+
Use `SynthClient` as the front door:
|
|
238
|
+
|
|
239
|
+
| Surface | Client namespace | Use it for |
|
|
240
|
+
| --- | --- | --- |
|
|
241
|
+
| **Index** | `client.index`, `PublicIndexClient` | Keyed (paid) and anonymous public (free) Search, exact contents. |
|
|
242
|
+
| **Swarms** | `client.research.swarms` | Hosted research runs, events, usage and evidence. |
|
|
243
|
+
| Research projects | `client.research.projects` | Reusable Swarm configuration. |
|
|
244
|
+
| CLI / MCP | `synth-ai`, `synth-ai-index-mcp` | Terminal commands and an Index-only coding-agent server. |
|
|
245
|
+
|
|
246
|
+
Swarms run on Synth's hosted research workers; see the
|
|
247
|
+
[Managed Research docs](https://docs.usesynth.ai/managed-research/intro) for
|
|
248
|
+
repo runs, evidence, checkpoints and final reports.
|
|
249
|
+
|
|
250
|
+
## Swarms Billing
|
|
251
|
+
|
|
252
|
+
Swarms and other Managed Research work draw from the same org-level allowance and
|
|
246
253
|
flex-credit wallet. Free, Standard ($20/month), and Max ($200/month) expose
|
|
247
254
|
premium and value usage windows with reset times, then use explicit flex credits
|
|
248
255
|
after included usage is exhausted. Premium models consume allowance faster;
|
|
@@ -280,5 +287,3 @@ make docs-dev # preview at http://localhost:3000/overview
|
|
|
280
287
|
Optional: install [Lefthook](https://github.com/evilmartians/lefthook) and run
|
|
281
288
|
`lefthook install` to run formatting, linting, and type checks on staged Python
|
|
282
289
|
files.
|
|
283
|
-
|
|
284
|
-
[SMR Handoff X thread](https://github.com/usesynth/smr-handoff/blob/main/marketing/smr-handoff-x-thread.md) — hand agent tasks to [Managed Research](https://usesynth.ai/smr) from Cursor, Codex, or Claude Code ([repo](https://github.com/usesynth/smr-handoff)).
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "synth-ai"
|
|
3
|
-
version = "0.21.1.
|
|
4
|
-
description = "Python SDK and
|
|
3
|
+
version = "0.21.1.dev654"
|
|
4
|
+
description = "Python SDK, CLI and MCP servers for Synth Index search and Swarms"
|
|
5
|
+
keywords = ["synth", "index", "search", "citations", "research", "swarms", "mcp", "sdk"]
|
|
5
6
|
authors = [{name = "Synth AI", email = "josh@usesynth.ai"}]
|
|
6
7
|
license = "MIT"
|
|
7
8
|
license-files = ["LICENSE"]
|
|
@@ -6,8 +6,11 @@ The public first-mile surface is intentionally small:
|
|
|
6
6
|
|
|
7
7
|
- `SynthClient`
|
|
8
8
|
- `AsyncSynthClient`
|
|
9
|
-
- `client.
|
|
10
|
-
|
|
9
|
+
- `client.index` and `PublicIndexClient` (Synth Index: keyed paid Search and
|
|
10
|
+
free anonymous public Search)
|
|
11
|
+
- `client.research.swarms` (Swarms)
|
|
12
|
+
- `synth-ai` CLI (`synth-ai index`, `synth-ai research`) and the
|
|
13
|
+
`synth-ai-index-mcp` server
|
|
11
14
|
|
|
12
15
|
Public docs live at https://docs.usesynth.ai/sdk/overview.
|
|
13
16
|
|
|
@@ -16,9 +19,9 @@ Public docs live at https://docs.usesynth.ai/sdk/overview.
|
|
|
16
19
|
```text
|
|
17
20
|
synth_ai/
|
|
18
21
|
├── client.py # SynthClient and AsyncSynthClient composition layer
|
|
19
|
-
├── sdk/ #
|
|
22
|
+
├── sdk/ # Index + Research clients and shared pagination plumbing
|
|
20
23
|
├── core/ # Shared runtime helpers and errors
|
|
21
|
-
├── cli/ # CLI commands for
|
|
24
|
+
├── cli/ # CLI commands for index and research
|
|
22
25
|
└── __init__.py # Package version and top-level exports
|
|
23
26
|
```
|
|
24
27
|
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# CLI Modules
|
|
2
|
+
|
|
3
|
+
Thin Click adapters over `SynthClient`, `sdk.index` and `sdk.research`.
|
|
4
|
+
|
|
5
|
+
The CLI has two command families: `synth-ai index` (Synth Index) and
|
|
6
|
+
`synth-ai research` (Swarms and Research projects).
|
|
7
|
+
|
|
8
|
+
## Command Structure
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
synth-ai index --help
|
|
12
|
+
synth-ai index search QUERY --public # free, anonymous; sends no API key
|
|
13
|
+
synth-ai index search QUERY --keyed ... # paid keyed Search (SYNTH_API_KEY)
|
|
14
|
+
synth-ai index searches create|get|result|events|cancel ... # keyed durable Search
|
|
15
|
+
synth-ai index research preview|submit ... # authorized research intake
|
|
16
|
+
|
|
17
|
+
synth-ai research --help
|
|
18
|
+
synth-ai research projects ...
|
|
19
|
+
synth-ai research swarms ...
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`index search` never picks a route on its own: with no key and no flag it
|
|
23
|
+
refuses; `--public` never sends an inherited `SYNTH_API_KEY`; `--keyed` (or a
|
|
24
|
+
keyed-only option) without a key is refused, not downgraded to public. An
|
|
25
|
+
inherited key with no flag uses the keyed route and prints a notice on stderr.
|
|
26
|
+
|
|
27
|
+
Version note: infrastructure commands (`containers`, `tunnels`, `pools`) and the
|
|
28
|
+
operator consoles (`dev-envs`, the `synth-ai-research-factory-standup` script)
|
|
29
|
+
were removed in 0.18.0; see `CHANGELOG.md` for what replaced each one.
|
|
30
|
+
|
|
31
|
+
## Import Rules
|
|
32
|
+
|
|
33
|
+
```python
|
|
34
|
+
# CLI importing from SDK (correct)
|
|
35
|
+
from synth_ai import SynthClient
|
|
36
|
+
|
|
37
|
+
# CLI importing from core (correct)
|
|
38
|
+
from synth_ai.core.utils.env import get_api_key
|
|
39
|
+
|
|
40
|
+
# SDK importing from CLI (wrong - never do this)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Relationship to Other Modules
|
|
44
|
+
|
|
45
|
+
| Module | Relationship |
|
|
46
|
+
|--------|--------------|
|
|
47
|
+
| `core/` | `cli/` imports shared env/error helpers |
|
|
48
|
+
| `sdk/` / `client.py` | Business calls go through `SynthClient` / `PublicIndexClient` (Index) and Research clients (Swarms) |
|