synth-ai 0.22.2.dev691__tar.gz → 0.22.2.dev692__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 (365) hide show
  1. {synth_ai-0.22.2.dev691/synth_ai.egg-info → synth_ai-0.22.2.dev692}/PKG-INFO +1 -1
  2. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/pyproject.toml +1 -1
  3. synth_ai-0.22.2.dev692/synth_ai/core/contracts/rate_limits.py +64 -0
  4. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/errors.py +14 -0
  5. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/http/__init__.py +3 -0
  6. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/http/async_transport.py +6 -0
  7. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/http/transport.py +7 -0
  8. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/server.py +1 -0
  9. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/client.py +11 -1
  10. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692/synth_ai.egg-info}/PKG-INFO +1 -1
  11. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai.egg-info/SOURCES.txt +1 -0
  12. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/LICENSE +0 -0
  13. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/MANIFEST.in +0 -0
  14. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/README.md +0 -0
  15. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/openapi/index-v1.json +0 -0
  16. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/openapi/messaging-v1.json +0 -0
  17. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/openapi/research-v1.json +0 -0
  18. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/setup.cfg +0 -0
  19. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/setup.py +0 -0
  20. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/README.md +0 -0
  21. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/__init__.py +0 -0
  22. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/__main__.py +0 -0
  23. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/cli/AGENTS.md +0 -0
  24. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/cli/README.md +0 -0
  25. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/cli/__init__.py +0 -0
  26. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/cli/__main__.py +0 -0
  27. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/cli/index.py +0 -0
  28. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/cli/main.py +0 -0
  29. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/cli/research.py +0 -0
  30. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/cli/research_environments.py +0 -0
  31. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/cli/research_image_releases.py +0 -0
  32. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/cli/research_projects.py +0 -0
  33. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/cli/utils/__init__.py +0 -0
  34. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/cli/utils/research_launch.py +0 -0
  35. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/client.py +0 -0
  36. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/README.md +0 -0
  37. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/__init__.py +0 -0
  38. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/auth/__init__.py +0 -0
  39. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/auth/credentials.py +0 -0
  40. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/contracts/__init__.py +0 -0
  41. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/contracts/json_value.py +0 -0
  42. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/contracts/pagination.py +0 -0
  43. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/http/request.py +0 -0
  44. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/http/retry.py +0 -0
  45. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/http/streaming.py +0 -0
  46. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/local_files.py +0 -0
  47. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/research/__init__.py +0 -0
  48. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/utils/__init__.py +0 -0
  49. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/utils/env.py +0 -0
  50. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/utils/log_filter.py +0 -0
  51. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/utils/paths.py +0 -0
  52. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/core/utils/urls.py +0 -0
  53. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/README.md +0 -0
  54. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/__init__.py +0 -0
  55. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/__main__.py +0 -0
  56. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/objective_tools.py +0 -0
  57. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/registry.py +0 -0
  58. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/request_models.py +0 -0
  59. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/__init__.py +0 -0
  60. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/approvals.py +0 -0
  61. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/artifacts.py +0 -0
  62. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/datasets.py +0 -0
  63. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/environments.py +0 -0
  64. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/exports.py +0 -0
  65. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/factories.py +0 -0
  66. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/factory_results.py +0 -0
  67. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/files.py +0 -0
  68. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/image_releases.py +0 -0
  69. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/index.py +0 -0
  70. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/index_qa.py +0 -0
  71. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/integrations.py +0 -0
  72. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/intern_program.py +0 -0
  73. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/launch_schemas.py +0 -0
  74. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/local_files.py +0 -0
  75. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/logs.py +0 -0
  76. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/models.py +0 -0
  77. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/outputs.py +0 -0
  78. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/policy_schemas.py +0 -0
  79. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/progress.py +0 -0
  80. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/project_data.py +0 -0
  81. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/projects.py +0 -0
  82. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/prs.py +0 -0
  83. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/readiness.py +0 -0
  84. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/repos.py +0 -0
  85. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/research_intern.py +0 -0
  86. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/resource_reads.py +0 -0
  87. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/resources.py +0 -0
  88. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/runs.py +0 -0
  89. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/scientific_records.py +0 -0
  90. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/trained_models.py +0 -0
  91. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/usage.py +0 -0
  92. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/visuals.py +0 -0
  93. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/mcp/research/tools/workspace_inputs.py +0 -0
  94. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/pools.py +0 -0
  95. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/py.typed +0 -0
  96. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/README.md +0 -0
  97. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/__init__.py +0 -0
  98. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/AGENT_SETUP_PROMPT.md +0 -0
  99. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/README.md +0 -0
  100. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/__init__.py +0 -0
  101. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/agent_policy.py +0 -0
  102. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/artifacts.py +0 -0
  103. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/catalog.py +0 -0
  104. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/catalogue.py +0 -0
  105. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/classification.py +0 -0
  106. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/contracts.py +0 -0
  107. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/contributions.py +0 -0
  108. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/errors.py +0 -0
  109. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/forge_notices.py +0 -0
  110. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/intake.py +0 -0
  111. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/lifecycle.py +0 -0
  112. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/local_files.py +0 -0
  113. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/manifest.py +0 -0
  114. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/oauth.py +0 -0
  115. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/package.py +0 -0
  116. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/public.py +0 -0
  117. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/public_corpus.py +0 -0
  118. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/public_search.py +0 -0
  119. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/qa.py +0 -0
  120. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/qa_checks.py +0 -0
  121. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/qa_preflight.py +0 -0
  122. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/qa_reviews.py +0 -0
  123. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/research/__init__.py +0 -0
  124. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/research/build.py +0 -0
  125. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/research/capture.py +0 -0
  126. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/research/contracts.py +0 -0
  127. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/research/files.py +0 -0
  128. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/research/release.py +0 -0
  129. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/research_intake.py +0 -0
  130. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/retry.py +0 -0
  131. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/rights.py +0 -0
  132. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/scientific_provenance.py +0 -0
  133. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/scope_errors.py +0 -0
  134. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/scopes.py +0 -0
  135. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/search.py +0 -0
  136. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/submission.py +0 -0
  137. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/timeouts.py +0 -0
  138. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/transfer.py +0 -0
  139. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/upload_session.py +0 -0
  140. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/usage_accounting.py +0 -0
  141. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/value.py +0 -0
  142. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/index/wallet_search.py +0 -0
  143. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/messaging/README.md +0 -0
  144. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/messaging/__init__.py +0 -0
  145. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/messaging/client.py +0 -0
  146. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/messaging/contracts.py +0 -0
  147. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/optimizers/__init__.py +0 -0
  148. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/optimizers/client.py +0 -0
  149. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/optimizers/contracts.py +0 -0
  150. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/pagination.py +0 -0
  151. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/__init__.py +0 -0
  152. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/_internal/__init__.py +0 -0
  153. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/_internal/crypto.py +0 -0
  154. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/_internal/env.py +0 -0
  155. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/_internal/urls.py +0 -0
  156. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/account.py +0 -0
  157. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/advanced.py +0 -0
  158. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/advanced_factories.py +0 -0
  159. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/advanced_swarms.py +0 -0
  160. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/artifacts.py +0 -0
  161. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/auth.py +0 -0
  162. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/client.py +0 -0
  163. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/container_pools/__init__.py +0 -0
  164. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/container_pools/api.py +0 -0
  165. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/container_pools/contracts.py +0 -0
  166. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/container_pools/operations.py +0 -0
  167. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/container_pools/packaging.py +0 -0
  168. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/__init__.py +0 -0
  169. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/_activity_wire.py +0 -0
  170. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/_environment_wire.py +0 -0
  171. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/_transcript_wire.py +0 -0
  172. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/_wire.py +0 -0
  173. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/activity.py +0 -0
  174. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/activity_items.py +0 -0
  175. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/actor_images.py +0 -0
  176. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/billing.py +0 -0
  177. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/canonical_usage.py +0 -0
  178. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/checkpoints.py +0 -0
  179. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/cloud_deployment_claims.py +0 -0
  180. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/cloud_deployments.py +0 -0
  181. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/common.py +0 -0
  182. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/dataset_revisions.py +0 -0
  183. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/deliveries.py +0 -0
  184. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/dev_environment_evidence.py +0 -0
  185. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/economics.py +0 -0
  186. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/environment_manifest.py +0 -0
  187. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/environments.py +0 -0
  188. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/evidence.py +0 -0
  189. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/experiment_evidence.py +0 -0
  190. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/factories.py +0 -0
  191. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/factory_evidence.py +0 -0
  192. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/factory_lenses.py +0 -0
  193. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/factory_operations.py +0 -0
  194. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/factory_role_receipts.py +0 -0
  195. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/failure.py +0 -0
  196. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/forge/__init__.py +0 -0
  197. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/forge/contracts.py +0 -0
  198. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/forge/evaluation.py +0 -0
  199. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/forge/exports.py +0 -0
  200. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/forge/operations.py +0 -0
  201. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/forge/records.py +0 -0
  202. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/forge/resources.py +0 -0
  203. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/forge/schema.py +0 -0
  204. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/forge_citations.py +0 -0
  205. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/forge_uploads.py +0 -0
  206. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/image_releases.py +0 -0
  207. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/intern_authority.py +0 -0
  208. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/intern_blockers.py +0 -0
  209. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/intern_grants.py +0 -0
  210. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/intern_program.py +0 -0
  211. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/intern_resources.py +0 -0
  212. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/intern_usage.py +0 -0
  213. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/limit_evidence.py +0 -0
  214. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/local_execution_profile.py +0 -0
  215. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/native_attachment.py +0 -0
  216. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/native_result_outcome.py +0 -0
  217. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/operator_evidence.py +0 -0
  218. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/project.py +0 -0
  219. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/project_data.py +0 -0
  220. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/project_runtime.py +0 -0
  221. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/project_workspace.py +0 -0
  222. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/project_workspace_evidence.py +0 -0
  223. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/projects.py +0 -0
  224. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/promotions.py +0 -0
  225. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/research_intern.py +0 -0
  226. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/resource_reads.py +0 -0
  227. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/resource_settlement.py +0 -0
  228. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/run_authority.py +0 -0
  229. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/run_control.py +0 -0
  230. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/run_diagnostics.py +0 -0
  231. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/run_events.py +0 -0
  232. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/run_execution.py +0 -0
  233. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/run_launch.py +0 -0
  234. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/run_observability.py +0 -0
  235. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/run_state.py +0 -0
  236. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/run_timeline.py +0 -0
  237. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/runtime_image.py +0 -0
  238. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/runtime_intent.py +0 -0
  239. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/runtime_stream.py +0 -0
  240. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/runtime_stream_snapshot.py +0 -0
  241. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/scientific_citations.py +0 -0
  242. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/scientific_integrity.py +0 -0
  243. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_actor_models.py +0 -0
  244. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_actor_policy_data.py +0 -0
  245. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_agent_harnesses.py +0 -0
  246. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_agent_kinds.py +0 -0
  247. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_agent_models.py +0 -0
  248. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_branching.py +0 -0
  249. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_credential_providers.py +0 -0
  250. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_environment_kinds.py +0 -0
  251. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_evidence_obligations.py +0 -0
  252. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_funding_sources.py +0 -0
  253. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_horizons.py +0 -0
  254. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_host_kinds.py +0 -0
  255. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_inference_providers.py +0 -0
  256. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_network_topology.py +0 -0
  257. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_providers.py +0 -0
  258. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_resource_kinds.py +0 -0
  259. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_roles.py +0 -0
  260. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_run_policy.py +0 -0
  261. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_runbooks.py +0 -0
  262. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_runnable_project.py +0 -0
  263. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_runtime_kinds.py +0 -0
  264. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_tool_providers.py +0 -0
  265. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/smr_work_modes.py +0 -0
  266. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/status.py +0 -0
  267. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/swarm_controls.py +0 -0
  268. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/swarm_history.py +0 -0
  269. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/swarm_rollouts.py +0 -0
  270. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/swarm_tasks.py +0 -0
  271. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/swarms.py +0 -0
  272. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/tag.py +0 -0
  273. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/traces.py +0 -0
  274. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/transcript.py +0 -0
  275. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/types.py +0 -0
  276. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/usage.py +0 -0
  277. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/visuals.py +0 -0
  278. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/wire_models.py +0 -0
  279. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/wire_models_README.md +0 -0
  280. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/work_products.py +0 -0
  281. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/contracts/workspaces.py +0 -0
  282. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/economics.py +0 -0
  283. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/efforts.py +0 -0
  284. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/environments.py +0 -0
  285. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/errors.py +0 -0
  286. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/events.py +0 -0
  287. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/execution_reads.py +0 -0
  288. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/experiments.py +0 -0
  289. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/facade.py +0 -0
  290. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/factories.py +0 -0
  291. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/factory_storage.py +0 -0
  292. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/hierarchy.py +0 -0
  293. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/hierarchy_models.py +0 -0
  294. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/image_releases.py +0 -0
  295. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/intern_authority.py +0 -0
  296. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/intern_blockers.py +0 -0
  297. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/intern_program.py +0 -0
  298. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/knowledge.py +0 -0
  299. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/models.py +0 -0
  300. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/operations.py +0 -0
  301. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/owner_reads.py +0 -0
  302. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/planning_reads.py +0 -0
  303. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/project_data.py +0 -0
  304. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/project_deliveries.py +0 -0
  305. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/project_workspaces.py +0 -0
  306. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/projects.py +0 -0
  307. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/public.py +0 -0
  308. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/readouts.py +0 -0
  309. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/research_intern.py +0 -0
  310. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/resource_reads.py +0 -0
  311. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/scientific_records.py +0 -0
  312. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/secrets.py +0 -0
  313. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/README.md +0 -0
  314. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/__init__.py +0 -0
  315. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/_base.py +0 -0
  316. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/_client_helpers.py +0 -0
  317. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/_run_authority_mixin.py +0 -0
  318. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/approvals.py +0 -0
  319. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/billing.py +0 -0
  320. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/client.py +0 -0
  321. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/cloud_deployments.py +0 -0
  322. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/config.py +0 -0
  323. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/cost.py +0 -0
  324. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/datasets.py +0 -0
  325. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/dev_environments.py +0 -0
  326. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/directory_inputs.py +0 -0
  327. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/environments.py +0 -0
  328. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/exports.py +0 -0
  329. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/factories.py +0 -0
  330. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/factory_evidence.py +0 -0
  331. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/files.py +0 -0
  332. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/github.py +0 -0
  333. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/image_releases.py +0 -0
  334. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/images.py +0 -0
  335. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/logs.py +0 -0
  336. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/models.py +0 -0
  337. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/outputs.py +0 -0
  338. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/progress.py +0 -0
  339. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/project.py +0 -0
  340. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/projects.py +0 -0
  341. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/prs.py +0 -0
  342. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/readiness.py +0 -0
  343. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/repositories.py +0 -0
  344. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/runs.py +0 -0
  345. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/secrets.py +0 -0
  346. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/setup.py +0 -0
  347. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/tag.py +0 -0
  348. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/trained_models.py +0 -0
  349. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/transport.py +0 -0
  350. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/usage.py +0 -0
  351. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/work_products.py +0 -0
  352. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/session/workspace_inputs.py +0 -0
  353. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/surface_parity.py +0 -0
  354. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/swarms.py +0 -0
  355. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/traces.py +0 -0
  356. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/transport/__init__.py +0 -0
  357. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/transport/http.py +0 -0
  358. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/transport/pagination.py +0 -0
  359. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/version.py +0 -0
  360. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/visuals.py +0 -0
  361. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai/sdk/research/wiki.py +0 -0
  362. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai.egg-info/dependency_links.txt +0 -0
  363. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai.egg-info/entry_points.txt +0 -0
  364. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/synth_ai.egg-info/requires.txt +0 -0
  365. {synth_ai-0.22.2.dev691 → synth_ai-0.22.2.dev692}/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.22.2.dev691
