synth-ai 0.17.5.dev589__tar.gz → 0.18.0.dev590__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 (283) hide show
  1. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/MANIFEST.in +1 -8
  2. {synth_ai-0.17.5.dev589/synth_ai.egg-info → synth_ai-0.18.0.dev590}/PKG-INFO +8 -17
  3. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/README.md +6 -6
  4. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/pyproject.toml +4 -35
  5. synth_ai-0.18.0.dev590/synth_ai/README.md +87 -0
  6. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/__init__.py +4 -7
  7. synth_ai-0.18.0.dev590/synth_ai/__main__.py +7 -0
  8. synth_ai-0.18.0.dev590/synth_ai/cli/AGENTS.md +16 -0
  9. synth_ai-0.18.0.dev590/synth_ai/cli/README.md +35 -0
  10. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/cli/main.py +0 -2
  11. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/client.py +10 -9
  12. synth_ai-0.18.0.dev590/synth_ai/core/README.md +68 -0
  13. synth_ai-0.18.0.dev590/synth_ai/core/__init__.py +7 -0
  14. synth_ai-0.18.0.dev590/synth_ai/core/auth/__init__.py +4 -0
  15. synth_ai-0.18.0.dev590/synth_ai/core/contracts/__init__.py +4 -0
  16. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/contracts/pagination.py +2 -13
  17. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/errors.py +2 -100
  18. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/http/transport.py +22 -0
  19. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/research/__init__.py +30 -3
  20. synth_ai-0.18.0.dev590/synth_ai/core/utils/__init__.py +6 -0
  21. synth_ai-0.18.0.dev590/synth_ai/core/utils/env.py +75 -0
  22. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/utils/log_filter.py +2 -2
  23. synth_ai-0.18.0.dev590/synth_ai/core/utils/paths.py +10 -0
  24. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/utils/urls.py +0 -141
  25. synth_ai-0.18.0.dev590/synth_ai/mcp/research/README.md +85 -0
  26. synth_ai-0.18.0.dev590/synth_ai/mcp/research/objective_tools.py +34 -0
  27. synth_ai-0.18.0.dev590/synth_ai/mcp/research/registry.py +320 -0
  28. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/request_models.py +27 -48
  29. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/server.py +30 -778
  30. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/__init__.py +0 -6
  31. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/approvals.py +4 -4
  32. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/artifacts.py +7 -7
  33. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/datasets.py +3 -3
  34. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/environments.py +4 -4
  35. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/exports.py +2 -2
  36. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/factories.py +51 -51
  37. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/factory_results.py +11 -11
  38. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/files.py +4 -34
  39. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/image_releases.py +5 -5
  40. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/integrations.py +4 -4
  41. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/logs.py +1 -1
  42. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/models.py +4 -4
  43. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/outputs.py +7 -7
  44. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/progress.py +4 -4
  45. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/project_data.py +7 -7
  46. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/projects.py +43 -43
  47. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/prs.py +2 -2
  48. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/readiness.py +1 -1
  49. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/repos.py +3 -3
  50. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/resources.py +16 -16
  51. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/runs.py +57 -57
  52. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/trained_models.py +13 -13
  53. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/usage.py +8 -8
  54. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/visuals.py +5 -8
  55. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/tools/workspace_inputs.py +3 -3
  56. synth_ai-0.18.0.dev590/synth_ai/sdk/README.md +38 -0
  57. synth_ai-0.18.0.dev590/synth_ai/sdk/__init__.py +8 -0
  58. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/pagination.py +1 -10
  59. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/advanced.py +11 -3
  60. synth_ai-0.18.0.dev590/synth_ai/sdk/research/advanced_factories.py +343 -0
  61. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/advanced_swarms.py +4 -103
  62. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/client.py +15 -1
  63. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/factory_operations.py +0 -45
  64. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_control.py +3 -3
  65. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_events.py +1 -1
  66. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/runtime_image.py +0 -1
  67. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_providers.py +0 -24
  68. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/traces.py +2 -3
  69. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/visuals.py +1 -4
  70. synth_ai-0.18.0.dev590/synth_ai/sdk/research/contracts/wire_models_README.md +33 -0
  71. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/economics.py +0 -4
  72. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/errors.py +50 -25
  73. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/events.py +0 -7
  74. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/facade.py +77 -3
  75. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/factories.py +0 -2
  76. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/projects.py +19 -17
  77. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/public.py +1 -6
  78. synth_ai-0.18.0.dev590/synth_ai/sdk/research/session/README.md +128 -0
  79. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/__init__.py +158 -295
  80. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/_client_helpers.py +7 -5
  81. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/_run_authority_mixin.py +15 -16
  82. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/client.py +23 -85
  83. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/config.py +0 -30
  84. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/dev_environments.py +298 -35
  85. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/factories.py +307 -1
  86. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/image_releases.py +2 -2
  87. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/images.py +2 -2
  88. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/project.py +0 -4
  89. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/runs.py +12 -10
  90. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/transport.py +3 -3
  91. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/usage.py +3 -3
  92. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/swarms.py +20 -13
  93. synth_ai-0.18.0.dev590/synth_ai/sdk/research/transport/__init__.py +6 -0
  94. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/transport/http.py +35 -30
  95. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/visuals.py +1 -10
  96. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590/synth_ai.egg-info}/PKG-INFO +8 -17
  97. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai.egg-info/SOURCES.txt +10 -24
  98. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai.egg-info/entry_points.txt +0 -1
  99. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai.egg-info/requires.txt +0 -13
  100. synth_ai-0.17.5.dev589/synth_ai/__main__.py +0 -36
  101. synth_ai-0.17.5.dev589/synth_ai/cli/dev_envs.py +0 -1162
  102. synth_ai-0.17.5.dev589/synth_ai/cli/research_factory_standup.py +0 -1429
  103. synth_ai-0.17.5.dev589/synth_ai/config.py +0 -8
  104. synth_ai-0.17.5.dev589/synth_ai/core/__init__.py +0 -61
  105. synth_ai-0.17.5.dev589/synth_ai/core/auth/__init__.py +0 -6
  106. synth_ai-0.17.5.dev589/synth_ai/core/auth/context.py +0 -23
  107. synth_ai-0.17.5.dev589/synth_ai/core/contracts/__init__.py +0 -17
  108. synth_ai-0.17.5.dev589/synth_ai/core/contracts/resources.py +0 -26
  109. synth_ai-0.17.5.dev589/synth_ai/core/utils/__init__.py +0 -67
  110. synth_ai-0.17.5.dev589/synth_ai/core/utils/dict.py +0 -25
  111. synth_ai-0.17.5.dev589/synth_ai/core/utils/env.py +0 -280
  112. synth_ai-0.17.5.dev589/synth_ai/core/utils/json.py +0 -62
  113. synth_ai-0.17.5.dev589/synth_ai/core/utils/paths.py +0 -107
  114. synth_ai-0.17.5.dev589/synth_ai/core/utils/secure_files.py +0 -45
  115. synth_ai-0.17.5.dev589/synth_ai/core/utils/workspace.py +0 -169
  116. synth_ai-0.17.5.dev589/synth_ai/mcp/research/objective_tools.py +0 -71
  117. synth_ai-0.17.5.dev589/synth_ai/mcp/research/registry.py +0 -298
  118. synth_ai-0.17.5.dev589/synth_ai/mcp/research/tools/cloud_deployments.py +0 -435
  119. synth_ai-0.17.5.dev589/synth_ai/mcp/research/tools/dev_environments.py +0 -445
  120. synth_ai-0.17.5.dev589/synth_ai/mcp/research/tools/tag.py +0 -178
  121. synth_ai-0.17.5.dev589/synth_ai/sdk/__init__.py +0 -13
  122. synth_ai-0.17.5.dev589/synth_ai/sdk/research/advanced_factories.py +0 -778
  123. synth_ai-0.17.5.dev589/synth_ai/sdk/research/enums.py +0 -25
  124. synth_ai-0.17.5.dev589/synth_ai/sdk/research/factory_plans/__init__.py +0 -1
  125. synth_ai-0.17.5.dev589/synth_ai/sdk/research/schemas/smr_openapi.yaml +0 -77570
  126. synth_ai-0.17.5.dev589/synth_ai/sdk/research/session/compat.py +0 -45
  127. synth_ai-0.17.5.dev589/synth_ai/sdk/research/session/credentials.py +0 -91
  128. synth_ai-0.17.5.dev589/synth_ai/sdk/research/session/integrations.py +0 -54
  129. synth_ai-0.17.5.dev589/synth_ai/sdk/research/session/py.typed +0 -1
  130. synth_ai-0.17.5.dev589/synth_ai/sdk/research/session/repos.py +0 -75
  131. synth_ai-0.17.5.dev589/synth_ai/sdk/research/transport/__init__.py +0 -21
  132. synth_ai-0.17.5.dev589/synth_ai/sdk/research/transport/retries.py +0 -15
  133. synth_ai-0.17.5.dev589/synth_ai/sdk/research/transport/streaming.py +0 -36
  134. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/LICENSE +0 -0
  135. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/setup.cfg +0 -0
  136. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/cli/__init__.py +0 -0
  137. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/cli/__main__.py +0 -0
  138. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/cli/research.py +0 -0
  139. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/cli/research_environments.py +0 -0
  140. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/cli/research_image_releases.py +0 -0
  141. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/cli/research_projects.py +0 -0
  142. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/auth/credentials.py +0 -0
  143. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/contracts/json_value.py +0 -0
  144. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/http/__init__.py +0 -0
  145. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/http/async_transport.py +0 -0
  146. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/http/request.py +0 -0
  147. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/http/retry.py +0 -0
  148. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/core/http/streaming.py +0 -0
  149. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/__init__.py +0 -0
  150. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/mcp/research/__main__.py +0 -0
  151. /synth_ai-0.17.5.dev589/synth_ai/mcp/research/tools/smr_policy_schemas.py → /synth_ai-0.18.0.dev590/synth_ai/mcp/research/tools/policy_schemas.py +0 -0
  152. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/py.typed +0 -0
  153. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/__init__.py +0 -0
  154. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/_internal/__init__.py +0 -0
  155. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/_internal/crypto.py +0 -0
  156. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/_internal/env.py +0 -0
  157. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/_internal/urls.py +0 -0
  158. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/account.py +0 -0
  159. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/artifacts.py +0 -0
  160. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/auth.py +0 -0
  161. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/__init__.py +0 -0
  162. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/_activity_wire.py +0 -0
  163. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/_environment_wire.py +0 -0
  164. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/_transcript_wire.py +0 -0
  165. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/_wire.py +0 -0
  166. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/activity.py +0 -0
  167. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/activity_items.py +0 -0
  168. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/actor_images.py +0 -0
  169. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/billing.py +0 -0
  170. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/canonical_usage.py +0 -0
  171. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/checkpoints.py +0 -0
  172. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/cloud_deployment_claims.py +0 -0
  173. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/cloud_deployments.py +0 -0
  174. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/common.py +0 -0
  175. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/dataset_revisions.py +0 -0
  176. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/deliveries.py +0 -0
  177. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/dev_environment_evidence.py +0 -0
  178. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/economics.py +0 -0
  179. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/environment_manifest.py +0 -0
  180. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/environments.py +0 -0
  181. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/evidence.py +0 -0
  182. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/factories.py +0 -0
  183. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/factory_evidence.py +0 -0
  184. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/factory_lenses.py +0 -0
  185. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/factory_role_receipts.py +0 -0
  186. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/image_releases.py +0 -0
  187. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/local_execution_profile.py +0 -0
  188. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/operator_evidence.py +0 -0
  189. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/project.py +0 -0
  190. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/project_data.py +0 -0
  191. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/project_runtime.py +0 -0
  192. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/project_workspace.py +0 -0
  193. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/project_workspace_evidence.py +0 -0
  194. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/projects.py +0 -0
  195. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/promotions.py +0 -0
  196. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/research_intern.py +0 -0
  197. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_authority.py +0 -0
  198. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_diagnostics.py +0 -0
  199. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_execution.py +0 -0
  200. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_launch.py +0 -0
  201. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_observability.py +0 -0
  202. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_state.py +0 -0
  203. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/run_timeline.py +0 -0
  204. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/runtime_intent.py +0 -0
  205. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/runtime_stream.py +0 -0
  206. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/runtime_stream_snapshot.py +0 -0
  207. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/scientific_integrity.py +0 -0
  208. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_actor_models.py +0 -0
  209. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_actor_policy_data.py +0 -0
  210. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_agent_harnesses.py +0 -0
  211. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_agent_kinds.py +0 -0
  212. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_agent_models.py +0 -0
  213. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_branching.py +0 -0
  214. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_credential_providers.py +0 -0
  215. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_environment_kinds.py +0 -0
  216. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_evidence_obligations.py +0 -0
  217. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_funding_sources.py +0 -0
  218. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_horizons.py +0 -0
  219. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_host_kinds.py +0 -0
  220. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_inference_providers.py +0 -0
  221. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_network_topology.py +0 -0
  222. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_resource_kinds.py +0 -0
  223. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_roles.py +0 -0
  224. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_run_policy.py +0 -0
  225. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_runbooks.py +0 -0
  226. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_runnable_project.py +0 -0
  227. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_runtime_kinds.py +0 -0
  228. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_tool_providers.py +0 -0
  229. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/smr_work_modes.py +0 -0
  230. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/status.py +0 -0
  231. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/swarms.py +0 -0
  232. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/tag.py +0 -0
  233. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/transcript.py +0 -0
  234. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/types.py +0 -0
  235. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/usage.py +0 -0
  236. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/wire_models.py +0 -0
  237. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/work_products.py +0 -0
  238. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/contracts/workspaces.py +0 -0
  239. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/efforts.py +0 -0
  240. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/environments.py +0 -0
  241. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/experiments.py +0 -0
  242. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/factory_storage.py +0 -0
  243. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/image_releases.py +0 -0
  244. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/knowledge.py +0 -0
  245. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/models.py +0 -0
  246. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/operations.py +0 -0
  247. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/project_data.py +0 -0
  248. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/project_deliveries.py +0 -0
  249. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/project_workspaces.py +0 -0
  250. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/readouts.py +0 -0
  251. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/research_intern.py +0 -0
  252. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/secrets.py +0 -0
  253. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/_base.py +0 -0
  254. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/approvals.py +0 -0
  255. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/billing.py +0 -0
  256. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/cloud_deployments.py +0 -0
  257. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/cost.py +0 -0
  258. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/datasets.py +0 -0
  259. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/environments.py +0 -0
  260. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/exports.py +0 -0
  261. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/factory_evidence.py +0 -0
  262. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/files.py +0 -0
  263. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/github.py +0 -0
  264. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/logs.py +0 -0
  265. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/models.py +0 -0
  266. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/outputs.py +0 -0
  267. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/progress.py +0 -0
  268. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/projects.py +0 -0
  269. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/prs.py +0 -0
  270. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/readiness.py +0 -0
  271. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/repositories.py +0 -0
  272. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/secrets.py +0 -0
  273. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/setup.py +0 -0
  274. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/tag.py +0 -0
  275. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/trained_models.py +0 -0
  276. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/work_products.py +0 -0
  277. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/session/workspace_inputs.py +0 -0
  278. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/traces.py +0 -0
  279. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/transport/pagination.py +0 -0
  280. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/version.py +0 -0
  281. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai/sdk/research/wiki.py +0 -0
  282. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai.egg-info/dependency_links.txt +0 -0
  283. {synth_ai-0.17.5.dev589 → synth_ai-0.18.0.dev590}/synth_ai.egg-info/top_level.txt +0 -0
