synth-ai 0.16.1.dev0__tar.gz → 0.16.1.dev1__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.16.1.dev0/synth_ai.egg-info → synth_ai-0.16.1.dev1}/PKG-INFO +79 -77
  2. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/README.md +78 -76
  3. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/pyproject.toml +6 -10
  4. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/__init__.py +26 -24
  5. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/cli/dev_envs.py +2 -2
  6. synth_ai-0.16.1.dev1/synth_ai/cli/research.py +364 -0
  7. synth_ai-0.16.1.dev1/synth_ai/cli/research_environments.py +143 -0
  8. synth_ai-0.16.1.dev0/synth_ai/managed_research/factory_standup.py → synth_ai-0.16.1.dev1/synth_ai/cli/research_factory_standup.py +7 -7
  9. synth_ai-0.16.1.dev1/synth_ai/cli/research_image_releases.py +149 -0
  10. synth_ai-0.16.1.dev1/synth_ai/cli/research_projects.py +405 -0
  11. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/client.py +52 -22
  12. synth_ai-0.16.1.dev1/synth_ai/config.py +8 -0
  13. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/__init__.py +22 -0
  14. synth_ai-0.16.1.dev1/synth_ai/core/auth/__init__.py +6 -0
  15. synth_ai-0.16.1.dev1/synth_ai/core/auth/context.py +23 -0
  16. synth_ai-0.16.1.dev1/synth_ai/core/auth/credentials.py +42 -0
  17. synth_ai-0.16.1.dev1/synth_ai/core/contracts/__init__.py +17 -0
  18. synth_ai-0.16.1.dev1/synth_ai/core/contracts/json_value.py +13 -0
  19. synth_ai-0.16.1.dev1/synth_ai/core/contracts/pagination.py +46 -0
  20. synth_ai-0.16.1.dev1/synth_ai/core/contracts/resources.py +26 -0
  21. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/errors.py +160 -12
  22. synth_ai-0.16.1.dev1/synth_ai/core/http/__init__.py +19 -0
  23. synth_ai-0.16.1.dev1/synth_ai/core/http/async_transport.py +177 -0
  24. synth_ai-0.16.1.dev1/synth_ai/core/http/request.py +46 -0
  25. synth_ai-0.16.1.dev1/synth_ai/core/http/response.py +20 -0
  26. synth_ai-0.16.1.dev1/synth_ai/core/http/retry.py +117 -0
  27. synth_ai-0.16.1.dev1/synth_ai/core/http/streaming.py +93 -0
  28. synth_ai-0.16.1.dev1/synth_ai/core/http/transport.py +414 -0
  29. synth_ai-0.16.1.dev1/synth_ai/core/research/__init__.py +16 -0
  30. synth_ai-0.16.1.dev1/synth_ai/core/research/_internal/__init__.py +12 -0
  31. synth_ai-0.16.1.dev1/synth_ai/core/research/advanced.py +107 -0
  32. synth_ai-0.16.1.dev0/synth_ai/research/factories.py → synth_ai-0.16.1.dev1/synth_ai/core/research/advanced_factories.py +11 -11
  33. synth_ai-0.16.1.dev0/synth_ai/research/runs.py → synth_ai-0.16.1.dev1/synth_ai/core/research/advanced_swarms.py +76 -40
  34. synth_ai-0.16.1.dev0/synth_ai/research/hosted_artifacts.py → synth_ai-0.16.1.dev1/synth_ai/core/research/artifacts.py +1 -3
  35. synth_ai-0.16.1.dev1/synth_ai/core/research/auth.py +12 -0
  36. synth_ai-0.16.1.dev1/synth_ai/core/research/client.py +156 -0
  37. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/__init__.py +581 -0
  38. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/_activity_wire.py +63 -0
  39. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/_environment_wire.py +136 -0
  40. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/_transcript_wire.py +147 -0
  41. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/_wire.py +78 -0
  42. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/activity.py +369 -0
  43. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/activity_items.py +406 -0
  44. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/billing.py +1 -1
  45. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/canonical_usage.py +1 -1
  46. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/cloud_deployment_claims.py +1 -1
  47. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/common.py +149 -0
  48. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/dev_environment_evidence.py +2 -2
  49. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/economics.py +36 -0
  50. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/environment_manifest.py +510 -0
  51. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/environments.py +312 -0
  52. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/evidence.py +378 -0
  53. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/factories.py +774 -0
  54. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/factory_evidence.py +9 -9
  55. synth_ai-0.16.1.dev0/synth_ai/managed_research/models/factories.py → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/factory_operations.py +89 -4
  56. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/image_releases.py +1223 -0
  57. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/project.py +1 -1
  58. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/project_data.py +492 -0
  59. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/projects.py +194 -0
  60. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/promotions.py +1 -1
  61. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_control.py +2 -2
  62. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_events.py +1 -1
  63. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_launch.py +27 -19
  64. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_observability.py +1 -1
  65. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_state.py +5 -5
  66. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_timeline.py +4 -62
  67. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/runtime_intent.py +1 -1
  68. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/runtime_stream.py +146 -0
  69. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/runtime_stream_snapshot.py +368 -0
  70. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_actor_models.py +8 -5
  71. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_actor_policy_data.py +1 -1
  72. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_agent_harnesses.py +3 -3
  73. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/smr_branching.py +82 -0
  74. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_inference_providers.py +4 -0
  75. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_providers.py +29 -0
  76. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_roles.py +4 -4
  77. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_run_policy.py +4 -4
  78. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_runbooks.py +2 -2
  79. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/smr_runnable_project.py +239 -0
  80. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/status.py +516 -0
  81. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/swarms.py +1393 -0
  82. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/transcript.py +458 -0
  83. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/types.py +7 -238
  84. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/usage.py +420 -0
  85. synth_ai-0.16.1.dev0/synth_ai/managed_research/models/__init__.py → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/wire_models.py +78 -69
  86. synth_ai-0.16.1.dev1/synth_ai/core/research/contracts/workspaces.py +950 -0
  87. synth_ai-0.16.1.dev1/synth_ai/core/research/economics.py +167 -0
  88. {synth_ai-0.16.1.dev0/synth_ai → synth_ai-0.16.1.dev1/synth_ai/core}/research/efforts.py +12 -10
  89. {synth_ai-0.16.1.dev0/synth_ai → synth_ai-0.16.1.dev1/synth_ai/core}/research/enums.py +2 -2
  90. synth_ai-0.16.1.dev1/synth_ai/core/research/environments.py +240 -0
  91. {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/errors.py +80 -18
  92. synth_ai-0.16.1.dev1/synth_ai/core/research/events.py +35 -0
  93. synth_ai-0.16.1.dev1/synth_ai/core/research/facade.py +155 -0
  94. synth_ai-0.16.1.dev1/synth_ai/core/research/factories.py +907 -0
  95. synth_ai-0.16.1.dev1/synth_ai/core/research/image_releases.py +220 -0
  96. {synth_ai-0.16.1.dev0/synth_ai → synth_ai-0.16.1.dev1/synth_ai/core}/research/models.py +37 -45
  97. synth_ai-0.16.1.dev1/synth_ai/core/research/operations.py +360 -0
  98. synth_ai-0.16.1.dev1/synth_ai/core/research/project_data.py +307 -0
  99. {synth_ai-0.16.1.dev0/synth_ai → synth_ai-0.16.1.dev1/synth_ai/core}/research/project_namespaces.py +25 -30
  100. synth_ai-0.16.1.dev1/synth_ai/core/research/project_workspaces.py +342 -0
  101. synth_ai-0.16.1.dev1/synth_ai/core/research/projects.py +383 -0
  102. synth_ai-0.16.1.dev1/synth_ai/core/research/public.py +595 -0
  103. synth_ai-0.16.1.dev0/synth_ai/research/run_readouts.py → synth_ai-0.16.1.dev1/synth_ai/core/research/readouts.py +13 -20
  104. {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/schema_sync.py +32 -6
  105. {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/schemas/smr_openapi.yaml +3952 -297
  106. {synth_ai-0.16.1.dev0/synth_ai → synth_ai-0.16.1.dev1/synth_ai/core}/research/secrets.py +1 -3
  107. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/__init__.py +104 -94
  108. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/_base.py +2 -2
  109. synth_ai-0.16.1.dev1/synth_ai/core/research/session/_client_helpers.py +191 -0
  110. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/_run_authority_mixin.py +18 -14
  111. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/approvals.py +1 -1
  112. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/billing.py +3 -3
  113. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/client.py +153 -204
  114. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/cloud_deployments.py +6 -6
  115. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/compat.py +6 -6
  116. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/config.py +4 -8
  117. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/cost.py +1 -1
  118. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/credentials.py +2 -2
  119. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/datasets.py +1 -1
  120. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/dev_environments.py +4 -4
  121. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/environments.py +2 -2
  122. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/exports.py +1 -1
  123. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/factories.py +11 -9
  124. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/factory_evidence.py +2 -2
  125. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/files.py +2 -2
  126. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/github.py +1 -1
  127. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/image_releases.py +125 -63
  128. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/images.py +385 -23
  129. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/integrations.py +2 -2
  130. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/launch.py +14 -11
  131. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/logs.py +1 -1
  132. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/models.py +1 -1
  133. synth_ai-0.16.1.dev1/synth_ai/core/research/session/namespaces/__init__.py +53 -0
  134. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/outputs.py +2 -2
  135. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/progress.py +2 -2
  136. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/project.py +7 -7
  137. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/projects.py +9 -6
  138. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/promotions.py +2 -2
  139. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/prs.py +1 -1
  140. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/readiness.py +1 -1
  141. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/repos.py +3 -3
  142. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/repositories.py +2 -2
  143. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/runs.py +60 -24
  144. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/secrets.py +2 -2
  145. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/setup.py +2 -2
  146. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/tag.py +2 -2
  147. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/trained_models.py +2 -2
  148. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/transport.py +2 -2
  149. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/usage.py +3 -3
  150. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/work_products.py +3 -3
  151. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/workspace_inputs.py +2 -2
  152. synth_ai-0.16.1.dev1/synth_ai/core/research/swarms.py +1112 -0
  153. synth_ai-0.16.1.dev1/synth_ai/core/research/transport/__init__.py +21 -0
  154. {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/transport/http.py +59 -101
  155. synth_ai-0.16.1.dev1/synth_ai/core/research/transport/pagination.py +7 -0
  156. synth_ai-0.16.1.dev1/synth_ai/core/research/transport/streaming.py +36 -0
  157. {synth_ai-0.16.1.dev0/synth_ai → synth_ai-0.16.1.dev1/synth_ai/core}/research/visuals.py +1 -3
  158. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/workspace.py +1 -1
  159. synth_ai-0.16.1.dev1/synth_ai/mcp/research/__init__.py +5 -0
  160. synth_ai-0.16.1.dev1/synth_ai/mcp/research/__main__.py +6 -0
  161. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/registry.py +26 -19
  162. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/request_models.py +32 -40
  163. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/server.py +220 -250
  164. synth_ai-0.16.1.dev1/synth_ai/mcp/research/tools/__init__.py +43 -0
  165. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/approvals.py +1 -1
  166. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/artifacts.py +1 -1
  167. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/cloud_deployments.py +1 -1
  168. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/datasets.py +1 -1
  169. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/dev_environments.py +1 -1
  170. synth_ai-0.16.1.dev1/synth_ai/mcp/research/tools/environments.py +205 -0
  171. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/exports.py +1 -1
  172. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/factories.py +7 -7
  173. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/factory_results.py +1 -1
  174. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/files.py +2 -2
  175. synth_ai-0.16.1.dev1/synth_ai/mcp/research/tools/image_releases.py +131 -0
  176. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/integrations.py +1 -1
  177. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/logs.py +1 -1
  178. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/models.py +1 -1
  179. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/outputs.py +1 -1
  180. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/progress.py +30 -10
  181. synth_ai-0.16.1.dev1/synth_ai/mcp/research/tools/project_data.py +256 -0
  182. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/projects.py +9 -363
  183. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/prs.py +1 -1
  184. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/readiness.py +1 -1
  185. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/repos.py +1 -1
  186. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/resources.py +1 -1
  187. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/runs.py +149 -52
  188. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/smr_policy_schemas.py +6 -4
  189. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/tag.py +2 -2
  190. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/trained_models.py +1 -1
  191. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/tools/usage.py +1 -1
  192. synth_ai-0.16.1.dev1/synth_ai/mcp/research/tools/workspace_inputs.py +199 -0
  193. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/base.py +53 -43
  194. synth_ai-0.16.1.dev1/synth_ai/sdk/containers.py +307 -0
  195. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/pools.py +135 -9
  196. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1/synth_ai.egg-info}/PKG-INFO +79 -77
  197. synth_ai-0.16.1.dev1/synth_ai.egg-info/SOURCES.txt +266 -0
  198. synth_ai-0.16.1.dev1/synth_ai.egg-info/entry_points.txt +4 -0
  199. synth_ai-0.16.1.dev0/synth_ai/cli/research.py +0 -125
  200. synth_ai-0.16.1.dev0/synth_ai/gamebench/__init__.py +0 -30
  201. synth_ai-0.16.1.dev0/synth_ai/gamebench/client.py +0 -206
  202. synth_ai-0.16.1.dev0/synth_ai/gamebench/models.py +0 -512
  203. synth_ai-0.16.1.dev0/synth_ai/managed_research/__init__.py +0 -959
  204. synth_ai-0.16.1.dev0/synth_ai/managed_research/_internal/__init__.py +0 -12
  205. synth_ai-0.16.1.dev0/synth_ai/managed_research/auth.py +0 -12
  206. synth_ai-0.16.1.dev0/synth_ai/managed_research/client.py +0 -5
  207. synth_ai-0.16.1.dev0/synth_ai/managed_research/factory_plans/rsi_synth_on_synth.plan.json +0 -537
  208. synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp/__init__.py +0 -5
  209. synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp/__main__.py +0 -6
  210. synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp/tools/__init__.py +0 -37
  211. synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp/tools/open_research.py +0 -360
  212. synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp/tools/workspace_inputs.py +0 -71
  213. synth_ai-0.16.1.dev0/synth_ai/managed_research/models/generated/__init__.py +0 -3
  214. synth_ai-0.16.1.dev0/synth_ai/managed_research/models/generated/v1/__init__.py +0 -21
  215. synth_ai-0.16.1.dev0/synth_ai/managed_research/open_research/__init__.py +0 -49
  216. synth_ai-0.16.1.dev0/synth_ai/managed_research/open_research/client.py +0 -340
  217. synth_ai-0.16.1.dev0/synth_ai/managed_research/open_research/errors.py +0 -132
  218. synth_ai-0.16.1.dev0/synth_ai/managed_research/open_research/fingerprint.py +0 -60
  219. synth_ai-0.16.1.dev0/synth_ai/managed_research/open_research/models.py +0 -323
  220. synth_ai-0.16.1.dev0/synth_ai/managed_research/schemas/public_models.json +0 -370
  221. synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk/_client_helpers.py +0 -69
  222. synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk/namespaces/__init__.py +0 -53
  223. synth_ai-0.16.1.dev0/synth_ai/managed_research/transport/__init__.py +0 -18
  224. synth_ai-0.16.1.dev0/synth_ai/managed_research/transport/pagination.py +0 -30
  225. synth_ai-0.16.1.dev0/synth_ai/managed_research/transport/streaming.py +0 -99
  226. synth_ai-0.16.1.dev0/synth_ai/research/__init__.py +0 -103
  227. synth_ai-0.16.1.dev0/synth_ai/research/async_client.py +0 -80
  228. synth_ai-0.16.1.dev0/synth_ai/research/client.py +0 -184
  229. synth_ai-0.16.1.dev0/synth_ai/research/control.py +0 -33
  230. synth_ai-0.16.1.dev0/synth_ai/research/economics.py +0 -50
  231. synth_ai-0.16.1.dev0/synth_ai/research/errors.py +0 -54
  232. synth_ai-0.16.1.dev0/synth_ai/research/limits.py +0 -43
  233. synth_ai-0.16.1.dev0/synth_ai/research/projects.py +0 -206
  234. synth_ai-0.16.1.dev0/synth_ai/sdk/containers.py +0 -182
  235. synth_ai-0.16.1.dev0/synth_ai.egg-info/SOURCES.txt +0 -228
  236. synth_ai-0.16.1.dev0/synth_ai.egg-info/entry_points.txt +0 -5
  237. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/LICENSE +0 -0
  238. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/MANIFEST.in +0 -0
  239. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/setup.cfg +0 -0
  240. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/__main__.py +0 -0
  241. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/cli/__init__.py +0 -0
  242. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/cli/__main__.py +0 -0
  243. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/cli/containers.py +0 -0
  244. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/cli/main.py +0 -0
  245. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/cli/pools.py +0 -0
  246. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/cli/tunnels.py +0 -0
  247. {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/_internal/crypto.py +0 -0
  248. {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/_internal/env.py +0 -0
  249. {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/_internal/urls.py +0 -0
  250. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/actor_images.py +0 -0
  251. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/checkpoints.py +0 -0
  252. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/cloud_deployments.py +0 -0
  253. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/local_execution_profile.py +0 -0
  254. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/open_research_visual.py +0 -0
  255. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/operator_evidence.py +0 -0
  256. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/project_workspace.py +0 -0
  257. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_authority.py +0 -0
  258. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_diagnostics.py +0 -0
  259. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/run_execution.py +0 -0
  260. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/runtime_image.py +0 -0
  261. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/scientific_integrity.py +0 -0
  262. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_agent_kinds.py +0 -0
  263. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_agent_models.py +0 -0
  264. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_credential_providers.py +0 -0
  265. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_environment_kinds.py +0 -0
  266. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_evidence_obligations.py +0 -0
  267. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_funding_sources.py +0 -0
  268. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_horizons.py +0 -0
  269. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_host_kinds.py +0 -0
  270. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_network_topology.py +0 -0
  271. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_resource_kinds.py +0 -0
  272. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_resource_providers.py +0 -0
  273. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_runtime_kinds.py +0 -0
  274. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_tool_providers.py +0 -0
  275. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/smr_work_modes.py +0 -0
  276. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/tag.py +0 -0
  277. {synth_ai-0.16.1.dev0/synth_ai/managed_research/models → synth_ai-0.16.1.dev1/synth_ai/core/research/contracts}/work_products.py +0 -0
  278. {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/factory_plans/__init__.py +0 -0
  279. {synth_ai-0.16.1.dev0/synth_ai/managed_research/sdk → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/artifacts.py +0 -0
  280. {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research/session}/py.typed +0 -0
  281. {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/transport/retries.py +0 -0
  282. {synth_ai-0.16.1.dev0/synth_ai/managed_research → synth_ai-0.16.1.dev1/synth_ai/core/research}/version.py +0 -0
  283. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/__init__.py +0 -0
  284. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/dict.py +0 -0
  285. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/env.py +0 -0
  286. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/json.py +0 -0
  287. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/log_filter.py +0 -0
  288. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/paths.py +0 -0
  289. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/secure_files.py +0 -0
  290. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/core/utils/urls.py +0 -0
  291. {synth_ai-0.16.1.dev0/synth_ai/managed_research/mcp → synth_ai-0.16.1.dev1/synth_ai/mcp/research}/objective_tools.py +0 -0
  292. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/py.typed +0 -0
  293. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/__init__.py +0 -0
  294. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/container/__init__.py +0 -0
  295. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/container/auth.py +0 -0
  296. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/horizons_private.py +0 -0
  297. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/managed_agents/__init__.py +0 -0
  298. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/managed_agents/client.py +0 -0
  299. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/managed_agents_anthropic.py +0 -0
  300. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/openai_agents_sdk.py +0 -0
  301. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/openai_tools.py +0 -0
  302. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/pagination.py +0 -0
  303. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai/sdk/tunnels.py +0 -0
  304. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai.egg-info/dependency_links.txt +0 -0
  305. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai.egg-info/requires.txt +0 -0
  306. {synth_ai-0.16.1.dev0 → synth_ai-0.16.1.dev1}/synth_ai.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synth-ai
3
- Version: 0.16.1.dev0
3
+ Version: 0.16.1.dev1
4
4
  Summary: Python-only SDK for Synth containers, tunnels, pools, and Research
5
5
  Author-email: Synth AI <josh@usesynth.ai>
6
6
  License-Expression: MIT
@@ -86,93 +86,97 @@ The CLI also reads `SYNTH_BACKEND_URL` and accepts `--backend-url`.
86
86
 
87
87
  ```python
88
88
  from synth_ai import SynthClient
89
+ from synth_ai.core.research.public import SwarmSpec
89
90
 
90
- client = SynthClient()
91
-
92
- print(client.research.limits.get_typed().plan)
91
+ with SynthClient() as client:
92
+ swarm = client.research.swarms.create(
93
+ SwarmSpec(objective="Assess this repository and produce a concise report.")
94
+ )
95
+ for event in swarm.events():
96
+ print(event.kind, event.telemetry.sequence)
97
+ result = swarm.wait(timeout_seconds=900)
98
+ print(result.swarm_id, result.state)
99
+ resolved = swarm.configuration()
100
+ print(resolved.config_version_id, resolved.snapshot_sha256)
101
+ usage = swarm.usage()
102
+ print(usage.money.nominal_pico_usd, usage.tokens.totals.input_tokens)
103
+ evidence = swarm.evidence()
104
+ print(evidence.artifacts, evidence.work_products)
93
105
  ```
94
106
 
95
- ## Managed Research (hero SDK)
107
+ `create` returns a durable handle immediately. `events()` yields typed events,
108
+ including an explicit `UnknownSwarmEvent` for forward-compatible server events;
109
+ `wait()` uses a monotonic deadline and returns the terminal typed `Swarm`.
110
+ `configuration()` returns the immutable, versioned, secret-redacted launch
111
+ snapshot bound to that swarm, so replay and audit do not depend on the
112
+ project's current mutable configuration.
113
+ `usage()` returns one typed cost, token, and actor-attribution projection plus
114
+ its source, record count, observation time, and terminal-state freshness. It
115
+ does not expose the legacy raw ledger-entry dictionaries.
116
+ `evidence()` returns the complete durable artifact and WorkProduct index with
117
+ strict counts and lifecycle freshness. Artifact and WorkProduct content reads
118
+ use the same typed transport and return bytes; they do not expose storage
119
+ authority.
96
120
 
97
- Install the research extra when you need hosted runs, projects, Factory Tag, or MCP:
121
+ ## Research SDK
98
122
 
99
- ```bash
100
- uv add "synth-ai[research]"
101
- ```
123
+ The only customer entrypoint is `SynthClient().research`. Its stable namespaces
124
+ are `projects`, `swarms`, and `factories`.
102
125
 
103
- Hero entrypoint **`SynthClient().research`** only (no standalone control client in new code):
126
+ Create a durable project when work needs reusable configuration:
104
127
 
105
128
  ```python
106
- import os
107
-
108
129
  from synth_ai import SynthClient
109
- from synth_ai.research import ResearchTagSessionCreateRequest, ResearchWorkMode
110
-
111
- client = SynthClient()
112
- research = client.research
113
- factory_id = os.environ["SYNTH_FACTORY_ID"]
114
- effort_id = os.environ["SYNTH_FACTORY_EFFORT_ID"]
115
- project_id = os.environ["SYNTH_RESEARCH_PROJECT_ID"] # An existing, prepared project.
116
-
117
- # Org limits
118
- limits = research.limits.get_typed()
119
- print(limits.plan)
120
-
121
- # Authoritative economics reads; the client does not recompute allowances or discounts.
122
- plan = research.economics.plan()
123
- catalog = research.economics.catalog()
124
- entitlements = research.economics.entitlements()
125
-
126
- # Async Research Factory: inspect the experiment floor before launching work
127
- factory = research.factories.get(factory_id)
128
- floor = research.factories.status(factory.factory_id)
129
- preview = research.factories.preview_wake(factory.factory_id)
130
- # After reviewing preview.efforts, the SDK replays the resolved request_contract
131
- # with its opaque preview_token; callers do not reconstruct the write request.
132
- if preview.confirmation_required:
133
- receipt = research.factories.wake_due(
134
- factory.factory_id,
135
- preview=preview,
130
+ from synth_ai.core.research.public import EnvironmentKind, ProjectSpec, RuntimeKind, SwarmSpec
131
+
132
+ with SynthClient() as client:
133
+ project = client.research.projects.create(
134
+ ProjectSpec(
135
+ name="Repository assessment",
136
+ pool_id="pool_default",
137
+ runtime_kind=RuntimeKind("python"),
138
+ environment_kind=EnvironmentKind("docker"),
139
+ orchestrator_profile_id="profile_orchestrator",
140
+ default_worker_profile_id="profile_worker",
141
+ )
142
+ )
143
+ swarm = client.research.swarms.create(
144
+ SwarmSpec(objective="Produce the assessment."),
145
+ project_id=project.project_id,
136
146
  )
147
+ print(swarm.wait().state)
148
+ ```
137
149
 
138
- # Factory Tag loop
139
- session = research.factories.tag.sessions.create(
140
- ResearchTagSessionCreateRequest(
141
- request="Improve rollout throughput",
142
- factory_id=factory_id,
143
- effort_id=effort_id,
150
+ Factories provide a typed durable optimization loop with native sync/async
151
+ parity:
152
+
153
+ ```python
154
+ from synth_ai import SynthClient
155
+ from synth_ai.core.research.public import EffortSpec, FactorySpec, ProjectId
156
+
157
+ with SynthClient() as client:
158
+ factory = client.research.factories.create(
159
+ FactorySpec(name="Prompt optimizer")
160
+ )
161
+ effort = client.research.factories.efforts.create(
162
+ EffortSpec(
163
+ factory_id=factory.factory_id,
164
+ project_id=ProjectId("project_existing"),
165
+ name="Improve the system prompt",
166
+ )
144
167
  )
145
- )
146
- research.factories.tag.sessions.messages.send(session.session_id, "Status update")
147
- scope = research.factories.tag.scopes.get_default()
148
-
149
- # Launch against the explicitly selected pre-existing project.
150
- work_mode = ResearchWorkMode.DIRECTED_EFFORT
151
- preflight = research.runs.check_preflight(project_id, work_mode=work_mode)
152
- session = research.runs.create(
153
- project_id,
154
- objective="Produce a bounded repository assessment and a readable report.",
155
- work_mode=work_mode,
156
- )
157
-
158
- # Run readouts (nested namespaces — never ``manderqueue`` on hero)
159
- session.snapshots.get(detail="control")
160
- progress = session.progress.get_typed()
161
- usage = session.usage.get()
162
- work_products = session.work_products.list()
163
- artifacts = session.artifacts.list()
164
- if work_products:
165
- report = session.work_products.content.get(work_products[0].work_product_id)
166
- session.message_queue.messages.list()
167
- research.projects.objectives.list(project_id, run_id=session.run_id)
168
+ print(effort.effort_id, effort.state)
168
169
  ```
169
170
 
170
- CLI smoke:
171
+ Limits, economics, secrets, Tag, rich evidence projections, and administrative
172
+ resource APIs remain available under `client.research.advanced` while their
173
+ contracts are stabilized. Advanced APIs are not covered by the stable surface
174
+ guarantee.
175
+
176
+ CLI discovery:
171
177
 
172
178
  ```bash
173
- synth-ai research limits get
174
- synth-ai research tag smoke
175
- synth-ai research smoke
179
+ synth-ai research --help
176
180
  ```
177
181
 
178
182
  ## CLI
@@ -190,7 +194,7 @@ Use `SynthClient` as the front door:
190
194
 
191
195
  | Surface | Client namespace | Use it for |
192
196
  | --- | --- | --- |
193
- | **Managed Research / Factory** | `client.research` | Hosted research runs, projects, Factory Tag, limits, MCP (`synth-ai[research]`). |
197
+ | **Research / Factory** | `client.research` | Typed hosted projects, swarms, Factory lifecycles, and Efforts. |
194
198
  | Containers | `client.containers` | Hosted container records and lifecycle operations. |
195
199
  | Tunnels | `client.tunnels` | Managed tunnel records, leases, health, and rotation. |
196
200
  | Pools | `client.pools` | Container pools, tasks, rollouts, artifacts, usage, and events. |
@@ -212,10 +216,8 @@ override grants are manual audit events rather than automatic resets.
212
216
  The canonical backend surfaces are `GET /smr/billing/catalog`,
213
217
  `GET /smr/billing/plan`, `GET /smr/billing/runs/{run_id}/drawdown`, and
214
218
  `GET /smr/billing/factory-efforts/{factory_effort_id}/drawdown`. In the Python
215
- SDK, use `client.research.economics.entitlements()` for the organization snapshot
216
- and `client.research.economics.plan()`, `.catalog()`, `.run_drawdown(run_id)`, or
217
- `.factory_effort_drawdown(factory_effort_id)` for canonical billing reads. Use
218
- `.project(project_id)` for project usage, budgets, and entitlements. Do not infer
219
+ SDK, use `client.research.advanced.economics` for authoritative billing reads
220
+ while the economics contract remains advanced. Do not infer
219
221
  allowance from legacy Autumn balances or local spend summaries, and do not
220
222
  recompute discounts in the client.
221
223
 
@@ -50,93 +50,97 @@ The CLI also reads `SYNTH_BACKEND_URL` and accepts `--backend-url`.
50
50
 
51
51
  ```python
52
52
  from synth_ai import SynthClient
53
+ from synth_ai.core.research.public import SwarmSpec
53
54
 
54
- client = SynthClient()
55
-
56
- print(client.research.limits.get_typed().plan)
55
+ with SynthClient() as client:
56
+ swarm = client.research.swarms.create(
57
+ SwarmSpec(objective="Assess this repository and produce a concise report.")
58
+ )
59
+ for event in swarm.events():
60
+ print(event.kind, event.telemetry.sequence)
61
+ result = swarm.wait(timeout_seconds=900)
62
+ print(result.swarm_id, result.state)
63
+ resolved = swarm.configuration()
64
+ print(resolved.config_version_id, resolved.snapshot_sha256)
65
+ usage = swarm.usage()
66
+ print(usage.money.nominal_pico_usd, usage.tokens.totals.input_tokens)
67
+ evidence = swarm.evidence()
68
+ print(evidence.artifacts, evidence.work_products)
57
69
  ```
58
70
 
59
- ## Managed Research (hero SDK)
71
+ `create` returns a durable handle immediately. `events()` yields typed events,
72
+ including an explicit `UnknownSwarmEvent` for forward-compatible server events;
73
+ `wait()` uses a monotonic deadline and returns the terminal typed `Swarm`.
74
+ `configuration()` returns the immutable, versioned, secret-redacted launch
75
+ snapshot bound to that swarm, so replay and audit do not depend on the
76
+ project's current mutable configuration.
77
+ `usage()` returns one typed cost, token, and actor-attribution projection plus
78
+ its source, record count, observation time, and terminal-state freshness. It
79
+ does not expose the legacy raw ledger-entry dictionaries.
80
+ `evidence()` returns the complete durable artifact and WorkProduct index with
81
+ strict counts and lifecycle freshness. Artifact and WorkProduct content reads
82
+ use the same typed transport and return bytes; they do not expose storage
83
+ authority.
60
84
 
61
- Install the research extra when you need hosted runs, projects, Factory Tag, or MCP:
85
+ ## Research SDK
62
86
 
63
- ```bash
64
- uv add "synth-ai[research]"
65
- ```
87
+ The only customer entrypoint is `SynthClient().research`. Its stable namespaces
88
+ are `projects`, `swarms`, and `factories`.
66
89
 
67
- Hero entrypoint **`SynthClient().research`** only (no standalone control client in new code):
90
+ Create a durable project when work needs reusable configuration:
68
91
 
69
92
  ```python
70
- import os
71
-
72
93
  from synth_ai import SynthClient
73
- from synth_ai.research import ResearchTagSessionCreateRequest, ResearchWorkMode
74
-
75
- client = SynthClient()
76
- research = client.research
77
- factory_id = os.environ["SYNTH_FACTORY_ID"]
78
- effort_id = os.environ["SYNTH_FACTORY_EFFORT_ID"]
79
- project_id = os.environ["SYNTH_RESEARCH_PROJECT_ID"] # An existing, prepared project.
80
-
81
- # Org limits
82
- limits = research.limits.get_typed()
83
- print(limits.plan)
84
-
85
- # Authoritative economics reads; the client does not recompute allowances or discounts.
86
- plan = research.economics.plan()
87
- catalog = research.economics.catalog()
88
- entitlements = research.economics.entitlements()
89
-
90
- # Async Research Factory: inspect the experiment floor before launching work
91
- factory = research.factories.get(factory_id)
92
- floor = research.factories.status(factory.factory_id)
93
- preview = research.factories.preview_wake(factory.factory_id)
94
- # After reviewing preview.efforts, the SDK replays the resolved request_contract
95
- # with its opaque preview_token; callers do not reconstruct the write request.
96
- if preview.confirmation_required:
97
- receipt = research.factories.wake_due(
98
- factory.factory_id,
99
- preview=preview,
94
+ from synth_ai.core.research.public import EnvironmentKind, ProjectSpec, RuntimeKind, SwarmSpec
95
+
96
+ with SynthClient() as client:
97
+ project = client.research.projects.create(
98
+ ProjectSpec(
99
+ name="Repository assessment",
100
+ pool_id="pool_default",
101
+ runtime_kind=RuntimeKind("python"),
102
+ environment_kind=EnvironmentKind("docker"),
103
+ orchestrator_profile_id="profile_orchestrator",
104
+ default_worker_profile_id="profile_worker",
105
+ )
106
+ )
107
+ swarm = client.research.swarms.create(
108
+ SwarmSpec(objective="Produce the assessment."),
109
+ project_id=project.project_id,
100
110
  )
111
+ print(swarm.wait().state)
112
+ ```
101
113
 
102
- # Factory Tag loop
103
- session = research.factories.tag.sessions.create(
104
- ResearchTagSessionCreateRequest(
105
- request="Improve rollout throughput",
106
- factory_id=factory_id,
107
- effort_id=effort_id,
114
+ Factories provide a typed durable optimization loop with native sync/async
115
+ parity:
116
+
117
+ ```python
118
+ from synth_ai import SynthClient
119
+ from synth_ai.core.research.public import EffortSpec, FactorySpec, ProjectId
120
+
121
+ with SynthClient() as client:
122
+ factory = client.research.factories.create(
123
+ FactorySpec(name="Prompt optimizer")
124
+ )
125
+ effort = client.research.factories.efforts.create(
126
+ EffortSpec(
127
+ factory_id=factory.factory_id,
128
+ project_id=ProjectId("project_existing"),
129
+ name="Improve the system prompt",
130
+ )
108
131
  )
109
- )
110
- research.factories.tag.sessions.messages.send(session.session_id, "Status update")
111
- scope = research.factories.tag.scopes.get_default()
112
-
113
- # Launch against the explicitly selected pre-existing project.
114
- work_mode = ResearchWorkMode.DIRECTED_EFFORT
115
- preflight = research.runs.check_preflight(project_id, work_mode=work_mode)
116
- session = research.runs.create(
117
- project_id,
118
- objective="Produce a bounded repository assessment and a readable report.",
119
- work_mode=work_mode,
120
- )
121
-
122
- # Run readouts (nested namespaces — never ``manderqueue`` on hero)
123
- session.snapshots.get(detail="control")
124
- progress = session.progress.get_typed()
125
- usage = session.usage.get()
126
- work_products = session.work_products.list()
127
- artifacts = session.artifacts.list()
128
- if work_products:
129
- report = session.work_products.content.get(work_products[0].work_product_id)
130
- session.message_queue.messages.list()
131
- research.projects.objectives.list(project_id, run_id=session.run_id)
132
+ print(effort.effort_id, effort.state)
132
133
  ```
133
134
 
134
- CLI smoke:
135
+ Limits, economics, secrets, Tag, rich evidence projections, and administrative
136
+ resource APIs remain available under `client.research.advanced` while their
137
+ contracts are stabilized. Advanced APIs are not covered by the stable surface
138
+ guarantee.
139
+
140
+ CLI discovery:
135
141
 
136
142
  ```bash
137
- synth-ai research limits get
138
- synth-ai research tag smoke
139
- synth-ai research smoke
143
+ synth-ai research --help
140
144
  ```
141
145
 
142
146
  ## CLI
@@ -154,7 +158,7 @@ Use `SynthClient` as the front door:
154
158
 
155
159
  | Surface | Client namespace | Use it for |
156
160
  | --- | --- | --- |
157
- | **Managed Research / Factory** | `client.research` | Hosted research runs, projects, Factory Tag, limits, MCP (`synth-ai[research]`). |
161
+ | **Research / Factory** | `client.research` | Typed hosted projects, swarms, Factory lifecycles, and Efforts. |
158
162
  | Containers | `client.containers` | Hosted container records and lifecycle operations. |
159
163
  | Tunnels | `client.tunnels` | Managed tunnel records, leases, health, and rotation. |
160
164
  | Pools | `client.pools` | Container pools, tasks, rollouts, artifacts, usage, and events. |
@@ -176,10 +180,8 @@ override grants are manual audit events rather than automatic resets.
176
180
  The canonical backend surfaces are `GET /smr/billing/catalog`,
177
181
  `GET /smr/billing/plan`, `GET /smr/billing/runs/{run_id}/drawdown`, and
178
182
  `GET /smr/billing/factory-efforts/{factory_effort_id}/drawdown`. In the Python
179
- SDK, use `client.research.economics.entitlements()` for the organization snapshot
180
- and `client.research.economics.plan()`, `.catalog()`, `.run_drawdown(run_id)`, or
181
- `.factory_effort_drawdown(factory_effort_id)` for canonical billing reads. Use
182
- `.project(project_id)` for project usage, budgets, and entitlements. Do not infer
183
+ SDK, use `client.research.advanced.economics` for authoritative billing reads
184
+ while the economics contract remains advanced. Do not infer
183
185
  allowance from legacy Autumn balances or local spend summaries, and do not
184
186
  recompute discounts in the client.
185
187
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "synth-ai"
3
- version = "0.16.1.dev0"
3
+ version = "0.16.1.dev1"
4
4
  description = "Python-only SDK for Synth containers, tunnels, pools, and Research"
5
5
  authors = [{name = "Synth AI", email = "josh@usesynth.ai"}]
6
6
  license = "MIT"
@@ -17,9 +17,8 @@ dependencies = [
17
17
 
18
18
  [project.scripts]
19
19
  synth-ai = "synth_ai.cli:cli"
20
- synth-ai-managed-research-mcp = "synth_ai.managed_research.mcp.server:main"
21
- synth-ai-mcp-managed-research = "synth_ai.managed_research.mcp.server:main"
22
- synth-ai-research-factory-standup = "synth_ai.managed_research.factory_standup:main"
20
+ synth-ai-research-mcp = "synth_ai.mcp.research.server:main"
21
+ synth-ai-research-factory-standup = "synth_ai.cli.research_factory_standup:main"
23
22
 
24
23
  [project.optional-dependencies]
25
24
  schemas = []
@@ -83,10 +82,8 @@ include-package-data = true
83
82
  [tool.setuptools.package-data]
84
83
  "synth_ai" = [
85
84
  "py.typed",
86
- "opencode/skill/*/SKILL.md",
87
- "managed_research/py.typed",
88
- "managed_research/factory_plans/*.json",
89
- "managed_research/schemas/*",
85
+ "core/research/factory_plans/*.json",
86
+ "core/research/schemas/*",
90
87
  ]
91
88
 
92
89
  [tool.ruff]
@@ -132,8 +129,7 @@ include = ["synth_ai"]
132
129
 
133
130
  [[tool.ty.overrides]]
134
131
  include = [
135
- "synth_ai/research/**",
136
- "synth_ai/managed_research/sdk/tag.py",
132
+ "synth_ai/core/research/_legacy/sdk/tag.py",
137
133
  ]
138
134
  rules = { unresolved-import = "warn" }
139
135
 
@@ -21,7 +21,7 @@ except PackageNotFoundError:
21
21
  try:
22
22
  import tomllib as _toml
23
23
  except ModuleNotFoundError: # pragma: no cover
24
- import tomli as _toml # type: ignore[no-redef]
24
+ import tomli as _toml # type: ignore[no-redef] # ty: ignore[unresolved-import]
25
25
 
26
26
  try:
27
27
  pyproject_path = Path(__file__).resolve().parents[1] / "pyproject.toml"
@@ -44,17 +44,17 @@ __all__ = [
44
44
  "ContainerPoolsClient",
45
45
  "ContainersClient",
46
46
  "HorizonsPrivateClient",
47
- "ManagedResearchClient",
48
- "ManagedResearchError",
49
- "ManagedResearchMcpServer",
47
+ "ResearchApiError",
50
48
  "ManagedAgentsAnthropicClient",
51
49
  "ManagedAgentRun",
52
50
  "OpenAIAgentsSdkClient",
53
51
  "ResearchClient",
54
52
  "ResearchConcurrentRunLimitExceededError",
55
- "ResearchApiError",
56
53
  "ResearchInsufficientCreditsError",
57
54
  "ResearchLimitExceededError",
55
+ "ResearchProjectCreateRequest",
56
+ "ResearchSwarmLaunchRequest",
57
+ "ResearchSwarmState",
58
58
  "SynthClient",
59
59
  "SynthManagedAgents",
60
60
  "TunnelsClient",
@@ -63,37 +63,39 @@ __all__ = [
63
63
  ]
64
64
 
65
65
  _EXPORTS: dict[str, tuple[str, str]] = {
66
- "ManagedResearchClient": (
67
- "synth_ai.managed_research.sdk.client",
68
- "ManagedResearchClient",
69
- ),
70
- "SmrControlClient": ("synth_ai.managed_research.sdk.client", "SmrControlClient"),
71
- "ManagedResearchMcpServer": (
72
- "synth_ai.managed_research.mcp.server",
73
- "ManagedResearchMcpServer",
74
- ),
75
- "ManagedResearchError": ("synth_ai.managed_research.errors", "ManagedResearchError"),
76
- "ResearchApiError": ("synth_ai.research.errors", "ResearchApiError"),
66
+ "ResearchApiError": ("synth_ai.core.research.errors", "ResearchApiError"),
77
67
  "ResearchConcurrentRunLimitExceededError": (
78
- "synth_ai.research.errors",
68
+ "synth_ai.core.research.errors",
79
69
  "ResearchConcurrentRunLimitExceededError",
80
70
  ),
81
71
  "ResearchInsufficientCreditsError": (
82
- "synth_ai.research.errors",
72
+ "synth_ai.core.research.errors",
83
73
  "ResearchInsufficientCreditsError",
84
74
  ),
85
- "ResearchLimitExceededError": ("synth_ai.research.errors", "ResearchLimitExceededError"),
86
- "SmrApiError": ("synth_ai.research.errors", "ResearchApiError"),
75
+ "ResearchLimitExceededError": ("synth_ai.core.research.errors", "ResearchLimitExceededError"),
76
+ "SmrApiError": ("synth_ai.core.research.errors", "ResearchApiError"),
87
77
  "SmrConcurrentRunLimitExceededError": (
88
- "synth_ai.research.errors",
78
+ "synth_ai.core.research.errors",
89
79
  "ResearchConcurrentRunLimitExceededError",
90
80
  ),
91
81
  "SmrInsufficientCreditsError": (
92
- "synth_ai.research.errors",
82
+ "synth_ai.core.research.errors",
93
83
  "ResearchInsufficientCreditsError",
94
84
  ),
95
- "SmrLimitExceededError": ("synth_ai.research.errors", "ResearchLimitExceededError"),
96
- "ResearchClient": ("synth_ai.research.client", "ResearchClient"),
85
+ "SmrLimitExceededError": ("synth_ai.core.research.errors", "ResearchLimitExceededError"),
86
+ "ResearchClient": ("synth_ai.core.research.facade", "ResearchClient"),
87
+ "ResearchProjectCreateRequest": (
88
+ "synth_ai.core.research.contracts",
89
+ "ResearchProjectCreateRequest",
90
+ ),
91
+ "ResearchSwarmLaunchRequest": (
92
+ "synth_ai.core.research.contracts",
93
+ "ResearchSwarmLaunchRequest",
94
+ ),
95
+ "ResearchSwarmState": (
96
+ "synth_ai.core.research.contracts",
97
+ "ResearchSwarmState",
98
+ ),
97
99
  "SynthClient": ("synth_ai.client", "SynthClient"),
98
100
  "AsyncSynthClient": ("synth_ai.client", "AsyncSynthClient"),
99
101
  "ContainersClient": ("synth_ai.sdk.containers", "ContainersClient"),
@@ -387,9 +387,9 @@ def _dev_environment_run_options(fn):
387
387
 
388
388
 
389
389
  def _client(api_key: str | None, backend_url: str | None):
390
- from synth_ai.managed_research import ManagedResearchClient
390
+ from synth_ai.core.research.session.client import ResearchSession
391
391
 
392
- return ManagedResearchClient(
392
+ return ResearchSession(
393
393
  api_key=_resolve_api_key(api_key),
394
394
  backend_base=_resolve_backend_url(backend_url),
395
395
  )