3
+ Version: 0.22.2.dev692
4
4
  Summary: Python SDK, CLI and MCP servers for Synth Index search and Swarms
5
5
  Author-email: Synth AI <josh@usesynth.ai>
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "synth-ai"
3
- version = "0.22.2.dev691"
3
+ version = "0.22.2.dev692"
4
4
  description = "Python SDK, CLI and MCP servers for Synth Index search and Swarms"
5
5
  keywords = ["synth", "index", "search", "citations", "research", "swarms", "mcp", "sdk"]
6
6
  authors = [{name = "Synth AI", email = "josh@usesynth.ai"}]
@@ -0,0 +1,64 @@
1
+ """Per-response rate capacity; see testing/specifications/sdk/rate_limits.md.
2
+
3
+ Only recognized, bounded numeric/ISO fields are retained. Response cookies,
4
+ authorization, and unrelated headers never enter logs or exception metadata.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from collections.abc import Mapping
10
+ from dataclasses import dataclass
11
+ from datetime import datetime
12
+
13
+
14
+ @dataclass(frozen=True, slots=True)
15
+ class RateLimitSnapshot:
16
+ dimension: str
17
+ limit: int | None
18
+ remaining: int | None
19
+ reset_at: str | None
20
+ burst: int | None = None
21
+
22
+
23
+ def parse_rate_limits(headers: Mapping[str, str]) -> tuple[RateLimitSnapshot, ...]:
24
+ normalized = {name.lower(): value for name, value in headers.items()}
25
+ result = []
26
+ for dimension in ("requests", "concurrency", "tokens", "spend-cents"):
27
+
28
+ def count(kind: str, dimension: str = dimension) -> int | None:
29
+ raw = normalized.get(f"x-ratelimit-{kind}-{dimension}", "")
30
+ return (
31
+ int(raw)
32
+ if raw.isascii() and raw.isdigit() and len(raw) <= 16 and int(raw) <= 2**53 - 1
33
+ else None
34
+ )
35
+
36
+ limit, remaining, burst = count("limit"), count("remaining"), count("burst")
37
+ reset = normalized.get(f"x-ratelimit-reset-{dimension}")
38
+ if reset is not None:
39
+ try:
40
+ if (
41
+ len(reset) > 64
42
+ or datetime.fromisoformat(reset.replace("Z", "+00:00")).tzinfo is None
43
+ ):
44
+ reset = None
45
+ except ValueError:
46
+ reset = None
47
+ if limit is not None or remaining is not None or reset is not None or burst is not None:
48
+ result.append(RateLimitSnapshot(dimension, limit, remaining, reset, burst))
49
+ return tuple(result)
50
+
51
+
52
+ @dataclass(slots=True)
53
+ class ResponseMetadata:
54
+ """Caller-owned metadata for one request; safe for concurrent transports.
55
+
56
+ Pass a distinct instance per concurrent request. Metadata is replaced on
57
+ each response, so a later response without rate headers cannot reuse old
58
+ capacity. JSON/result wire contracts remain unchanged.
59
+ """
60
+
61
+ rate_limits: tuple[RateLimitSnapshot, ...] = ()
62
+
63
+ def capture(self, headers: Mapping[str, str]) -> None:
64
+ self.rate_limits = parse_rate_limits(headers)
@@ -13,6 +13,8 @@ from dataclasses import dataclass
13
13
  from enum import StrEnum
14
14
  from typing import Any
15
15
 
16
+ from synth_ai.core.contracts.rate_limits import RateLimitSnapshot
17
+
16
18
  HTTP_ERROR_BODY_CAPTURE_CHARS_MAX = 8192
17
19
  _DISPLAY_MESSAGE_CHARS_MAX = 4096
18
20
  _DISPLAY_BODY_CHARS_MAX = 4096
@@ -94,6 +96,7 @@ class SynthFailure:
94
96
  # Server-declared sub-cause of ``code`` (for example ``daily_spend_cap``
95
97
  # inside ``index_rate_limited``). Stable vocabulary owned by the backend.
96
98
  reason: str | None = None
99
+ rate_limits: tuple[RateLimitSnapshot, ...] = ()
97
100
 
98
101
 
99
102
  class SynthError(Exception):
@@ -138,6 +141,11 @@ class SynthError(Exception):
138
141
  """Server-declared sub-cause of the error code, when one was sent."""
139
142
  return self.failure.reason if self.failure is not None else None
140
143
 
144
+ @property
145
+ def rate_limits(self) -> tuple[RateLimitSnapshot, ...]:
146
+ """Recognized rate-capacity metadata from this failed response."""
147
+ return self.failure.rate_limits if self.failure is not None else ()
148
+
141
149
  @property
142
150
  def resource(self) -> ResourceRef | None:
143
151
  """Resource the failed operation already created or addressed, if named."""
@@ -187,6 +195,12 @@ class HTTPError(SynthError):
187
195
  if self.body_snippet:
188
196
  body = _safe_error_display(self.body_snippet, limit=_DISPLAY_BODY_CHARS_MAX)
189
197
  base += f" | body_excerpt={body}"
198
+ if self.rate_limits:
199
+ limits = "; ".join(
200
+ f"{item.dimension} remaining={item.remaining} limit={item.limit}"
201
+ for item in self.rate_limits
202
+ )
203
+ base += f" | rate_limits={limits}"
190
204
  return base
191
205
 
192
206
 
@@ -1,5 +1,6 @@
1
1
  """Shared sync and async HTTP operation substrate."""
2
2
 
3
+ from synth_ai.core.contracts.rate_limits import RateLimitSnapshot, ResponseMetadata
3
4
  from synth_ai.core.http.async_transport import AsyncHttpTransport
4
5
  from synth_ai.core.http.request import HttpMethod, HttpRequest, OperationId, OperationMetadata
5
6
  from synth_ai.core.http.retry import RetryPolicy
@@ -14,6 +15,8 @@ __all__ = [
14
15
  "OperationId",
15
16
  "OperationMetadata",
16
17
  "RetryPolicy",
18
+ "RateLimitSnapshot",
19
+ "ResponseMetadata",
17
20
  "SseEvent",
18
21
  "iter_sse_events",
19
22
  ]
@@ -14,6 +14,7 @@ from typing import Any, cast
14
14
  import httpx
15
15
 
16
16
  from synth_ai.core.contracts.json_value import JsonObject, JsonValue
17
+ from synth_ai.core.contracts.rate_limits import ResponseMetadata
17
18
  from synth_ai.core.http.request import HttpRequest
18
19
  from synth_ai.core.http.retry import (
19
20
  RetryPolicy,
@@ -70,7 +71,10 @@ class AsyncHttpTransport:
70
71
  allow_not_found: bool = False,
71
72
  timeout_seconds: float | None = None,
72
73
  operation_id: str | None = None,
74
+ response_metadata: ResponseMetadata | None = None,
73
75
  ) -> JsonValue:
76
+ if response_metadata is not None:
77
+ response_metadata.rate_limits = ()
74
78
  try:
75
79
  response = await self.client.request(
76
80
  method,
@@ -84,6 +88,8 @@ class AsyncHttpTransport:
84
88
  self.exception_handler(method, path, exc, operation_id)
85
89
  except httpx.TransportError as exc:
86
90
  self.exception_handler(method, path, exc, operation_id)
91
+ if response_metadata is not None:
92
+ response_metadata.capture(response.headers)
87
93
  if allow_not_found and response.status_code == 404:
88
94
  return None
89
95
  if response.is_error:
@@ -16,6 +16,7 @@ from typing import Any, NoReturn, cast
16
16
  import httpx
17
17
 
18
18
  from synth_ai.core.contracts.json_value import JsonObject, JsonValue
19
+ from synth_ai.core.contracts.rate_limits import ResponseMetadata, parse_rate_limits
19
20
  from synth_ai.core.errors import (
20
21
  HTTP_ERROR_BODY_CAPTURE_CHARS_MAX,
21
22
  RUNTIME_UNAVAILABLE_CODES,
@@ -203,6 +204,7 @@ def _failure_from_response(
203
204
  detail=message,
204
205
  resource=_created_search(response, sources),
205
206
  reason=reason,
207
+ rate_limits=parse_rate_limits(response.headers),
206
208
  )
207
209
 
208
210
 
@@ -463,7 +465,10 @@ class HttpTransport:
463
465
  allow_not_found: bool = False,
464
466
  timeout_seconds: float | None = None,
465
467
  operation_id: str | None = None,
468
+ response_metadata: ResponseMetadata | None = None,
466
469
  ) -> JsonValue:
470
+ if response_metadata is not None:
471
+ response_metadata.rate_limits = ()
467
472
  replay_safe = request_permits_replay(method, {**self.headers, **(headers or {})})
468
473
  attempts = 0
469
474
  waited_seconds = 0.0
@@ -502,6 +507,8 @@ class HttpTransport:
502
507
  )
503
508
  self.sleep(delay)
504
509
  waited_seconds += delay
510
+ if response_metadata is not None:
511
+ response_metadata.capture(response.headers)
505
512
  if allow_not_found and response.status_code == 404:
506
513
  return None
507
514
  if response.is_error:
@@ -273,6 +273,7 @@ def _mcp_structured_core_error_payload(exc: SynthError) -> dict[str, Any]:
273
273
  "correlation_id": failure.correlation_id,
274
274
  "retryable": failure.retry.retryable,
275
275
  "retry_after_seconds": failure.retry.retry_after_seconds,
276
+ "rate_limits": [asdict(item) for item in failure.rate_limits],
276
277
  }
277
278
  )
278
279
  if failure.status is not None:
@@ -16,6 +16,7 @@ from hashlib import sha256
16
16
  from typing import Any, Awaitable
17
17
  from uuid import UUID, uuid4
18
18
 
19
+ from synth_ai.core.contracts.rate_limits import ResponseMetadata
19
20
  from synth_ai.core.errors import SynthError
20
21
  from synth_ai.core.http.async_transport import AsyncHttpTransport
21
22
  from synth_ai.core.http.transport import HttpTransport
@@ -318,6 +319,7 @@ class _Call:
318
319
  headers: dict[str, str] | None = None
319
320
  params: dict[str, Any] | None = None
320
321
  raw: bool = False
322
+ response_metadata: ResponseMetadata | None = None
321
323
  # Per-request transport timeout; None keeps the client's default.
322
324
  timeout_seconds: float | None = None
323
325
 
@@ -339,6 +341,8 @@ class _Call:
339
341
  kwargs["json_body"] = self.json_body
340
342
  if self.headers is not None:
341
343
  kwargs["headers"] = self.headers
344
+ if self.response_metadata is not None:
345
+ kwargs["response_metadata"] = self.response_metadata
342
346
  return method, template.format(**(self.path_parameters or {})), kwargs
343
347
 
344
348
 
@@ -683,6 +687,7 @@ class SearchesAPI(_Resource):
683
687
  *,
684
688
  idempotency_key: str | None = None,
685
689
  retry: IndexRetryPolicy = DEFAULT_INDEX_RETRY_POLICY,
690
+ response_metadata: ResponseMetadata | None = None,
686
691
  ) -> Any:
687
692
  """Create one durable Search and return its handle.