@@ -1,8 +1,7 @@
1
1
  include README.md
2
2
  include LICENSE
3
3
  recursive-include synth_ai *.py
4
- # Only include lightweight config/data files from core packages
5
- recursive-include synth_ai *.toml
4
+ recursive-include synth_ai *.md
6
5
  # Prune heavy example/demo/test/data trees from the sdist (keep code)
7
6
  prune tests
8
7
  prune private_tests
@@ -23,12 +22,6 @@ recursive-exclude synth_ai *.pth
23
22
  recursive-exclude synth_ai *.bin
24
23
  recursive-exclude synth_ai *.zip
25
24
  recursive-exclude synth_ai *.tar
26
- # The built-in Factory standup plans are lightweight runtime resources. Keep
27
- # them in source and wheel distributions after excluding other JSON datasets.
28
- recursive-include synth_ai/managed_research/factory_plans *.json
29
- # The backend-authored public model registry is part of the vendored Research
30
- # contract and must remain inspectable from an installed SDK.
31
- include synth_ai/managed_research/schemas/public_models.json
32
25
  global-exclude *.pyc
33
26
  global-exclude __pycache__
34
27
  global-exclude .DS_Store
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synth-ai
3
- Version: 0.17.5.dev589
4
- Summary: Python-only SDK for Synth containers, tunnels, pools, and Research
3
+ Version: 0.18.0.dev590
4
+ Summary: Python SDK and CLI for Synth Managed Research and Research Factory
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
@@ -14,10 +14,6 @@ Requires-Dist: pydantic>=2.0.0
14
14
  Requires-Dist: pynacl>=1.5.0
