synth-ai 0.18.2.dev613__tar.gz → 0.18.2.dev615__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 (259) hide show
  1. {synth_ai-0.18.2.dev613/synth_ai.egg-info → synth_ai-0.18.2.dev615}/PKG-INFO +1 -1
  2. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/pyproject.toml +1 -1
  3. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/__init__.py +22 -0
  4. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/client.py +38 -3
  5. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/README.md +40 -3
  6. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/server.py +2 -0
  7. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/__init__.py +2 -0
  8. synth_ai-0.18.2.dev615/synth_ai/mcp/research/tools/intern_program.py +793 -0
  9. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/research_intern.py +45 -5
  10. synth_ai-0.18.2.dev615/synth_ai/sdk/optimizers/__init__.py +30 -0
  11. synth_ai-0.18.2.dev615/synth_ai/sdk/optimizers/client.py +291 -0
  12. synth_ai-0.18.2.dev615/synth_ai/sdk/optimizers/contracts.py +142 -0
  13. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/__init__.py +337 -227
  14. synth_ai-0.18.2.dev615/synth_ai/sdk/research/contracts/intern_grants.py +346 -0
  15. synth_ai-0.18.2.dev615/synth_ai/sdk/research/contracts/intern_program.py +768 -0
  16. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/research_intern.py +200 -13
  17. synth_ai-0.18.2.dev615/synth_ai/sdk/research/intern_program.py +854 -0
  18. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/operations.py +156 -0
  19. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/public.py +278 -152
  20. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/research_intern.py +245 -4
  21. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615/synth_ai.egg-info}/PKG-INFO +1 -1
  22. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai.egg-info/SOURCES.txt +7 -0
  23. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/LICENSE +0 -0
  24. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/MANIFEST.in +0 -0
  25. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/README.md +0 -0
  26. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/setup.cfg +0 -0
  27. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/README.md +0 -0
  28. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/__main__.py +0 -0
  29. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/cli/AGENTS.md +0 -0
  30. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/cli/README.md +0 -0
  31. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/cli/__init__.py +0 -0
  32. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/cli/__main__.py +0 -0
  33. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/cli/main.py +0 -0
  34. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/cli/research.py +0 -0
  35. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/cli/research_environments.py +0 -0
  36. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/cli/research_image_releases.py +0 -0
  37. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/cli/research_projects.py +0 -0
  38. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/README.md +0 -0
  39. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/__init__.py +0 -0
  40. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/auth/__init__.py +0 -0
  41. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/auth/credentials.py +0 -0
  42. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/contracts/__init__.py +0 -0
  43. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/contracts/json_value.py +0 -0
  44. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/contracts/pagination.py +0 -0
  45. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/errors.py +0 -0
  46. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/http/__init__.py +0 -0
  47. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/http/async_transport.py +0 -0
  48. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/http/request.py +0 -0
  49. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/http/retry.py +0 -0
  50. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/http/streaming.py +0 -0
  51. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/http/transport.py +0 -0
  52. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/research/__init__.py +0 -0
  53. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/utils/__init__.py +0 -0
  54. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/utils/env.py +0 -0
  55. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/utils/log_filter.py +0 -0
  56. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/utils/paths.py +0 -0
  57. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/core/utils/urls.py +0 -0
  58. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/__init__.py +0 -0
  59. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/__main__.py +0 -0
  60. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/objective_tools.py +0 -0
  61. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/registry.py +0 -0
  62. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/request_models.py +0 -0
  63. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/approvals.py +0 -0
  64. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/artifacts.py +0 -0
  65. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/datasets.py +0 -0
  66. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/environments.py +0 -0
  67. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/exports.py +0 -0
  68. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/factories.py +0 -0
  69. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/factory_results.py +0 -0
  70. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/files.py +0 -0
  71. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/image_releases.py +0 -0
  72. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/integrations.py +0 -0
  73. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/logs.py +0 -0
  74. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/models.py +0 -0
  75. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/outputs.py +0 -0
  76. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/policy_schemas.py +0 -0
  77. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/progress.py +0 -0
  78. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/project_data.py +0 -0
  79. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/projects.py +0 -0
  80. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/prs.py +0 -0
  81. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/readiness.py +0 -0
  82. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/repos.py +0 -0
  83. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/resources.py +0 -0
  84. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/runs.py +0 -0
  85. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/trained_models.py +0 -0
  86. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/usage.py +0 -0
  87. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/visuals.py +0 -0
  88. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/mcp/research/tools/workspace_inputs.py +0 -0
  89. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/py.typed +0 -0
  90. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/README.md +0 -0
  91. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/__init__.py +0 -0
  92. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/pagination.py +0 -0
  93. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/__init__.py +0 -0
  94. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/_internal/__init__.py +0 -0
  95. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/_internal/crypto.py +0 -0
  96. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/_internal/env.py +0 -0
  97. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/_internal/urls.py +0 -0
  98. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/account.py +0 -0
  99. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/advanced.py +0 -0
  100. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/advanced_factories.py +0 -0
  101. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/advanced_swarms.py +0 -0
  102. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/artifacts.py +0 -0
  103. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/auth.py +0 -0
  104. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/client.py +0 -0
  105. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/_activity_wire.py +0 -0
  106. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/_environment_wire.py +0 -0
  107. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/_transcript_wire.py +0 -0
  108. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/_wire.py +0 -0
  109. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/activity.py +0 -0
  110. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/activity_items.py +0 -0
  111. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/actor_images.py +0 -0
  112. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/billing.py +0 -0
  113. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/canonical_usage.py +0 -0
  114. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/checkpoints.py +0 -0
  115. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/cloud_deployment_claims.py +0 -0
  116. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/cloud_deployments.py +0 -0
  117. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/common.py +0 -0
  118. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/dataset_revisions.py +0 -0
  119. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/deliveries.py +0 -0
  120. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/dev_environment_evidence.py +0 -0
  121. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/economics.py +0 -0
  122. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/environment_manifest.py +0 -0
  123. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/environments.py +0 -0
  124. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/evidence.py +0 -0
  125. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/factories.py +0 -0
  126. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/factory_evidence.py +0 -0
  127. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/factory_lenses.py +0 -0
  128. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/factory_operations.py +0 -0
  129. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/factory_role_receipts.py +0 -0
  130. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/failure.py +0 -0
  131. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/image_releases.py +0 -0
  132. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/limit_evidence.py +0 -0
  133. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/local_execution_profile.py +0 -0
  134. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/operator_evidence.py +0 -0
  135. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/project.py +0 -0
  136. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/project_data.py +0 -0
  137. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/project_runtime.py +0 -0
  138. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/project_workspace.py +0 -0
  139. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/project_workspace_evidence.py +0 -0
  140. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/projects.py +0 -0
  141. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/promotions.py +0 -0
  142. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/run_authority.py +0 -0
  143. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/run_control.py +0 -0
  144. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/run_diagnostics.py +0 -0
  145. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/run_events.py +0 -0
  146. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/run_execution.py +0 -0
  147. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/run_launch.py +0 -0
  148. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/run_observability.py +0 -0
  149. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/run_state.py +0 -0
  150. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/run_timeline.py +0 -0
  151. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/runtime_image.py +0 -0
  152. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/runtime_intent.py +0 -0
  153. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/runtime_stream.py +0 -0
  154. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/runtime_stream_snapshot.py +0 -0
  155. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/scientific_integrity.py +0 -0
  156. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_actor_models.py +0 -0
  157. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_actor_policy_data.py +0 -0
  158. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_agent_harnesses.py +0 -0
  159. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_agent_kinds.py +0 -0
  160. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_agent_models.py +0 -0
  161. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_branching.py +0 -0
  162. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_credential_providers.py +0 -0
  163. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_environment_kinds.py +0 -0
  164. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_evidence_obligations.py +0 -0
  165. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_funding_sources.py +0 -0
  166. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_horizons.py +0 -0
  167. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_host_kinds.py +0 -0
  168. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_inference_providers.py +0 -0
  169. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_network_topology.py +0 -0
  170. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_providers.py +0 -0
  171. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_resource_kinds.py +0 -0
  172. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_roles.py +0 -0
  173. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_run_policy.py +0 -0
  174. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_runbooks.py +0 -0
  175. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_runnable_project.py +0 -0
  176. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_runtime_kinds.py +0 -0
  177. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_tool_providers.py +0 -0
  178. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/smr_work_modes.py +0 -0
  179. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/status.py +0 -0
  180. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/swarms.py +0 -0
  181. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/tag.py +0 -0
  182. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/traces.py +0 -0
  183. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/transcript.py +0 -0
  184. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/types.py +0 -0
  185. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/usage.py +0 -0
  186. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/visuals.py +0 -0
  187. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/wire_models.py +0 -0
  188. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/wire_models_README.md +0 -0
  189. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/work_products.py +0 -0
  190. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/contracts/workspaces.py +0 -0
  191. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/economics.py +0 -0
  192. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/efforts.py +0 -0
  193. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/environments.py +0 -0
  194. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/errors.py +0 -0
  195. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/events.py +0 -0
  196. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/experiments.py +0 -0
  197. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/facade.py +0 -0
  198. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/factories.py +0 -0
  199. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/factory_storage.py +0 -0
  200. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/image_releases.py +0 -0
  201. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/knowledge.py +0 -0
  202. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/models.py +0 -0
  203. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/project_data.py +0 -0
  204. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/project_deliveries.py +0 -0
  205. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/project_workspaces.py +0 -0
  206. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/projects.py +0 -0
  207. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/readouts.py +0 -0
  208. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/secrets.py +0 -0
  209. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/README.md +0 -0
  210. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/__init__.py +0 -0
  211. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/_base.py +0 -0
  212. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/_client_helpers.py +0 -0
  213. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/_run_authority_mixin.py +0 -0
  214. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/approvals.py +0 -0
  215. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/billing.py +0 -0
  216. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/client.py +0 -0
  217. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/cloud_deployments.py +0 -0
  218. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/config.py +0 -0
  219. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/cost.py +0 -0
  220. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/datasets.py +0 -0
  221. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/dev_environments.py +0 -0
  222. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/environments.py +0 -0
  223. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/exports.py +0 -0
  224. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/factories.py +0 -0
  225. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/factory_evidence.py +0 -0
  226. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/files.py +0 -0
  227. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/github.py +0 -0
  228. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/image_releases.py +0 -0
  229. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/images.py +0 -0
  230. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/logs.py +0 -0
  231. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/models.py +0 -0
  232. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/outputs.py +0 -0
  233. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/progress.py +0 -0
  234. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/project.py +0 -0
  235. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/projects.py +0 -0
  236. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/prs.py +0 -0
  237. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/readiness.py +0 -0
  238. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/repositories.py +0 -0
  239. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/runs.py +0 -0
  240. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/secrets.py +0 -0
  241. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/setup.py +0 -0
  242. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/tag.py +0 -0
  243. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/trained_models.py +0 -0
  244. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/transport.py +0 -0
  245. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/usage.py +0 -0
  246. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/work_products.py +0 -0
  247. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/session/workspace_inputs.py +0 -0
  248. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/swarms.py +0 -0
  249. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/traces.py +0 -0
  250. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/transport/__init__.py +0 -0
  251. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/transport/http.py +0 -0
  252. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/transport/pagination.py +0 -0
  253. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/version.py +0 -0
  254. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/visuals.py +0 -0
  255. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai/sdk/research/wiki.py +0 -0
  256. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai.egg-info/dependency_links.txt +0 -0
  257. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai.egg-info/entry_points.txt +0 -0
  258. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/synth_ai.egg-info/requires.txt +0 -0
  259. {synth_ai-0.18.2.dev613 → synth_ai-0.18.2.dev615}/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.18.2.dev613