688
693
 
@@ -698,6 +703,7 @@ class SearchesAPI(_Resource):
698
703
  Search.model_validate,
699
704
  json_body=_body(spec),
700
705
  headers=_key(idempotency_key),
706
+ response_metadata=response_metadata,
701
707
  )
702
708
  if self._asynchronous:
703
709
 
@@ -3000,6 +3006,7 @@ class _IndexRoot(_Resource):
3000
3006
  limits: SearchExecutionLimits | None = None,
3001
3007
  billing: SearchBillingConstraints | None = None,
3002
3008
  idempotency_key: str | None = None,
3009
+ response_metadata: ResponseMetadata | None = None,
3003
3010
  ) -> Any:
3004
3011
  """Execute fast immediately or create-and-wait for one durable deep Search.
3005
3012
 
@@ -3010,7 +3017,9 @@ class _IndexRoot(_Resource):
3010
3017
  spec = _search_spec(spec, query, scope, filters, max_results, mode, limits, billing)
3011
3018
  if spec.mode == SearchMode.DEEP:
3012
3019
  key = _key(idempotency_key)["Idempotency-Key"]
3013
- handle = self.searches.create(spec, idempotency_key=key)
3020
+ handle = self.searches.create(
3021
+ spec, idempotency_key=key, response_metadata=response_metadata
3022
+ )
3014
3023
  if self._asynchronous:
3015
3024
 
3016
3025
  async def await_deep() -> SearchResult:
@@ -3030,6 +3039,7 @@ class _IndexRoot(_Resource):
3030
3039
  lambda payload: _search_result(payload, spec),
3031
3040
  json_body=spec.model_dump(mode="json"),
3032
3041
  headers=_key(idempotency_key),
3042
+ response_metadata=response_metadata,
3033
3043
  )
3034
3044
  )
3035
3045
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synth-ai
3
- Version: 0.22.2.dev691
3
+ Version: 0.22.2.dev692
4
4
  Summary: Python SDK, CLI and MCP servers for Synth Index search and Swarms
5
5
  Author-email: Synth AI <josh@usesynth.ai>
6
6
  License-Expression: MIT
@@ -39,6 +39,7 @@ synth_ai/core/auth/credentials.py
39
39
  synth_ai/core/contracts/__init__.py
40
40
  synth_ai/core/contracts/json_value.py
41
41
  synth_ai/core/contracts/pagination.py
42
+ synth_ai/core/contracts/rate_limits.py
42
43
  synth_ai/core/http/__init__.py
43
44
  synth_ai/core/http/async_transport.py
44
45
  synth_ai/core/http/request.py