15
15
  Requires-Dist: click<8.2,>=8.1.7
16
16
  Requires-Dist: httpx>=0.28.1
17
- Provides-Extra: schemas
18
- Provides-Extra: providers
19
- Requires-Dist: anthropic>=0.42.0; extra == "providers"
20
- Requires-Dist: google-genai>=1.26.0; extra == "providers"
21
17
  Provides-Extra: dev
22
18
  Requires-Dist: build>=1.2.2.post1; extra == "dev"
23
19
  Requires-Dist: twine>=4.0.0; extra == "dev"
@@ -26,17 +22,12 @@ Requires-Dist: ruff>=0.1.0; extra == "dev"
26
22
  Requires-Dist: papermill>=2.6.0; extra == "dev"
27
23
  Requires-Dist: nest_asyncio>=1.6.0; extra == "dev"
28
24
  Requires-Dist: mdxify>=0.2.0; extra == "dev"
29
- Provides-Extra: all
30
- Requires-Dist: anthropic>=0.42.0; extra == "all"
31
- Requires-Dist: google-genai>=1.26.0; extra == "all"
32
- Provides-Extra: analytics
33
- Requires-Dist: pandas>=2.2.3; extra == "analytics"
34
25
  Provides-Extra: research
35
26
  Dynamic: license-file
