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.
Files changed (306) hide show
  1. {synth_ai-0.21.1.dev652/synth_ai.egg-info → synth_ai-0.21.1.dev654}/PKG-INFO +81 -75
  2. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/README.md +78 -73
  3. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/pyproject.toml +3 -2
  4. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/README.md +7 -4
  5. synth_ai-0.21.1.dev654/synth_ai/cli/README.md +48 -0
  6. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/index.py +204 -16
  7. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/main.py +2 -2
  8. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/research.py +1 -1
  9. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/README.md +24 -8
  10. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/index.py +10 -18
  11. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/README.md +8 -5
  12. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/AGENT_SETUP_PROMPT.md +24 -13
  13. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/README.md +89 -24
  14. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/__init__.py +2 -0
  15. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/public.py +6 -4
  16. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/public_search.py +25 -1
  17. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/wallet_search.py +4 -2
  18. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654/synth_ai.egg-info}/PKG-INFO +81 -75
  19. synth_ai-0.21.1.dev652/synth_ai/cli/README.md +0 -35
  20. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/LICENSE +0 -0
  21. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/MANIFEST.in +0 -0
  22. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/openapi/index-v1.json +0 -0
  23. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/openapi/messaging-v1.json +0 -0
  24. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/openapi/research-v1.json +0 -0
  25. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/setup.cfg +0 -0
  26. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/setup.py +0 -0
  27. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/__init__.py +0 -0
  28. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/__main__.py +0 -0
  29. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/AGENTS.md +0 -0
  30. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/__init__.py +0 -0
  31. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/__main__.py +0 -0
  32. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/research_environments.py +0 -0
  33. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/research_image_releases.py +0 -0
  34. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/cli/research_projects.py +0 -0
  35. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/client.py +0 -0
  36. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/README.md +0 -0
  37. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/__init__.py +0 -0
  38. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/auth/__init__.py +0 -0
  39. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/auth/credentials.py +0 -0
  40. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/contracts/__init__.py +0 -0
  41. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/contracts/json_value.py +0 -0
  42. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/contracts/pagination.py +0 -0
  43. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/errors.py +0 -0
  44. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/http/__init__.py +0 -0
  45. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/http/async_transport.py +0 -0
  46. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/http/request.py +0 -0
  47. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/http/retry.py +0 -0
  48. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/http/streaming.py +0 -0
  49. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/http/transport.py +0 -0
  50. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/research/__init__.py +0 -0
  51. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/utils/__init__.py +0 -0
  52. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/utils/env.py +0 -0
  53. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/utils/log_filter.py +0 -0
  54. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/utils/paths.py +0 -0
  55. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/core/utils/urls.py +0 -0
  56. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/__init__.py +0 -0
  57. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/__main__.py +0 -0
  58. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/objective_tools.py +0 -0
  59. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/registry.py +0 -0
  60. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/request_models.py +0 -0
  61. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/server.py +0 -0
  62. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/__init__.py +0 -0
  63. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/approvals.py +0 -0
  64. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/artifacts.py +0 -0
  65. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/datasets.py +0 -0
  66. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/environments.py +0 -0
  67. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/exports.py +0 -0
  68. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/factories.py +0 -0
  69. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/factory_results.py +0 -0
  70. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/files.py +0 -0
  71. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/image_releases.py +0 -0
  72. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/integrations.py +0 -0
  73. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/intern_program.py +0 -0
  74. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/local_files.py +0 -0
  75. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/logs.py +0 -0
  76. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/models.py +0 -0
  77. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/outputs.py +0 -0
  78. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/policy_schemas.py +0 -0
  79. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/progress.py +0 -0
  80. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/project_data.py +0 -0
  81. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/projects.py +0 -0
  82. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/prs.py +0 -0
  83. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/readiness.py +0 -0
  84. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/repos.py +0 -0
  85. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/research_intern.py +0 -0
  86. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/resources.py +0 -0
  87. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/runs.py +0 -0
  88. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/trained_models.py +0 -0
  89. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/usage.py +0 -0
  90. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/visuals.py +0 -0
  91. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/mcp/research/tools/workspace_inputs.py +0 -0
  92. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/pools.py +0 -0
  93. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/py.typed +0 -0
  94. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/__init__.py +0 -0
  95. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/agent_policy.py +0 -0
  96. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/artifacts.py +0 -0
  97. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/catalog.py +0 -0
  98. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/client.py +0 -0
  99. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/contracts.py +0 -0
  100. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/contributions.py +0 -0
  101. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/errors.py +0 -0
  102. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/lifecycle.py +0 -0
  103. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/package.py +0 -0
  104. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/research_intake.py +0 -0
  105. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/retry.py +0 -0
  106. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/search.py +0 -0
  107. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/submission.py +0 -0
  108. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/timeouts.py +0 -0
  109. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/transfer.py +0 -0
  110. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/index/usage_accounting.py +0 -0
  111. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/messaging/README.md +0 -0
  112. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/messaging/__init__.py +0 -0
  113. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/messaging/client.py +0 -0
  114. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/messaging/contracts.py +0 -0
  115. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/optimizers/__init__.py +0 -0
  116. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/optimizers/client.py +0 -0
  117. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/optimizers/contracts.py +0 -0
  118. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/pagination.py +0 -0
  119. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/__init__.py +0 -0
  120. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/_internal/__init__.py +0 -0
  121. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/_internal/crypto.py +0 -0
  122. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/_internal/env.py +0 -0
  123. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/_internal/urls.py +0 -0
  124. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/account.py +0 -0
  125. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/advanced.py +0 -0
  126. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/advanced_factories.py +0 -0
  127. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/advanced_swarms.py +0 -0
  128. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/artifacts.py +0 -0
  129. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/auth.py +0 -0
  130. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/client.py +0 -0
  131. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/container_pools/__init__.py +0 -0
  132. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/container_pools/api.py +0 -0
  133. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/container_pools/contracts.py +0 -0
  134. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/container_pools/operations.py +0 -0
  135. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/container_pools/packaging.py +0 -0
  136. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/__init__.py +0 -0
  137. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/_activity_wire.py +0 -0
  138. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/_environment_wire.py +0 -0
  139. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/_transcript_wire.py +0 -0
  140. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/_wire.py +0 -0
  141. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/activity.py +0 -0
  142. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/activity_items.py +0 -0
  143. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/actor_images.py +0 -0
  144. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/billing.py +0 -0
  145. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/canonical_usage.py +0 -0
  146. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/checkpoints.py +0 -0
  147. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/cloud_deployment_claims.py +0 -0
  148. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/cloud_deployments.py +0 -0
  149. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/common.py +0 -0
  150. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/dataset_revisions.py +0 -0
  151. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/deliveries.py +0 -0
  152. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/dev_environment_evidence.py +0 -0
  153. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/economics.py +0 -0
  154. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/environment_manifest.py +0 -0
  155. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/environments.py +0 -0
  156. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/evidence.py +0 -0
  157. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/factories.py +0 -0
  158. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/factory_evidence.py +0 -0
  159. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/factory_lenses.py +0 -0
  160. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/factory_operations.py +0 -0
  161. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/factory_role_receipts.py +0 -0
  162. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/failure.py +0 -0
  163. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/image_releases.py +0 -0
  164. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/intern_blockers.py +0 -0
  165. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/intern_grants.py +0 -0
  166. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/intern_program.py +0 -0
  167. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/intern_resources.py +0 -0
  168. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/intern_usage.py +0 -0
  169. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/limit_evidence.py +0 -0
  170. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/local_execution_profile.py +0 -0
  171. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/operator_evidence.py +0 -0
  172. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/project.py +0 -0
  173. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/project_data.py +0 -0
  174. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/project_runtime.py +0 -0
  175. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/project_workspace.py +0 -0
  176. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/project_workspace_evidence.py +0 -0
  177. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/projects.py +0 -0
  178. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/promotions.py +0 -0
  179. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/research_intern.py +0 -0
  180. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/resource_settlement.py +0 -0
  181. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_authority.py +0 -0
  182. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_control.py +0 -0
  183. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_diagnostics.py +0 -0
  184. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_events.py +0 -0
  185. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_execution.py +0 -0
  186. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_launch.py +0 -0
  187. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_observability.py +0 -0
  188. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_state.py +0 -0
  189. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/run_timeline.py +0 -0
  190. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/runtime_image.py +0 -0
  191. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/runtime_intent.py +0 -0
  192. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/runtime_stream.py +0 -0
  193. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/runtime_stream_snapshot.py +0 -0
  194. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/scientific_integrity.py +0 -0
  195. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_actor_models.py +0 -0
  196. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_actor_policy_data.py +0 -0
  197. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_agent_harnesses.py +0 -0
  198. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_agent_kinds.py +0 -0
  199. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_agent_models.py +0 -0
  200. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_branching.py +0 -0
  201. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_credential_providers.py +0 -0
  202. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_environment_kinds.py +0 -0
  203. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_evidence_obligations.py +0 -0
  204. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_funding_sources.py +0 -0
  205. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_horizons.py +0 -0
  206. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_host_kinds.py +0 -0
  207. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_inference_providers.py +0 -0
  208. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_network_topology.py +0 -0
  209. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_providers.py +0 -0
  210. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_resource_kinds.py +0 -0
  211. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_roles.py +0 -0
  212. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_run_policy.py +0 -0
  213. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_runbooks.py +0 -0
  214. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_runnable_project.py +0 -0
  215. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_runtime_kinds.py +0 -0
  216. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_tool_providers.py +0 -0
  217. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/smr_work_modes.py +0 -0
  218. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/status.py +0 -0
  219. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/swarm_rollouts.py +0 -0
  220. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/swarms.py +0 -0
  221. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/tag.py +0 -0
  222. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/traces.py +0 -0
  223. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/transcript.py +0 -0
  224. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/types.py +0 -0
  225. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/usage.py +0 -0
  226. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/visuals.py +0 -0
  227. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/wire_models.py +0 -0
  228. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/wire_models_README.md +0 -0
  229. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/work_products.py +0 -0
  230. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/contracts/workspaces.py +0 -0
  231. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/economics.py +0 -0
  232. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/efforts.py +0 -0
  233. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/environments.py +0 -0
  234. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/errors.py +0 -0
  235. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/events.py +0 -0
  236. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/experiments.py +0 -0
  237. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/facade.py +0 -0
  238. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/factories.py +0 -0
  239. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/factory_storage.py +0 -0
  240. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/image_releases.py +0 -0
  241. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/intern_blockers.py +0 -0
  242. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/intern_program.py +0 -0
  243. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/knowledge.py +0 -0
  244. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/models.py +0 -0
  245. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/operations.py +0 -0
  246. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/project_data.py +0 -0
  247. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/project_deliveries.py +0 -0
  248. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/project_workspaces.py +0 -0
  249. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/projects.py +0 -0
  250. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/public.py +0 -0
  251. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/readouts.py +0 -0
  252. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/research_intern.py +0 -0
  253. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/secrets.py +0 -0
  254. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/README.md +0 -0
  255. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/__init__.py +0 -0
  256. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/_base.py +0 -0
  257. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/_client_helpers.py +0 -0
  258. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/_run_authority_mixin.py +0 -0
  259. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/approvals.py +0 -0
  260. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/billing.py +0 -0
  261. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/client.py +0 -0
  262. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/cloud_deployments.py +0 -0
  263. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/config.py +0 -0
  264. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/cost.py +0 -0
  265. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/datasets.py +0 -0
  266. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/dev_environments.py +0 -0
  267. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/environments.py +0 -0
  268. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/exports.py +0 -0
  269. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/factories.py +0 -0
  270. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/factory_evidence.py +0 -0
  271. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/files.py +0 -0
  272. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/github.py +0 -0
  273. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/image_releases.py +0 -0
  274. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/images.py +0 -0
  275. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/logs.py +0 -0
  276. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/models.py +0 -0
  277. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/outputs.py +0 -0
  278. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/progress.py +0 -0
  279. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/project.py +0 -0
  280. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/projects.py +0 -0
  281. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/prs.py +0 -0
  282. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/readiness.py +0 -0
  283. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/repositories.py +0 -0
  284. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/runs.py +0 -0
  285. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/secrets.py +0 -0
  286. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/setup.py +0 -0
  287. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/tag.py +0 -0
  288. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/trained_models.py +0 -0
  289. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/transport.py +0 -0
  290. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/usage.py +0 -0
  291. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/work_products.py +0 -0
  292. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/session/workspace_inputs.py +0 -0
  293. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/surface_parity.py +0 -0
  294. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/swarms.py +0 -0
  295. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/traces.py +0 -0
  296. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/transport/__init__.py +0 -0
  297. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/transport/http.py +0 -0
  298. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/transport/pagination.py +0 -0
  299. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/version.py +0 -0
  300. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/visuals.py +0 -0
  301. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai/sdk/research/wiki.py +0 -0
  302. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai.egg-info/SOURCES.txt +0 -0
  303. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai.egg-info/dependency_links.txt +0 -0
  304. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai.egg-info/entry_points.txt +0 -0
  305. {synth_ai-0.21.1.dev652 → synth_ai-0.21.1.dev654}/synth_ai.egg-info/requires.txt +0 -0
  306. {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.dev652
4
- Summary: Python SDK and CLI for Synth Index, Managed Research, and Research Factory
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.0-orange synth-ai==0.21.0 -->
33
+ <!-- CI release pins: PyPI-0.21.1-orange synth-ai==0.21.1 -->
33
34
 
34
35
  [![PyPI version](https://img.shields.io/pypi/v/synth-ai.svg)](https://pypi.org/project/synth-ai/)
35
36
  [![License](https://img.shields.io/pypi/l/synth-ai.svg)](https://pypi.org/project/synth-ai/)
36
37
  [![Python versions](https://img.shields.io/pypi/pyversions/synth-ai.svg)](https://pypi.org/project/synth-ai/)
37
38
 
38
- Python SDK and CLI for Synth Index, Managed Research, and Research Factory.
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
- Set `SYNTH_API_KEY` before using the SDK or CLI:
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
- The only customer entrypoint is `SynthClient().research`. Its stable namespaces
116
- are `projects`, `swarms`, and `factories`.
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 research --help
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
- - **Python:** `SynthClient().index.search(query=..., mode="fast" | "deep", billing=...)`.
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
- Not in alpha v0.1: downloading the files behind
224
- a citation, citations that point to an exact passage, a latency guarantee, and
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
- ## Public Surface
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
- Use `SynthClient` as the front door:
216
+ ```python
217
+ from synth_ai.sdk.index import PublicIndexClient
231
218
 
232
- | Surface | Client namespace | Use it for |
233
- | --- | --- | --- |
234
- | **Index** | `client.index` | Authenticated, funded FAST/DEEP Search and Contribution lifecycle. |
235
- | **Research / Factory** | `client.research` | Typed hosted projects, swarms, Factory lifecycles, and Efforts. |
236
- | CLI / MCP | `synth-ai`, `synth-ai-index-mcp` | Terminal commands and an Index-only coding-agent server. |
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
- Index is an API/MCP product, not a browser search page. Anonymous public
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
- FAST's five-cent ceiling is explicit wallet consent, not a claim that DEEP has
263
- the same price. See the [Index SDK guide](https://github.com/synth-laboratories/synth-ai/blob/main/synth_ai/sdk/index/README.md) for
264
- DEEP's durable Search ID, reconnect/cancel, private collections, receipts, and
265
- coding-agent MCP setup. These calls require a deployed Index API; installing
266
- the SDK alone does not make a Search available.
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
- Use [Managed Research](https://docs.usesynth.ai/managed-research/intro) when you
269
- want hosted research workers, repo runs, evidence, checkpoints, MCP, or final
270
- reports.
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
- ## Managed Research Billing
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
- Standalone SMR and Managed Factory draw from the same org-level allowance and
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.0-orange synth-ai==0.21.0 -->
3
+ <!-- CI release pins: PyPI-0.21.1-orange synth-ai==0.21.1 -->
4
4
 
5
5
  [![PyPI version](https://img.shields.io/pypi/v/synth-ai.svg)](https://pypi.org/project/synth-ai/)
6
6
  [![License](https://img.shields.io/pypi/l/synth-ai.svg)](https://pypi.org/project/synth-ai/)
7
7
  [![Python versions](https://img.shields.io/pypi/pyversions/synth-ai.svg)](https://pypi.org/project/synth-ai/)
8
8
 
9
- Python SDK and CLI for Synth Index, Managed Research, and Research Factory.
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
- Set `SYNTH_API_KEY` before using the SDK or CLI:
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
- The only customer entrypoint is `SynthClient().research`. Its stable namespaces
87
- are `projects`, `swarms`, and `factories`.
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 research --help
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
- - **Python:** `SynthClient().index.search(query=..., mode="fast" | "deep", billing=...)`.
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
- Not in alpha v0.1: downloading the files behind
195
- a citation, citations that point to an exact passage, a latency guarantee, and
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
- ## Public Surface
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
- Use `SynthClient` as the front door:
186
+ ```python
187
+ from synth_ai.sdk.index import PublicIndexClient
202
188
 
203
- | Surface | Client namespace | Use it for |
204
- | --- | --- | --- |
205
- | **Index** | `client.index` | Authenticated, funded FAST/DEEP Search and Contribution lifecycle. |
206
- | **Research / Factory** | `client.research` | Typed hosted projects, swarms, Factory lifecycles, and Efforts. |
207
- | CLI / MCP | `synth-ai`, `synth-ai-index-mcp` | Terminal commands and an Index-only coding-agent server. |
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
- Index is an API/MCP product, not a browser search page. Anonymous public
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
- FAST's five-cent ceiling is explicit wallet consent, not a claim that DEEP has
234
- the same price. See the [Index SDK guide](https://github.com/synth-laboratories/synth-ai/blob/main/synth_ai/sdk/index/README.md) for
235
- DEEP's durable Search ID, reconnect/cancel, private collections, receipts, and
236
- coding-agent MCP setup. These calls require a deployed Index API; installing
237
- the SDK alone does not make a Search available.
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
- Use [Managed Research](https://docs.usesynth.ai/managed-research/intro) when you
240
- want hosted research workers, repo runs, evidence, checkpoints, MCP, or final
241
- reports.
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
- ## Managed Research Billing
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
- Standalone SMR and Managed Factory draw from the same org-level allowance and
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.dev652"
4
- description = "Python SDK and CLI for Synth Index, Managed Research, and Research Factory"
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.research`
10
- - `synth-ai` CLI
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/ # Research + shared pagination plumbing
22
+ ├── sdk/ # Index + Research clients and shared pagination plumbing
20
23
  ├── core/ # Shared runtime helpers and errors
21
- ├── cli/ # CLI commands for research (and local helpers)
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) |