3
+ Version: 0.18.2.dev615
4
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "synth-ai"
3
- version = "0.18.2.dev613"
3
+ version = "0.18.2.dev615"
4
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"
@@ -39,6 +39,7 @@ except _PackageNotFoundError:
39
39
  __all__ = [
40
40
  "AsyncResearchInternReactiveSession",
41
41
  "AsyncSynthClient",
42
+ "AsyncOptimizersClient",
42
43
  "DataBindingCreateRequest",
43
44
  "DatasetRevisionCreateRequest",
44
45
  "DatasetRevisionFinalizeRequest",
@@ -99,9 +100,30 @@ __all__ = [
99
100
  "ResearchVisualPromotionRequest",
100
101
  "ResearchVisualVersions",
101
102
  "SynthClient",
103
+ "OptimizersClient",
104
+ "OptimizerRunOutputs",
105
+ "SavedLoraCheckpoint",
106
+ "SavedLoraCheckpointPage",
107
+ "SavedLoraLineage",
108
+ "SavedLoraRunPage",
109
+ "HostedTrainingModelCatalog",
102
110
  ]
103
111
 
104
112
  _EXPORTS: dict[str, tuple[str, str]] = {
113
+ "AsyncOptimizersClient": ("synth_ai.sdk.optimizers", "AsyncOptimizersClient"),
114
+ "HostedTrainingModelCatalog": (
115
+ "synth_ai.sdk.optimizers",
116
+ "HostedTrainingModelCatalog",
117
+ ),
118
+ "OptimizersClient": ("synth_ai.sdk.optimizers", "OptimizersClient"),
119
+ "OptimizerRunOutputs": ("synth_ai.sdk.optimizers", "OptimizerRunOutputs"),
120
+ "SavedLoraCheckpoint": ("synth_ai.sdk.optimizers", "SavedLoraCheckpoint"),
121
+ "SavedLoraCheckpointPage": (
122
+ "synth_ai.sdk.optimizers",
123
+ "SavedLoraCheckpointPage",
124
+ ),
125
+ "SavedLoraLineage": ("synth_ai.sdk.optimizers", "SavedLoraLineage"),
126
+ "SavedLoraRunPage": ("synth_ai.sdk.optimizers", "SavedLoraRunPage"),
105
127
  "AsyncResearchInternReactiveSession": (
106
128
  "synth_ai.sdk.research.research_intern",
107
129
  "AsyncResearchInternReactiveSession",
@@ -9,6 +9,7 @@ from synth_ai.core.auth.credentials import resolve_api_credential
9
9
  from synth_ai.core.utils.urls import BACKEND_URL_BASE, normalize_backend_base
10
10
 
11
11
  if TYPE_CHECKING:
12
+ from synth_ai.sdk.optimizers import AsyncOptimizersClient, OptimizersClient
12
13
  from synth_ai.sdk.research import AsyncResearchClient
13
14
  from synth_ai.sdk.research.facade import ResearchClient
14
15
 
@@ -22,10 +23,10 @@ def _resolve_base_url(base_url: str | None) -> str:
22
23
 
23
24
 
24
25
  class SynthClient:
25
- """Sync client for Managed Research.
26
+ """Sync client for Managed Research and hosted optimizers.
26
27
 
27
28
  Use ``research`` for hosted projects, swarms, and Factory lifecycles. That
28
- is the whole client: there is no container, tunnel, or pool namespace.
29
+ Use ``optimizers`` for hosted training model discovery and saved LoRAs.
29
30
  """
30
31
 
31
32
  def __init__(
@@ -41,6 +42,7 @@ class SynthClient:
41
42
  self.timeout_seconds = timeout_seconds
42
43
  self.allow_legacy_intern_sessions = allow_legacy_intern_sessions
43
44
  self._research_client: ResearchClient | None = None
45
+ self._optimizers_client: OptimizersClient | None = None
44
46
 
45
47
  @property
46
48
  def research(self) -> ResearchClient:
@@ -61,6 +63,22 @@ class SynthClient:
61
63
  if self._research_client is not None:
62
64
  self._research_client.close()
63
65
  self._research_client = None
66
+ if self._optimizers_client is not None:
67
+ self._optimizers_client.close()
68
+ self._optimizers_client = None
69
+
70
+ @property
71
+ def optimizers(self) -> OptimizersClient:
72
+ """Hosted training models and searchable saved-LoRA lineage."""
73
+ if self._optimizers_client is None:
74
+ from synth_ai.sdk.optimizers import OptimizersClient
75
+
76
+ self._optimizers_client = OptimizersClient(
77
+ api_key=self.api_key,
78
+ base_url=self.base_url,
79
+ timeout_seconds=self.timeout_seconds,
80
+ )
81
+ return self._optimizers_client
64
82
 
65
83
  def __enter__(self) -> SynthClient:
66
84
  return self
@@ -70,7 +88,7 @@ class SynthClient:
70
88
 
71
89
 
72
90
  class AsyncSynthClient:
73
- """Async client for Managed Research."""
91
+ """Async client for Managed Research and hosted optimizers."""
74
92
 
75
93
  def __init__(
76
94
  self,
@@ -85,6 +103,7 @@ class AsyncSynthClient:
85
103
  self.timeout_seconds = timeout_seconds
86
104
  self.allow_legacy_intern_sessions = allow_legacy_intern_sessions
87
105
  self._async_research_client: AsyncResearchClient | None = None
106
+ self._async_optimizers_client: AsyncOptimizersClient | None = None
88
107
 
89
108
  @property
90
109
  def research(self) -> AsyncResearchClient:
@@ -115,6 +134,22 @@ class AsyncSynthClient:
115
134
  if self._async_research_client is not None:
116
135
  await self._async_research_client.close()
117
136
  self._async_research_client = None
137
+ if self._async_optimizers_client is not None:
138
+ await self._async_optimizers_client.close()
139
+ self._async_optimizers_client = None
140
+
141
+ @property
142
+ def optimizers(self) -> AsyncOptimizersClient:
143
+ """Native asynchronous hosted optimizer namespace."""
144
+ if self._async_optimizers_client is None:
145
+ from synth_ai.sdk.optimizers import AsyncOptimizersClient
146
+
147
+ self._async_optimizers_client = AsyncOptimizersClient(
148
+ api_key=self.api_key,
149
+ base_url=self.base_url,
150
+ timeout_seconds=self.timeout_seconds,
151
+ )
152
+ return self._async_optimizers_client
118
153
 
119
154
  async def __aenter__(self) -> AsyncSynthClient:
120
155
  return self
@@ -95,16 +95,53 @@ sessions; they never address the singleton Async resource implicitly.
95
95
 
96
96
  Async Intern control plane:
97
97
  - `intern_async_ensure` and `intern_async_get` address the organization's one
98
- long-lived Async Intern runtime
99
- - `intern_async_command` preserves the exact durable command envelope
98
+ long-lived Async Intern runtime. Ensure accepts day/month spend ceilings via
99
+ `budget.maximum_daily_cost_cents` / `budget.maximum_monthly_cost_cents` or
100
+ top-level kwargs of the same names; omitted ceilings get server defaults.
101
+ - `intern_async_command` preserves the exact durable command envelope (including
102
+ `request_spine_handoff` / `advance_spine`)
100
103
  - `intern_async_send`, `intern_async_intervene`,
101
104
  `intern_async_redirect_objective`, and `intern_async_request_checkpoint`
102
105
  submit typed instructions to the same backend inbox
103
106
  - `intern_async_pause`, `intern_async_resume`, `intern_async_cancel`, and
104
- `intern_async_provide_input` expose explicit state-machine controls
107
+ `intern_async_provide_input` expose explicit state-machine controls. Pause
108
+ frees the sticky exe.dev host lease; resume reacquires it.
109
+ - `intern_async_get` projections include `open_judgment_items` and `effort_work`
110
+ (ask-and-continue asks and per-Effort work summaries), plus `spend` and
111
+ `host_lease`. The spend totals are the same ones the capability gate and the
112
+ spend sweeper read, host idle cost included, so what a caller sees is what
113
+ actually blocks work; `host_lease.reused` distinguishes a lease reacquired on
114
+ resume from a freshly provisioned host
105
115
  - `intern_async_events` replays a bounded event page and `intern_async_tail`
106
116
  waits for a bounded number of SSE events
107
117
 
118
+ Intern research program (Effort-first):
119
+ - `intern_effort_board` lists Efforts as board rows -- the Effort plus its open
120
+ objective/task/question counts -- and `intern_effort_detail` rolls one Effort
121
+ up into Progress / Results / Experiments / Knowledge. The runtime block on the
122
+ detail is secondary ops chrome (cycle, wake, cursor, spend, host lease), not
123
+ the product surface.
124
+ - `intern_objective_list` / `_create` / `_get` / `_update`,
125
+ `intern_milestone_list` / `_create` / `_transition`, and
126
+ `intern_task_list` / `_create` / `_update` address the Intern's own
127
+ Effort-bound planner store. The Effort is a required argument on every create:
128
+ a row cannot exist without its binding, and the binding is immutable.
129
+ - `intern_progress_claim_create` folds a finished run's result back into the
130
+ objective that motivated it; `intern_objective_link_create` records a
131
+ *reference* from an Intern objective to an SMR-owned run, report, work
132
+ product, or experiment. Neither writes the target.
133
+ - Effort lifecycle itself is not duplicated here. Use the existing
134
+ `research_list_factory_efforts`, `research_get_effort`, and
135
+ `research_patch_effort`; these are the Async program verbs.
136
+ - `intern_memory_search` / `intern_memory_get` read the Intern's own history.
137
+ They return the retrieval payload with no wrapper, field for field with the
138
+ Intern's own memory tools -- so an operator inspecting memory sees exactly
139
+ what the Intern saw, rather than a second description of the same records.
140
+ - The Intern is a client of the swarm plane, never its owner. Kickoff and poll
141
+ stay on `research_trigger_run` / `research_get_run` / `research_get_swarm_*`.
142
+ No tool here plans a swarm's task graph, and none should be added that does --
143
+ `synth_ai.sdk.research.intern_grants` refuses those names outright.
144
+
108
145
  These tools are thin adapters over `client.intern.async_`; they do not call
109
146
  HTTP directly and do not contain reducer logic. A command receipt proves
110
147
  durable admission, not completion. Callers retain command/idempotency identity
@@ -47,6 +47,7 @@ from synth_ai.mcp.research.tools.factory_results import (
47
47
  from synth_ai.mcp.research.tools.files import build_file_tools
48
48
  from synth_ai.mcp.research.tools.image_releases import build_image_release_tools
49
49
  from synth_ai.mcp.research.tools.integrations import build_integration_tools
50
+ from synth_ai.mcp.research.tools.intern_program import build_intern_program_tools
50
51
  from synth_ai.mcp.research.tools.logs import build_log_tools
51
52
  from synth_ai.mcp.research.tools.models import build_model_tools
52
53
  from synth_ai.mcp.research.tools.outputs import build_output_tools
@@ -480,6 +481,7 @@ class ResearchMcpServer:
480
481
  *build_output_tools(self),
481
482
  *build_readiness_tools(self),
482
483
  *build_research_intern_tools(self._core_client_from_args),
484
+ *build_intern_program_tools(self._core_client_from_args),
483
485
  *build_resource_tools(self),
484
486
  *build_run_tools(self),
485
487
  *build_progress_tools(self),
@@ -6,6 +6,7 @@ from synth_ai.mcp.research.tools.exports import build_export_tools
6
6
  from synth_ai.mcp.research.tools.factories import build_factory_tools
7
7
  from synth_ai.mcp.research.tools.files import build_file_tools
8
8
  from synth_ai.mcp.research.tools.image_releases import build_image_release_tools
9
+ from synth_ai.mcp.research.tools.intern_program import build_intern_program_tools
9
10
  from synth_ai.mcp.research.tools.models import build_model_tools
10
11
  from synth_ai.mcp.research.tools.outputs import build_output_tools
11
12
  from synth_ai.mcp.research.tools.progress import build_progress_tools
@@ -26,6 +27,7 @@ __all__ = [
26
27
  "build_factory_tools",
27
28
  "build_file_tools",
28
29
  "build_image_release_tools",
30
+ "build_intern_program_tools",
29
31
  "build_model_tools",
30
32
  "build_output_tools",
31
33
  "build_progress_tools",