36
27
 
37
28
  # Synth AI SDK
38
29
 
39
- <!-- CI release pins: PyPI-0.17.5-orange synth-ai==0.17.5 -->
30
+ <!-- CI release pins: PyPI-0.18.0-orange synth-ai==0.18.0 -->
40
31
 
41
32
  [![PyPI version](https://img.shields.io/pypi/v/synth-ai.svg)](https://pypi.org/project/synth-ai/)
42
33
  [![License](https://img.shields.io/pypi/l/synth-ai.svg)](https://pypi.org/project/synth-ai/)
@@ -85,7 +76,7 @@ The CLI also reads `SYNTH_BACKEND_URL` and accepts `--backend-url`.
85
76
 
86
77
  ```python
87
78
  from synth_ai import SynthClient
88
- from synth_ai.core.research.public import SwarmSpec
79
+ from synth_ai.sdk.research.public import SwarmSpec
89
80
 
90
81
  with SynthClient() as client:
91
82
  swarm = client.research.swarms.create(
@@ -126,7 +117,7 @@ Create a durable project when work needs reusable configuration:
126
117
 
127
118
  ```python
128
119
  from synth_ai import SynthClient
129
- from synth_ai.core.research.public import EnvironmentKind, ProjectSpec, RuntimeKind, SwarmSpec
120
+ from synth_ai.sdk.research.public import EnvironmentKind, ProjectSpec, RuntimeKind, SwarmSpec
130
121
 
131
122
  with SynthClient() as client:
132
123
  project = client.research.projects.create(
@@ -151,7 +142,7 @@ parity:
151
142
 
152
143
  ```python
153
144
  from synth_ai import SynthClient
154
- from synth_ai.core.research.public import EffortSpec, FactorySpec, ProjectId
145
+ from synth_ai.sdk.research.public import EffortSpec, FactorySpec, ProjectId
155
146
 
156
147
  with SynthClient() as client:
157
148
  factory = client.research.factories.create(
@@ -194,8 +185,8 @@ Use `SynthClient` as the front door:
194
185
  | **Research / Factory** | `client.research` | Typed hosted projects, swarms, Factory lifecycles, and Efforts. |
195
186
  | CLI | `synth-ai` | Terminal access to Research commands. |
196
187
 
197
- Infrastructure clients (containers, tunnels, pools) are parked under `old/` for
198
- later restoration and are not composed on `SynthClient` right now.
188
+ There are no infrastructure client namespaces (containers, tunnels, pools) on
189
+ `SynthClient`; the package is Research-only as of 0.18.0.
199
190
 
200
191
  Use [Managed Research](https://docs.usesynth.ai/managed-research/intro) when you
201
192
  want hosted research workers, repo runs, evidence, checkpoints, MCP, or final
@@ -1,6 +1,6 @@
1
1
  # Synth AI SDK
2
2
 
3
- <!-- CI release pins: PyPI-0.17.5-orange synth-ai==0.17.5 -->
3
+ <!-- CI release pins: PyPI-0.18.0-orange synth-ai==0.18.0 -->
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/)
@@ -49,7 +49,7 @@ The CLI also reads `SYNTH_BACKEND_URL` and accepts `--backend-url`.
49
49
 
50
50
  ```python
51
51
  from synth_ai import SynthClient
52
- from synth_ai.core.research.public import SwarmSpec
52
+ from synth_ai.sdk.research.public import SwarmSpec
53
53
 
54
54
  with SynthClient() as client:
55
55
  swarm = client.research.swarms.create(
@@ -90,7 +90,7 @@ Create a durable project when work needs reusable configuration:
90
90
 
91
91
  ```python
92
92
  from synth_ai import SynthClient
93
- from synth_ai.core.research.public import EnvironmentKind, ProjectSpec, RuntimeKind, SwarmSpec
93
+ from synth_ai.sdk.research.public import EnvironmentKind, ProjectSpec, RuntimeKind, SwarmSpec
94
94
 
95
95
  with SynthClient() as client:
96
96
  project = client.research.projects.create(
@@ -115,7 +115,7 @@ parity:
115
115
 
116
116
  ```python
117
117
  from synth_ai import SynthClient
118
- from synth_ai.core.research.public import EffortSpec, FactorySpec, ProjectId
118
+ from synth_ai.sdk.research.public import EffortSpec, FactorySpec, ProjectId
119
119
 
120
120
  with SynthClient() as client:
121
121
  factory = client.research.factories.create(
@@ -158,8 +158,8 @@ Use `SynthClient` as the front door:
158
158
  | **Research / Factory** | `client.research` | Typed hosted projects, swarms, Factory lifecycles, and Efforts. |
159
159
  | CLI | `synth-ai` | Terminal access to Research commands. |
160
160
 
161
- Infrastructure clients (containers, tunnels, pools) are parked under `old/` for
162
- later restoration and are not composed on `SynthClient` right now.
161
+ There are no infrastructure client namespaces (containers, tunnels, pools) on
162
+ `SynthClient`; the package is Research-only as of 0.18.0.
163
163
 
164
164
  Use [Managed Research](https://docs.usesynth.ai/managed-research/intro) when you
165
165
  want hosted research workers, repo runs, evidence, checkpoints, MCP, or final
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "synth-ai"
3
- version = "0.17.5.dev589"
4
- description = "Python-only SDK for Synth containers, tunnels, pools, and Research"
3
+ version = "0.18.0.dev590"
4
+ description = "Python SDK and CLI for Synth Managed Research and Research Factory"
5
5
  authors = [{name = "Synth AI", email = "josh@usesynth.ai"}]
6
6
  license = "MIT"
7
7
  license-files = ["LICENSE"]
@@ -18,15 +18,8 @@ dependencies = [
18
18
  [project.scripts]
19
19
  synth-ai = "synth_ai.cli:cli"
20
20
  synth-ai-research-mcp = "synth_ai.mcp.research.server:main"
21
- synth-ai-research-factory-standup = "synth_ai.cli.research_factory_standup:main"
22
21
 
23
22
  [project.optional-dependencies]
24
- schemas = []
25
- providers = [
26
- # Optional LLM providers (lazy-loaded when used)
27
- "anthropic>=0.42.0",
28
- "google-genai>=1.26.0",
29
- ]
30
23
  dev = [
31
24
  "build>=1.2.2.post1",
32
25
  "twine>=4.0.0",
@@ -36,14 +29,6 @@ dev = [
36
29
  "nest_asyncio>=1.6.0",
37
30
  "mdxify>=0.2.0",
38
31
  ]
39
- all = [
40
- # Include providers
41
- "anthropic>=0.42.0",
42
- "google-genai>=1.26.0",
43
- ]
44
- analytics = [
45
- "pandas>=2.2.3",
46
- ]
47
32
  research = [
48
33
  # Compatibility extra retained so `synth-ai[research]` remains valid.
49
34
  ]
@@ -73,8 +58,6 @@ include-package-data = true
73
58
 
74
59
  [tool.setuptools.exclude-package-data]
75
60
  "synth_ai" = [
76
- # Exclude heavy data inside agent_demos/old/tests
77
- "**/agent_demos/**",
78
61
  "**/tests/**",
79
62
  "**/units/**",
80
63
  ]
@@ -82,12 +65,6 @@ include-package-data = true
82
65
  [tool.setuptools.package-data]
83
66
  "synth_ai" = [
84
67
  "py.typed",
85
- # Research moved core/research -> sdk/research (see unify_sdk_layering.md).
86
- # These globs are the only thing that puts the factory plans and vendored
87
- # schemas into the wheel; a stale path here ships a package that imports and
88
- # then fails at runtime looking for data files.
89
- "sdk/research/factory_plans/*.json",
90
- "sdk/research/schemas/*",
91
68
  ]
92
69
 
93
70
  [tool.ruff]
@@ -124,19 +101,11 @@ ignore = [
124
101
  ]
125
102
 
126
103
  [tool.ruff.lint.per-file-ignores]
127
- "synth_ai/http.py" = ["F403"]
128
104
  "**/__init__.py" = ["N999"]
129
105
  "**/__main__.py" = ["N999"]
130
106
 
131
- [tool.ty.src]
132
- include = ["synth_ai"]
133
-
134
- # The _legacy tree this override named was deleted when the compatibility
135
- # packages were retired; check_research_migration_boundaries.py now asserts its
136
- # absence. Nothing to override.
137
-
138
- [tool.ty.rules]
139
- possibly-missing-attribute = "ignore"
107
+ # Type-check configuration lives in ty.toml, which takes precedence over any
108
+ # [tool.ty.*] here.
140
109
 
141
110
  [dependency-groups]
142
111
  dev = [
@@ -0,0 +1,87 @@
1
+ # `synth_ai` Package
2
+
3
+ Runtime package for the public Synth AI SDK and CLI.
4
+
5
+ The public first-mile surface is intentionally small:
6
+
7
+ - `SynthClient`
8
+ - `AsyncSynthClient`
9
+ - `client.research`
10
+ - `synth-ai` CLI
11
+
12
+ Public docs live at https://docs.usesynth.ai/sdk/overview.
13
+
14
+ ## Package Structure
15
+
16
+ ```text
17
+ synth_ai/
18
+ ├── client.py # SynthClient and AsyncSynthClient composition layer
19
+ ├── sdk/ # Research + shared pagination plumbing
20
+ ├── core/ # Shared runtime helpers and errors
21
+ ├── cli/ # CLI commands for research (and local helpers)
22
+ └── __init__.py # Package version and top-level exports
23
+ ```
24
+
25
+ ## Dependency Direction
26
+
27
+ ```text
28
+ core/ -> sdk/ -> client.py -> cli/
29
+ ```
30
+
31
+ - `core/` owns shared runtime plumbing such as errors, environment lookup, and URL normalization.
32
+ - `sdk/` owns Research clients/contracts plus shared pagination helpers.
33
+ - `client.py` composes Research behind `SynthClient` and `AsyncSynthClient`.
34
+ - `cli/` wraps the SDK for terminal use.
35
+
36
+ ## Supported Imports
37
+
38
+ Prefer the front-door client and the hero nouns:
39
+
40
+ ```python
41
+ from synth_ai import SynthClient
42
+
43
+ research = SynthClient().research
44
+ project = research.projects.create(request)
45
+ swarm = research.swarms.create(project.project_id, request=launch)
46
+ swarm.wait()
47
+ ```
48
+
49
+ `research.advanced.*` exists but is explicitly unstable operator surface; do
50
+ not build against it as if it were the public story.
51
+
52
+ ## Layering
53
+
54
+ One DAG, enforced by `check_sdk_layering.py` in the sibling `testing` repo.
55
+ See `unify_sdk_layering.md` for the rationale.
56
+
57
+ ```text
58
+ core/ plumbing only: auth, http, errors, utils, generic contracts
59
+ |
60
+ v
61
+ sdk/ Research + pagination
62
+ |
63
+ v
64
+ client.py SynthClient / AsyncSynthClient composition
65
+ |
66
+ +--> cli/ thin terminal adapter
67
+ +--> mcp/research/ thin MCP adapter
68
+ ```
69
+
70
+ | From \ To | `core` | `sdk` | `client` | `cli` | `mcp` |
71
+ |-----------|--------|-------|----------|-------|-------|
72
+ | `core` | yes | **no** | no | no | no |
73
+ | `sdk` | yes | yes | no | no | no |
74
+ | `client` | yes | yes | — | no | no |
75
+ | `cli` | yes | yes | yes | — | no |
76
+ | `mcp` | yes | yes | preferred yes | no | — |
77
+
78
+ `core/` must not import `sdk/`: plumbing cannot depend on the clients built on
79
+ top of it. Peer imports inside a layer are fine.
80
+
81
+ ## Guidelines for New Code
82
+
83
+ 1. Put shared errors, URL handling, and environment helpers in `core/`.
84
+ 2. Put Research contracts, clients, and operator session surfaces in `sdk/research/`.
85
+ 3. Put front-door composition in `client.py`.
86
+ 4. Put terminal commands in `cli/`.
87
+ 5. Keep unreleased or archived infra APIs out of public README examples.
@@ -13,14 +13,11 @@ from importlib.metadata import PackageNotFoundError as _PackageNotFoundError
13
13
  from pathlib import Path as _Path
14
14
  from typing import Any as _Any
15
15
 
16
- try:
17
- from synth_ai.core.utils.log_filter import (
18
- install_log_filter as _install_log_filter,
19
- )
16
+ from synth_ai.core.utils.log_filter import (
17
+ install_log_filter as _install_log_filter,
18
+ )
20
19
 
21
- _install_log_filter()
22
- except Exception:
23
- pass
20
+ _install_log_filter()
24
21
 
25
22
  try:
26
23
  __version__ = _metadata.version("synth-ai")
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env python3
2
+ """Allow running synth_ai as a module: python -m synth_ai"""
3
+
4
+ from synth_ai.cli import cli
5
+
6
+ if __name__ == "__main__":
7
+ cli()
@@ -0,0 +1,16 @@
1
+ CLI structure notes (for coding agents)
2
+
3
+ - Keep `synth_ai/cli/` flat: one file per command, filename == command name.
4
+ - Each command file holds Click wiring (options/args/validation/routing).
5
+ - Business logic lives in `synth_ai/sdk/` (reusable) or `synth_ai/core/` (internal).
6
+ - CLI-only helpers may live in `synth_ai/cli/lib/` or `synth_ai/cli/utils/` only.
7
+ - No shims/wrappers: do not duplicate modules across folders or re-export commands.
8
+ - Avoid heavy module-level imports in CLI; import inside functions for lazy load.
9
+ - Use Click conventions; no surprising CLI behavior.
10
+
11
+ ## Incident Log Requirement
12
+
13
+ When you hit a Synth code bug or local dev setup issue, append a timestamped entry to `specifications/issues_log/YYYY-MM-DD.md` in the sibling `testing/` repo before finishing.
14
+
15
+ Use this one-line format:
16
+ `- [YYYY-MM-DD HH:MM:SS TZ] <repo/path> — <issue> — <impact> — <action/status>`
@@ -0,0 +1,35 @@
1
+ # CLI Modules
2
+
3
+ Thin Click adapters over `SynthClient` / `sdk.research`.
4
+
5
+ `synth-ai research` is the whole CLI. Infrastructure commands (`containers`,
6
+ `tunnels`, `pools`) and the operator consoles (`dev-envs`, the
7
+ `synth-ai-research-factory-standup` script) were removed in 0.18.0; see
8
+ `CHANGELOG.md` for what replaced each one.
9
+
10
+ ## Command Structure
11
+
12
+ ```
13
+ synth-ai research --help
14
+ synth-ai research projects ...
15
+ synth-ai research swarms ...
16
+ ```
17
+
18
+ ## Import Rules
19
+
20
+ ```python
21
+ # CLI importing from SDK (correct)
22
+ from synth_ai import SynthClient
23
+
24
+ # CLI importing from core (correct)
25
+ from synth_ai.core.utils.env import get_api_key
26
+
27
+ # SDK importing from CLI (wrong - never do this)
28
+ ```
29
+
30
+ ## Relationship to Other Modules
31
+
32
+ | Module | Relationship |
33
+ |--------|--------------|
34
+ | `core/` | `cli/` imports shared env/error helpers |
35
+ | `sdk/` / `client.py` | Business calls go through Research clients |
@@ -2,7 +2,6 @@
2
2
 
3
3
  import click
4
4
 
5
- from synth_ai.cli.dev_envs import dev_envs
6
5
  from synth_ai.cli.research import research
7
6
 
8
7
 
@@ -24,5 +23,4 @@ def cli(ctx):
24
23
  click.echo(ctx.get_help())
25
24
 
26
25
 
27
- cli.add_command(dev_envs)
28
26
  cli.add_command(research)
@@ -24,9 +24,8 @@ def _resolve_base_url(base_url: str | None) -> str:
24
24
  class SynthClient:
25
25
  """Sync client for Managed Research.
26
26
 
27
- Use ``research`` for hosted projects, swarms, and Factory lifecycles.
28
- Infrastructure clients (containers, tunnels, pools) are archived under
29
- ``old/sdk/`` and are not composed here.
27
+ Use ``research`` for hosted projects, swarms, and Factory lifecycles. That
28
+ is the whole client: there is no container, tunnel, or pool namespace.
30
29
  """
31
30
 
32
31
  def __init__(
@@ -34,11 +33,11 @@ class SynthClient:
34
33
  *,
35
34
  api_key: str | None = None,
36
35
  base_url: str | None = None,
37
- timeout: float = 30.0,
36
+ timeout_seconds: float = 30.0,
38
37
  ) -> None:
39
38
  self.api_key = _resolve_api_key(api_key)
40
39
  self.base_url = _resolve_base_url(base_url)
41
- self.timeout = timeout
40
+ self.timeout_seconds = timeout_seconds
42
41
  self._research_client: ResearchClient | None = None
43
42
 
44
43
  @property
@@ -50,7 +49,7 @@ class SynthClient:
50
49
  self._research_client = ResearchClient(
51
50
  api_key=self.api_key,
52
51
  base_url=self.base_url,
53
- timeout_seconds=self.timeout,
52
+ timeout_seconds=self.timeout_seconds,
54
53
  )
55
54
  return self._research_client
56
55
 
@@ -58,6 +57,7 @@ class SynthClient:
58
57
  """Close all lazily opened SDK transports."""
59
58
  if self._research_client is not None:
60
59
  self._research_client.close()
60
+ self._research_client = None
61
61
 
62
62
  def __enter__(self) -> SynthClient:
63
63
  return self
@@ -74,11 +74,11 @@ class AsyncSynthClient:
74
74
  *,
75
75
  api_key: str | None = None,
76
76
  base_url: str | None = None,
77
- timeout: float = 30.0,
77
+ timeout_seconds: float = 30.0,
78
78
  ) -> None:
79
79
  self.api_key = _resolve_api_key(api_key)
80
80
  self.base_url = _resolve_base_url(base_url)
81
- self.timeout = timeout
81
+ self.timeout_seconds = timeout_seconds
82
82
  self._async_research_client: AsyncResearchClient | None = None
83
83
 
84
84
  @property
@@ -90,7 +90,7 @@ class AsyncSynthClient:
90
90
  self._async_research_client = AsyncResearchClient(
91
91
  api_key=self.api_key,
92
92
  base_url=self.base_url,
93
- timeout_seconds=self.timeout,
93
+ timeout_seconds=self.timeout_seconds,
94
94
  )
95
95
  return self._async_research_client
96
96
 
@@ -108,6 +108,7 @@ class AsyncSynthClient:
108
108
  """Close all asynchronous Research transports."""
109
109
  if self._async_research_client is not None:
110
110
  await self._async_research_client.close()
111
+ self._async_research_client = None
111
112
 
112
113
  async def __aenter__(self) -> AsyncSynthClient:
113
114
  return self
@@ -0,0 +1,68 @@
1
+ # Core Modules
2
+
3
+ Shared runtime plumbing for the Synth AI SDK — and nothing else.
4
+
5
+ `core/` is the bottom of the layering DAG (see `../README.md` and
6
+ `unify_sdk_layering.md`). It may import only from `core/`. In particular it must
7
+ not import `sdk/`: plumbing cannot depend on the clients built on top of it.
8
+ `check_sdk_layering.py` in the sibling `testing` repo enforces this.
9
+
10
+ ## Structure
11
+
12
+ ```
13
+ core/
14
+ ├── __init__.py # Internal exports
15
+ ├── auth/ # Credentials and auth context
16
+ ├── http/ # Transport, request, retry
17
+ ├── errors.py # Error types and handling
18
+ ├── contracts/ # Generic JSON/error contracts only
19
+ ├── utils/ # General utilities
20
+ └── research/ # DEPRECATED alias -> synth_ai.sdk.research
21
+ ```
22
+
23
+ `core/research/` is no longer an implementation tree. Research moved to
24
+ `sdk/research/` so that `core/` means one thing; what remains is an import alias
25
+ that forwards and warns, scheduled for deletion once sibling repos are clean.
26
+ Do not add modules there.
27
+
28
+ ## Guidelines for Additions
29
+
30
+ ### DO add to `core/` if:
31
+
32
+ 1. **It's shared infrastructure** - Used by multiple live modules
33
+ 2. **It's internal implementation** - Not meant for direct user consumption
34
+ 3. **It's runtime plumbing** - Errors, URL resolution, env helpers
35
+ 4. **It's a utility** - Helpers used by the narrowed live SDK
36
+
37
+ ### DO NOT add to `core/` if:
38
+
39
+ 1. **It's a user-facing API** - Put it in `sdk/`
40
+ 2. **It's CLI-specific** - Put it in `cli/`
41
+ 3. **It's a public client** - Put it in `sdk/` or `client.py`
42
+ 4. **It's outside the public SDK runtime** - keep it out of `core/` unless it is required by supported live flows
43
+
44
+ ## Module Descriptions
45
+
46
+ ### `errors.py`
47
+ Custom exception types and error handling utilities.
48
+
49
+ ### `utils/`
50
+ General-purpose utilities for environment lookup, URLs, JSON helpers, and secure file handling.
51
+
52
+ ## Import Rules
53
+
54
+ - `core/` should NOT import from `sdk/` or `cli/`
55
+ - Internal modules should not be imported directly by users unless explicitly documented
56
+
57
+ ```python
58
+ # Supported internal usage
59
+ from synth_ai.core.errors import SynthError
60
+ from synth_ai.core.utils.env import get_api_key
61
+ ```
62
+
63
+ ## Relationship to Other Modules
64
+
65
+ | Module | Relationship |
66
+ |--------|--------------|
67
+ | `sdk/` | `sdk/` imports from `core/` for runtime helpers |
68
+ | `cli/` | `cli/` imports from `core/` for shared errors and env utilities |
@@ -0,0 +1,7 @@
1
+ """Shared plumbing: errors, HTTP, auth, and typed contracts.
2
+
3
+ ``core/`` is what every public client is built on and is not itself a public
4
+ client -- Research lives in ``synth_ai/sdk/research``. Import from the owning
5
+ submodule (``synth_ai.core.errors``, ``synth_ai.core.http.retry``, ...); this
6
+ package re-exports nothing.
7
+ """
@@ -0,0 +1,4 @@
1
+ """Credential contracts for Synth clients.
2
+
3
+ Import from the owning submodule; this package re-exports nothing.
4
+ """
@@ -0,0 +1,4 @@
1
+ """General typed contracts shared by Synth product clients.
2
+
3
+ Import from the owning submodule; this package re-exports nothing.
4
+ """
@@ -2,26 +2,15 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from dataclasses import dataclass
6
- from typing import Generic, Mapping, TypeVar
5
+ from typing import Mapping
7
6
 
8
7
  from synth_ai.core.contracts.json_value import JsonValue
9
8
 
10
- ItemT = TypeVar("ItemT")
11
-
12
9
 
13
10
  class PageCursor(str):
14
11
  """Opaque cursor returned by the backend."""
15
12
 
16
13
 
17
- @dataclass(frozen=True, slots=True)
18
- class Page(Generic[ItemT]):
19
- """One immutable page of typed resources."""
20
-
21
- items: tuple[ItemT, ...]
22
- next_cursor: PageCursor | None = None
23
-
24
-
25
14
  def build_query_params(**values: JsonValue) -> dict[str, JsonValue]:
26
15
  """Drop only absent or blank-string query values."""
27
16
 
@@ -43,4 +32,4 @@ def extract_next_cursor(payload: Mapping[str, object]) -> PageCursor | None:
43
32
  return PageCursor(value.strip())
44
33
 
45
34
 
46
- __all__ = ["Page", "PageCursor", "build_query_params", "extract_next_cursor"]
35
+ __all__ = ["PageCursor", "build_query_params", "extract_next_cursor"]