synth-ai 0.21.2.dev658__tar.gz → 0.21.3.dev660__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 (305) hide show
  1. {synth_ai-0.21.2.dev658/synth_ai.egg-info → synth_ai-0.21.3.dev660}/PKG-INFO +1 -1
  2. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/openapi/research-v1.json +2 -1
  3. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/pyproject.toml +1 -1
  4. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/client.py +83 -13
  5. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/public_search.py +25 -0
  6. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/evidence.py +43 -0
  7. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/intern_blockers.py +40 -0
  8. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/intern_resources.py +59 -1
  9. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/intern_usage.py +72 -1
  10. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/projects.py +2 -0
  11. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/resource_settlement.py +39 -0
  12. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_control.py +10 -0
  13. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_state.py +2 -0
  14. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_run_policy.py +1 -0
  15. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/swarm_rollouts.py +230 -3
  16. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/swarms.py +74 -2
  17. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/transcript.py +43 -0
  18. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/usage.py +1 -0
  19. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/workspaces.py +18 -2
  20. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/intern_blockers.py +125 -6
  21. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/operations.py +0 -6
  22. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/swarms.py +42 -2
  23. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660/synth_ai.egg-info}/PKG-INFO +1 -1
  24. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/LICENSE +0 -0
  25. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/MANIFEST.in +0 -0
  26. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/README.md +0 -0
  27. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/openapi/index-v1.json +0 -0
  28. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/openapi/messaging-v1.json +0 -0
  29. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/setup.cfg +0 -0
  30. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/setup.py +0 -0
  31. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/README.md +0 -0
  32. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/__init__.py +0 -0
  33. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/__main__.py +0 -0
  34. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/AGENTS.md +0 -0
  35. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/README.md +0 -0
  36. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/__init__.py +0 -0
  37. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/__main__.py +0 -0
  38. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/index.py +0 -0
  39. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/main.py +0 -0
  40. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/research.py +0 -0
  41. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/research_environments.py +0 -0
  42. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/research_image_releases.py +0 -0
  43. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/cli/research_projects.py +0 -0
  44. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/README.md +0 -0
  45. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/__init__.py +0 -0
  46. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/auth/__init__.py +0 -0
  47. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/auth/credentials.py +0 -0
  48. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/contracts/__init__.py +0 -0
  49. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/contracts/json_value.py +0 -0
  50. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/contracts/pagination.py +0 -0
  51. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/errors.py +0 -0
  52. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/http/__init__.py +0 -0
  53. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/http/async_transport.py +0 -0
  54. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/http/request.py +0 -0
  55. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/http/retry.py +0 -0
  56. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/http/streaming.py +0 -0
  57. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/http/transport.py +0 -0
  58. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/research/__init__.py +0 -0
  59. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/utils/__init__.py +0 -0
  60. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/utils/env.py +0 -0
  61. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/utils/log_filter.py +0 -0
  62. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/utils/paths.py +0 -0
  63. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/core/utils/urls.py +0 -0
  64. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/README.md +0 -0
  65. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/__init__.py +0 -0
  66. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/__main__.py +0 -0
  67. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/objective_tools.py +0 -0
  68. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/registry.py +0 -0
  69. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/request_models.py +0 -0
  70. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/server.py +0 -0
  71. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/__init__.py +0 -0
  72. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/approvals.py +0 -0
  73. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/artifacts.py +0 -0
  74. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/datasets.py +0 -0
  75. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/environments.py +0 -0
  76. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/exports.py +0 -0
  77. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/factories.py +0 -0
  78. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/factory_results.py +0 -0
  79. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/files.py +0 -0
  80. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/image_releases.py +0 -0
  81. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/index.py +0 -0
  82. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/integrations.py +0 -0
  83. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/intern_program.py +0 -0
  84. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/local_files.py +0 -0
  85. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/logs.py +0 -0
  86. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/models.py +0 -0
  87. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/outputs.py +0 -0
  88. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/policy_schemas.py +0 -0
  89. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/progress.py +0 -0
  90. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/project_data.py +0 -0
  91. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/projects.py +0 -0
  92. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/prs.py +0 -0
  93. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/readiness.py +0 -0
  94. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/repos.py +0 -0
  95. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/research_intern.py +0 -0
  96. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/resources.py +0 -0
  97. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/runs.py +0 -0
  98. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/trained_models.py +0 -0
  99. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/usage.py +0 -0
  100. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/visuals.py +0 -0
  101. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/mcp/research/tools/workspace_inputs.py +0 -0
  102. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/pools.py +0 -0
  103. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/py.typed +0 -0
  104. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/README.md +0 -0
  105. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/__init__.py +0 -0
  106. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/AGENT_SETUP_PROMPT.md +0 -0
  107. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/README.md +0 -0
  108. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/__init__.py +0 -0
  109. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/agent_policy.py +0 -0
  110. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/artifacts.py +0 -0
  111. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/catalog.py +0 -0
  112. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/client.py +0 -0
  113. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/contracts.py +0 -0
  114. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/contributions.py +0 -0
  115. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/errors.py +0 -0
  116. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/lifecycle.py +0 -0
  117. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/package.py +0 -0
  118. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/public.py +0 -0
  119. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/research_intake.py +0 -0
  120. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/retry.py +0 -0
  121. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/search.py +0 -0
  122. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/submission.py +0 -0
  123. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/timeouts.py +0 -0
  124. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/transfer.py +0 -0
  125. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/usage_accounting.py +0 -0
  126. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/index/wallet_search.py +0 -0
  127. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/messaging/README.md +0 -0
  128. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/messaging/__init__.py +0 -0
  129. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/messaging/client.py +0 -0
  130. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/messaging/contracts.py +0 -0
  131. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/optimizers/__init__.py +0 -0
  132. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/optimizers/client.py +0 -0
  133. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/optimizers/contracts.py +0 -0
  134. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/pagination.py +0 -0
  135. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/__init__.py +0 -0
  136. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/_internal/__init__.py +0 -0
  137. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/_internal/crypto.py +0 -0
  138. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/_internal/env.py +0 -0
  139. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/_internal/urls.py +0 -0
  140. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/account.py +0 -0
  141. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/advanced.py +0 -0
  142. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/advanced_factories.py +0 -0
  143. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/advanced_swarms.py +0 -0
  144. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/artifacts.py +0 -0
  145. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/auth.py +0 -0
  146. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/client.py +0 -0
  147. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/container_pools/__init__.py +0 -0
  148. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/container_pools/api.py +0 -0
  149. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/container_pools/contracts.py +0 -0
  150. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/container_pools/operations.py +0 -0
  151. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/container_pools/packaging.py +0 -0
  152. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/__init__.py +0 -0
  153. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/_activity_wire.py +0 -0
  154. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/_environment_wire.py +0 -0
  155. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/_transcript_wire.py +0 -0
  156. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/_wire.py +0 -0
  157. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/activity.py +0 -0
  158. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/activity_items.py +0 -0
  159. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/actor_images.py +0 -0
  160. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/billing.py +0 -0
  161. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/canonical_usage.py +0 -0
  162. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/checkpoints.py +0 -0
  163. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/cloud_deployment_claims.py +0 -0
  164. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/cloud_deployments.py +0 -0
  165. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/common.py +0 -0
  166. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/dataset_revisions.py +0 -0
  167. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/deliveries.py +0 -0
  168. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/dev_environment_evidence.py +0 -0
  169. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/economics.py +0 -0
  170. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/environment_manifest.py +0 -0
  171. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/environments.py +0 -0
  172. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/factories.py +0 -0
  173. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/factory_evidence.py +0 -0
  174. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/factory_lenses.py +0 -0
  175. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/factory_operations.py +0 -0
  176. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/factory_role_receipts.py +0 -0
  177. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/failure.py +0 -0
  178. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/image_releases.py +0 -0
  179. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/intern_grants.py +0 -0
  180. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/intern_program.py +0 -0
  181. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/limit_evidence.py +0 -0
  182. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/local_execution_profile.py +0 -0
  183. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/operator_evidence.py +0 -0
  184. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/project.py +0 -0
  185. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/project_data.py +0 -0
  186. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/project_runtime.py +0 -0
  187. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/project_workspace.py +0 -0
  188. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/project_workspace_evidence.py +0 -0
  189. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/promotions.py +0 -0
  190. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/research_intern.py +0 -0
  191. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_authority.py +0 -0
  192. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_diagnostics.py +0 -0
  193. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_events.py +0 -0
  194. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_execution.py +0 -0
  195. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_launch.py +0 -0
  196. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_observability.py +0 -0
  197. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/run_timeline.py +0 -0
  198. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/runtime_image.py +0 -0
  199. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/runtime_intent.py +0 -0
  200. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/runtime_stream.py +0 -0
  201. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/runtime_stream_snapshot.py +0 -0
  202. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/scientific_integrity.py +0 -0
  203. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_actor_models.py +0 -0
  204. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_actor_policy_data.py +0 -0
  205. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_agent_harnesses.py +0 -0
  206. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_agent_kinds.py +0 -0
  207. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_agent_models.py +0 -0
  208. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_branching.py +0 -0
  209. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_credential_providers.py +0 -0
  210. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_environment_kinds.py +0 -0
  211. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_evidence_obligations.py +0 -0
  212. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_funding_sources.py +0 -0
  213. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_horizons.py +0 -0
  214. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_host_kinds.py +0 -0
  215. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_inference_providers.py +0 -0
  216. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_network_topology.py +0 -0
  217. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_providers.py +0 -0
  218. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_resource_kinds.py +0 -0
  219. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_roles.py +0 -0
  220. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_runbooks.py +0 -0
  221. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_runnable_project.py +0 -0
  222. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_runtime_kinds.py +0 -0
  223. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_tool_providers.py +0 -0
  224. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/smr_work_modes.py +0 -0
  225. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/status.py +0 -0
  226. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/tag.py +0 -0
  227. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/traces.py +0 -0
  228. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/types.py +0 -0
  229. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/visuals.py +0 -0
  230. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/wire_models.py +0 -0
  231. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/wire_models_README.md +0 -0
  232. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/contracts/work_products.py +0 -0
  233. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/economics.py +0 -0
  234. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/efforts.py +0 -0
  235. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/environments.py +0 -0
  236. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/errors.py +0 -0
  237. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/events.py +0 -0
  238. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/experiments.py +0 -0
  239. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/facade.py +0 -0
  240. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/factories.py +0 -0
  241. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/factory_storage.py +0 -0
  242. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/image_releases.py +0 -0
  243. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/intern_program.py +0 -0
  244. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/knowledge.py +0 -0
  245. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/models.py +0 -0
  246. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/project_data.py +0 -0
  247. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/project_deliveries.py +0 -0
  248. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/project_workspaces.py +0 -0
  249. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/projects.py +0 -0
  250. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/public.py +0 -0
  251. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/readouts.py +0 -0
  252. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/research_intern.py +0 -0
  253. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/secrets.py +0 -0
  254. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/README.md +0 -0
  255. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/__init__.py +0 -0
  256. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/_base.py +0 -0
  257. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/_client_helpers.py +0 -0
  258. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/_run_authority_mixin.py +0 -0
  259. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/approvals.py +0 -0
  260. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/billing.py +0 -0
  261. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/client.py +0 -0
  262. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/cloud_deployments.py +0 -0
  263. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/config.py +0 -0
  264. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/cost.py +0 -0
  265. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/datasets.py +0 -0
  266. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/dev_environments.py +0 -0
  267. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/environments.py +0 -0
  268. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/exports.py +0 -0
  269. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/factories.py +0 -0
  270. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/factory_evidence.py +0 -0
  271. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/files.py +0 -0
  272. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/github.py +0 -0
  273. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/image_releases.py +0 -0
  274. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/images.py +0 -0
  275. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/logs.py +0 -0
  276. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/models.py +0 -0
  277. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/outputs.py +0 -0
  278. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/progress.py +0 -0
  279. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/project.py +0 -0
  280. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/projects.py +0 -0
  281. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/prs.py +0 -0
  282. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/readiness.py +0 -0
  283. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/repositories.py +0 -0
  284. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/runs.py +0 -0
  285. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/secrets.py +0 -0
  286. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/setup.py +0 -0
  287. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/tag.py +0 -0
  288. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/trained_models.py +0 -0
  289. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/transport.py +0 -0
  290. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/usage.py +0 -0
  291. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/work_products.py +0 -0
  292. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/session/workspace_inputs.py +0 -0
  293. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/surface_parity.py +0 -0
  294. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/traces.py +0 -0
  295. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/transport/__init__.py +0 -0
  296. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/transport/http.py +0 -0
  297. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/transport/pagination.py +0 -0
  298. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/version.py +0 -0
  299. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/visuals.py +0 -0
  300. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai/sdk/research/wiki.py +0 -0
  301. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai.egg-info/SOURCES.txt +0 -0
  302. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai.egg-info/dependency_links.txt +0 -0
  303. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai.egg-info/entry_points.txt +0 -0
  304. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/synth_ai.egg-info/requires.txt +0 -0
  305. {synth_ai-0.21.2.dev658 → synth_ai-0.21.3.dev660}/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.21.2.dev658
3
+ Version: 0.21.3.dev660
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
@@ -2087,6 +2087,7 @@
2087
2087
  "enterprise",
2088
2088
  "demo_internal",
2089
2089
  "private_alpha",
2090
+ "internal_test",
2090
2091
  "other"
2091
2092
  ],
2092
2093
  "title": "BillingProfileCode",
@@ -23071,7 +23072,7 @@
23071
23072
  "type": "null"
23072
23073
  }
23073
23074
  ],
23074
- "description": "Override one shared agent model for this run. Shared top-level values are 'baseten/moonshotai/Kimi-K3', 'baseten/zai-org/GLM-5.2', 'cursor/composer-2.5', 'deepseek/deepseek-v4-flash', 'deepseek/deepseek-v4-flash-direct', 'deepseek/deepseek-v4-pro', 'deepseek/deepseek-v4-pro-direct', 'gpt-5.4', 'gpt-5.4-mini', 'gpt-5.5', 'gpt-5.6-luna', 'modal/moonshotai/Kimi-K3', 'openrouter/openai/gpt-5.6-luna', 'openrouter/poolside/laguna-s-2.1', 'poolside/laguna-s-2.1', 'synth_internal/laguna-s-2.1-nvfp4', 'x-ai/grok-4.3', 'x-ai/grok-build'. Use actor_model_overrides for actor-specific model selection."
23075
+ "description": "Override one shared agent model for this run. Shared top-level values are 'baseten/moonshotai/Kimi-K3', 'baseten/zai-org/GLM-5.2', 'cursor/composer-2.5', 'deepseek/deepseek-v4-flash', 'deepseek/deepseek-v4-flash-direct', 'deepseek/deepseek-v4-pro', 'deepseek/deepseek-v4-pro-direct', 'gpt-5.4', 'gpt-5.4-mini', 'gpt-5.5', 'gpt-5.6-luna', 'modal/moonshotai/Kimi-K3', 'openrouter/openai/gpt-5.6-luna', 'openrouter/poolside/laguna-s-2.1', 'poolside/laguna-s-2.1', 'synth_internal/laguna-s-2.1-nvfp4'. Use actor_model_overrides for actor-specific model selection."
23075
23076
  },
23076
23077
  "agent_model_params": {
23077
23078
  "anyOf": [
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "synth-ai"
3
- version = "0.21.2.dev658"
3
+ version = "0.21.3.dev660"
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"}]
@@ -29,10 +29,18 @@ def _resolve_base_url(base_url: str | None) -> str:
29
29
 
30
30
 
31
31
  class SynthClient:
32
- """Sync client for Managed Research and hosted optimizers.
32
+ """Synchronous entry point for Index, Research, Messaging and hosted optimizers.
33
33
 
34
- Use ``research`` for hosted projects, swarms, and Factory lifecycles. That
35
- Use ``optimizers`` for hosted training model discovery and saved LoRAs.
34
+ Namespaces and their transports are created lazily. Closing the client closes
35
+ all transports that it opened. Factory APIs remain available for compatibility.
36
+
37
+ Example:
38
+ ```python
39
+ from synth_ai import SynthClient
40
+
41
+ with SynthClient(api_key="YOUR_SYNTH_API_KEY") as client:
42
+ index = client.index
43
+ ```
36
44
  """
37
45
 
38
46
  def __init__(
@@ -42,6 +50,14 @@ class SynthClient:
42
50
  base_url: str | None = None,
43
51
  timeout_seconds: float | None = None,
44
52
  ) -> None:
53
+ """Configure credentials, endpoint and transport timeouts without making requests.
54
+
55
+ Args:
56
+ api_key: Explicit Synth API credential; None uses the configured credential resolver.
57
+ base_url: Backend URL override; None uses the SDK's configured backend base URL.
58
+ timeout_seconds: Transport timeout in seconds. None uses 30 seconds for
59
+ Research, Messaging and Optimizers, and the Index transport default for Index.
60
+ """
45
61
  self.api_key = _resolve_api_key(api_key)
46
62
  self.base_url = _resolve_base_url(base_url)
47
63
  self.timeout_seconds = 30.0 if timeout_seconds is None else timeout_seconds
@@ -56,7 +72,11 @@ class SynthClient:
56
72
 
57
73
  @property
58
74
  def index(self) -> IndexAPI:
59
- """Unreleased fast research search and exact-reference contents namespace."""
75
+ """Return the lazily initialized Index namespace.
76
+
77
+ Returns:
78
+ IndexAPI using this client's credential, backend URL and Index timeout.
79
+ """
60
80
  if self._index_api is None:
61
81
  from synth_ai.core.http.transport import HttpTransport
62
82
  from synth_ai.sdk.index.client import IndexAPI
@@ -71,7 +91,11 @@ class SynthClient:
71
91
 
72
92
  @property
73
93
  def messaging(self) -> MessagingClient:
74
- """Typed threads, history and explicit Workshop device grants."""
94
+ """Return the lazily initialized Messaging namespace.
95
+
96
+ Returns:
97
+ MessagingClient for typed threads, history and explicit Workshop device grants.
98
+ """
75
99
  if self._messaging_client is None:
76
100
  from synth_ai.sdk.messaging import MessagingClient
77
101
 
@@ -84,7 +108,11 @@ class SynthClient:
84
108
 
85
109
  @property
86
110
  def research(self) -> ResearchClient:
87
- """Research hero namespace (projects, swarms, and factories)."""
111
+ """Return the lazily initialized Research namespace.
112
+
113
+ Returns:
114
+ ResearchClient for hosted projects and swarms, with compatibility Factory APIs.
115
+ """
88
116
  if self._research_client is None:
89
117
  from synth_ai.sdk.research.facade import ResearchClient
90
118
 
@@ -113,7 +141,11 @@ class SynthClient:
113
141
 
114
142
  @property
115
143
  def optimizers(self) -> OptimizersClient:
116
- """Hosted training models and searchable saved-LoRA lineage."""
144
+ """Return the lazily initialized hosted Optimizers namespace.
145
+
146
+ Returns:
147
+ OptimizersClient for hosted training model discovery and saved-LoRA lineage.
148
+ """
117
149
  if self._optimizers_client is None:
118
150
  from synth_ai.sdk.optimizers import OptimizersClient
119
151
 
@@ -132,7 +164,17 @@ class SynthClient:
132
164
 
133
165
 
134
166
  class AsyncSynthClient:
135
- """Async client for Managed Research and hosted optimizers."""
167
+ """Asynchronous entry point with lazily initialized SDK namespaces.
168
+
169
+ Example:
170
+ ```python
171
+ from synth_ai import AsyncSynthClient
172
+
173
+ async def inspect_namespace():
174
+ async with AsyncSynthClient(api_key="YOUR_SYNTH_API_KEY") as client:
175
+ index = client.index
176
+ ```
177
+ """
136
178
 
137
179
  def __init__(
138
180
  self,
@@ -141,6 +183,14 @@ class AsyncSynthClient:
141
183
  base_url: str | None = None,
142
184
  timeout_seconds: float | None = None,
143
185
  ) -> None:
186
+ """Configure credentials, endpoint and transport timeouts without making requests.
187
+
188
+ Args:
189
+ api_key: Explicit Synth API credential; None uses the configured credential resolver.
190
+ base_url: Backend URL override; None uses the SDK's configured backend base URL.
191
+ timeout_seconds: Transport timeout in seconds. None uses 30 seconds for
192
+ Research, Messaging and Optimizers, and the Index transport default for Index.
193
+ """
144
194
  self.api_key = _resolve_api_key(api_key)
145
195
  self.base_url = _resolve_base_url(base_url)
146
196
  self.timeout_seconds = 30.0 if timeout_seconds is None else timeout_seconds
@@ -156,7 +206,11 @@ class AsyncSynthClient:
156
206
 
157
207
  @property
158
208
  def index(self) -> AsyncIndexAPI:
159
- """Unreleased asynchronous fast search and exact-reference contents."""
209
+ """Return the lazily initialized asynchronous Index namespace.
210
+
211
+ Returns:
212
+ AsyncIndexAPI using this client's credential, backend URL and Index timeout.
213
+ """
160
214
  if self._index_api is None:
161
215
  from synth_ai.core.http.async_transport import AsyncHttpTransport
162
216
  from synth_ai.sdk.index.client import AsyncIndexAPI
@@ -171,7 +225,11 @@ class AsyncSynthClient:
171
225
 
172
226
  @property
173
227
  def messaging(self) -> AsyncMessagingClient:
174
- """Asynchronous threads, history and explicit Workshop device grants."""
228
+ """Return the lazily initialized asynchronous Messaging namespace.
229
+
230
+ Returns:
231
+ AsyncMessagingClient for threads, history and explicit Workshop device grants.
232
+ """
175
233
  if self._async_messaging_client is None:
176
234
  from synth_ai.sdk.messaging import AsyncMessagingClient
177
235
 
@@ -184,7 +242,11 @@ class AsyncSynthClient:
184
242
 
185
243
  @property
186
244
  def research(self) -> AsyncResearchClient:
187
- """Native asynchronous Research namespace."""
245
+ """Return the lazily initialized asynchronous Research namespace.
246
+
247
+ Returns:
248
+ AsyncResearchClient using this client's credential, backend URL and timeout.
249
+ """
188
250
  if self._async_research_client is None:
189
251
  from synth_ai.sdk.research import AsyncResearchClient
190
252
 
@@ -216,7 +278,11 @@ class AsyncSynthClient:
216
278
 
217
279
  @property
218
280
  def async_research(self) -> AsyncResearchClient:
219
- """Deprecated alias for :attr:`research`."""
281
+ """Deprecated alias for :attr:`research`.
282
+
283
+ Returns:
284
+ The same AsyncResearchClient instance as research, after a deprecation warning.
285
+ """
220
286
  warnings.warn(
221
287
  "AsyncSynthClient.async_research is deprecated; use .research.",
222
288
  DeprecationWarning,
@@ -253,7 +319,11 @@ class AsyncSynthClient:
253
319
 
254
320
  @property
255
321
  def optimizers(self) -> AsyncOptimizersClient:
256
- """Native asynchronous hosted optimizer namespace."""
322
+ """Return the lazily initialized asynchronous hosted Optimizers namespace.
323
+
324
+ Returns:
325
+ AsyncOptimizersClient using this client's credential, backend URL and timeout.
326
+ """
257
327
  if self._async_optimizers_client is None:
258
328
  from synth_ai.sdk.optimizers import AsyncOptimizersClient
259
329
 
@@ -143,6 +143,15 @@ class PublicSearchRateLimitedError(PublicSearchError):
143
143
  failure: SynthFailure | None = None,
144
144
  status: int | None = 429,
145
145
  ) -> None:
146
+ """Preserve the rate-limit scope and server retry guidance.
147
+
148
+ Args:
149
+ message: Human-readable server failure message.
150
+ scope: Server rate-limit scope, or None when the server omits it.
151
+ retry_after_s: Server retry delay in seconds, or None when unavailable.
152
+ failure: Structured Synth failure envelope, when available.
153
+ status: HTTP status associated with the failure; defaults to 429.
154
+ """
146
155
  super().__init__(message, failure=failure, status=status)
147
156
  self.scope = scope
148
157
  self.retry_after_s = retry_after_s
@@ -181,6 +190,15 @@ class PublicSearchBudgetExhaustedError(PublicSearchUnavailableError):
181
190
  failure: SynthFailure | None = None,
182
191
  status: int | None = 503,
183
192
  ) -> None:
193
+ """Preserve the exhausted budget scope and server retry guidance.
194
+
195
+ Args:
196
+ message: Human-readable server failure message.
197
+ scope: Known exhausted budget scope, or None when the server omits it.
198
+ retry_after_s: Server retry delay in seconds, or None when unavailable.
199
+ failure: Structured Synth failure envelope, when available.
200
+ status: HTTP status associated with the failure; defaults to 503.
201
+ """
184
202
  super().__init__(message, failure=failure, status=status)
185
203
  self.scope = scope
186
204
  self.retry_after_s = retry_after_s
@@ -836,6 +854,13 @@ def public_search_result_payload(result: PublicSearchResult) -> dict[str, Any]:
836
854
 
837
855
  Carries no search token. ``route`` names the anonymous public route so a
838
856
  caller can tell it from a keyed (paid) result without inspecting charges.
857
+
858
+ Args:
859
+ result: Delivered public search envelope to project into JSON-compatible values.
860
+
861
+ Returns:
862
+ Public route, search identity, status, response, citations and charge metadata,
863
+ excluding the per-search credential.
839
864
  """
840
865
  return {
841
866
  "route": "public",
@@ -281,6 +281,7 @@ class EvidenceFreshness:
281
281
  run_is_terminal: bool
282
282
  # Backend SmrSwarmEvidenceFreshnessResponse.tool_call_count (default 0);
283
283
  # older backends omit it, so it is accepted but not required.
284
+ #: Non-negative recorded tool-call count; defaults to zero for older backend responses.
284
285
  tool_call_count: int = 0
285
286
 
286
287
  @classmethod
@@ -312,6 +313,7 @@ class EvidenceFreshness:
312
313
 
313
314
 
314
315
  class SwarmToolCallStatus(StrEnum):
316
+ """Durable MCP invocation outcomes, including unresolved tool names."""
315
317
  SUCCEEDED = "succeeded"
316
318
  FAILED = "failed"
317
319
  UNKNOWN_TOOL = "unknown_tool"
@@ -341,23 +343,58 @@ class SwarmToolCallEvidence:
341
343
 
342
344
  Mirrors backend ``SmrSwarmToolCallEvidenceResponse``; arguments are only a
343
345
  digest, never the values.
346
+
347
+ ```python
348
+ from synth_ai.sdk.research.contracts.evidence import SwarmToolCallEvidence
349
+
350
+ from datetime import datetime, timezone
351
+ from synth_ai.sdk.research.contracts.evidence import SwarmToolCallStatus
352
+
353
+ call = SwarmToolCallEvidence(
354
+ tool_call_id="call-1", actor_role="worker", tool_name="search",
355
+ arguments_digest="sha256:" + "0" * 64,
356
+ status=SwarmToolCallStatus.SUCCEEDED, retryable=False,
357
+ duration_ms=10, occurred_at=datetime.now(timezone.utc),
358
+ )
359
+ assert SwarmToolCallEvidence.from_wire(call.to_wire()) == call
360
+ ```
344
361
  """
345
362
 
363
+ #: Identity of the durable MCP invocation outcome.
346
364
  tool_call_id: str
365
+ #: Role of the invoking actor.
347
366
  actor_role: str
367
+ #: Invoked MCP tool name.
348
368
  tool_name: str
369
+ #: Digest of invocation arguments; raw argument values are not included.
349
370
  arguments_digest: str
371
+ #: Recorded invocation outcome.
350
372
  status: SwarmToolCallStatus
373
+ #: Backend indication that the failed invocation can be retried.
351
374
  retryable: bool
375
+ #: Non-negative invocation duration in milliseconds.
352
376
  duration_ms: int
377
+ #: Timestamp of the invocation outcome.
353
378
  occurred_at: datetime
379
+ #: Stable identity of the invoking actor, when recorded.
354
380
  stable_actor_key: str | None = None
381
+ #: Invocation correlation key, when recorded.
355
382
  correlation_id: str | None = None
383
+ #: MCP bundle containing the tool, when recorded.
356
384
  bundle_name: str | None = None
385
+ #: Backend failure code, when recorded.
357
386
  error_code: str | None = None
358
387
 
359
388
  @classmethod
360
389
  def from_wire(cls, value: JsonValue) -> SwarmToolCallEvidence:
390
+ """Parse the backend wire representation of SwarmToolCallEvidence.
391
+
392
+ Args:
393
+ value: Backend response object to validate and convert.
394
+
395
+ Returns:
396
+ The parsed SwarmToolCallEvidence with backend values preserved.
397
+ """
361
398
  payload = _exact_object(
362
399
  value, label="retrieve_swarm_evidence.tool_calls", fields=_TOOL_CALL_FIELDS
363
400
  )
@@ -377,6 +414,11 @@ class SwarmToolCallEvidence:
377
414
  )
378
415
 
379
416
  def to_wire(self) -> JsonObject:
417
+ """Serialize this contract to its backend JSON representation.
418
+
419
+ Returns:
420
+ A new JSON object using backend field names and enum values.
421
+ """
380
422
  return {
381
423
  "tool_call_id": self.tool_call_id,
382
424
  "stable_actor_key": self.stable_actor_key,
@@ -400,6 +442,7 @@ class SwarmEvidence:
400
442
  artifacts: tuple[EvidenceArtifact, ...]
401
443
  work_products: tuple[EvidenceWorkProduct, ...]
402
444
  freshness: EvidenceFreshness
445
+ #: Durable run-scoped MCP invocation outcomes containing argument digests, never argument values.
403
446
  tool_calls: tuple[SwarmToolCallEvidence, ...] = ()
404
447
 
405
448
  def __post_init__(self) -> None:
@@ -19,54 +19,90 @@ class _Contract(BaseModel):
19
19
 
20
20
 
21
21
  class InternBlockerOpenSyncRequest(_Contract):
22
+ """Idempotent request to open an operator handoff without resolving the blocker."""
23
+ #: Caller retry key for opening this handoff; 1–512 characters.
22
24
  idempotency_key: str = Field(min_length=1, max_length=512)
23
25
 
24
26
 
25
27
  class InternBlockerHandoffContext(_Contract):
28
+ """Versioned snapshot of the blocked Async action for operator intervention."""
29
+ #: Version discriminator for the async-blocker handoff context.
26
30
  schema_version: Literal["smr.intern-async-blocker-handoff-context.v1"] = (
27
31
  "smr.intern-async-blocker-handoff-context.v1"
28
32
  )
33
+ #: Blocked action whose context is being handed off.
29
34
  blocker_id: str
35
+ #: Async assignment that owns the blocked action.
30
36
  async_assignment_id: str
37
+ #: Runtime binding carried into the operator handoff.
31
38
  binding: InternRuntimeBinding
39
+ #: Schema version of the blocked action.
32
40
  action_schema_version: str
41
+ #: Kind of action requiring operator intervention.
33
42
  action_kind: str
43
+ #: 64-character lowercase SHA-256 hex digest of the action.
34
44
  action_digest: str = Field(pattern=r"^[0-9a-f]{64}$")
45
+ #: Operator-facing description of the blocked action; at most 2,000 characters.
35
46
  summary: str = Field(min_length=1, max_length=2000)
47
+ #: Reason for the handoff; at most 4,000 characters.
36
48
  rationale: str = Field(min_length=1, max_length=4000)
49
+ #: Preauthorization rule associated with the blocked action.
37
50
  preauthorization_rule: str
51
+ #: Produced-resource references supporting the handoff.
38
52
  evidence_resources: tuple[InternProducedResourceReference, ...] = ()
53
+ #: Capability required of the operator handling this action.
39
54
  required_operator_capability: str
40
55
 
41
56
 
42
57
  class InternBlockerHandoffReceipt(_Contract):
58
+ """Durable evidence tying an Async blocker to its operator Sync session."""
59
+ #: Version discriminator for the durable handoff receipt.
43
60
  schema_version: Literal["smr.intern-async-blocker-handoff-receipt.v1"] = (
44
61
  "smr.intern-async-blocker-handoff-receipt.v1"
45
62
  )
63
+ #: Identity of the durable handoff receipt.
46
64
  handoff_receipt_id: str
65
+ #: Blocker associated with this receipt.
47
66
  blocker_id: str
67
+ #: Organization that owns the handoff.
48
68
  org_id: str
69
+ #: Sync session opened for operator intervention.
49
70
  sync_session_id: str
71
+ #: User recorded as opening the handoff.
50
72
  opened_by_user_id: str
73
+ #: Retry key used to open this handoff.
51
74
  idempotency_key: str
75
+ #: Snapshot of the blocked action and its runtime binding.
52
76
  context: InternBlockerHandoffContext
77
+ #: 64-character lowercase SHA-256 hex digest of the context.
53
78
  context_digest: str = Field(pattern=r"^[0-9a-f]{64}$")
79
+ #: Backend timestamp when the handoff receipt was created.
54
80
  created_at: datetime
55
81
 
56
82
 
57
83
  class InternBlockerOpenSyncResponse(_Contract):
84
+ """Opened operator handoff, its Sync session, and durable context receipt."""
85
+ #: Version discriminator for the open-sync response.
58
86
  schema_version: Literal["smr.intern-async-blocker-open-sync.v1"] = (
59
87
  "smr.intern-async-blocker-open-sync.v1"
60
88
  )
89
+ #: Blocker after the handoff was opened; opening alone does not resolve it.
61
90
  blocker: InternAsyncBlocker
91
+ #: Sync session available for the operator handoff.
62
92
  sync_session: InternSyncSession
93
+ #: Durable receipt tying the blocker, context, and Sync session together.
63
94
  handoff_receipt: InternBlockerHandoffReceipt
64
95
 
65
96
 
66
97
  class InternBlockerResolveRequest(_Contract):
98
+ """Explicit blocker disposition with optional supporting receipts."""
99
+ #: Caller retry key for this resolution; 1–512 characters.
67
100
  idempotency_key: str = Field(min_length=1, max_length=512)
101
+ #: Explicit completed, denied, or superseded disposition.
68
102
  outcome: Literal["completed", "denied", "superseded"]
103
+ #: Optional operator explanation; at most 4,000 characters.
69
104
  comment: str | None = Field(default=None, max_length=4000)
105
+ #: Up to 128 unique, non-blank supporting receipt IDs, each at most 512 characters.
70
106
  supporting_receipt_ids: tuple[str, ...] = Field(default=(), max_length=128)
71
107
 
72
108
  @model_validator(mode="after")
@@ -79,8 +115,12 @@ class InternBlockerResolveRequest(_Contract):
79
115
 
80
116
 
81
117
  class InternBlockerResolveResponse(_Contract):
118
+ """Resolved blocker and durable continuation-command receipt."""
119
+ #: Version discriminator for the resolution response.
82
120
  schema_version: Literal["smr.intern-async-blocker-resolution.v1"] = (
83
121
  "smr.intern-async-blocker-resolution.v1"
84
122
  )
123
+ #: Blocker carrying the durable resolution receipt.
85
124
  blocker: InternAsyncBlocker
125
+ #: Durable command receipt for continuation of the owning Async assignment.
86
126
  continuation_command: InternAsyncCommandReceipt
@@ -22,14 +22,23 @@ InternRuntimeClosureKind = Literal[
22
22
 
23
23
 
24
24
  class InternResourceDisposition(BaseModel):
25
+ """Ownership relation and recorded cleanup disposition for one registered resource."""
25
26
  model_config = ConfigDict(extra="forbid", frozen=True)
27
+ #: Registered resource type.
26
28
  resource_kind: str
29
+ #: Identity of the registered resource.
27
30
  resource_id: str
31
+ #: Run responsible for cleanup, when known.
28
32
  cleanup_owner_run_id: str | None = None
33
+ #: Ownership relation to this runtime: self, owned, borrowed, shared, or retained.
29
34
  relation: Literal["self", "owned", "borrowed", "shared", "retained"]
35
+ #: Recorded cleanup disposition; unknown and pending do not mean settled.
30
36
  disposition: InternResourceDispositionValue
37
+ #: Backend explanation for the recorded disposition.
31
38
  reason: str
39
+ #: Cleanup owner label, when recorded.
32
40
  cleanup_owner: str | None = None
41
+ #: Non-negative admission epoch associated with the resource, when known.
33
42
  epoch: int | None = Field(default=None, ge=0)
34
43
 
35
44
 
@@ -37,9 +46,12 @@ class InternResourceStopEffect(BaseModel):
37
46
  """An effect actually performed when a runtime epoch closed."""
38
47
 
39
48
  model_config = ConfigDict(extra="forbid", frozen=True)
49
+ #: Resource type affected by runtime closure.
40
50
  resource_kind: str
51
+ #: Identity of the resource affected by closure.
41
52
  resource_id: str
42
53
  # Close-time effects, then the real outcome of each internal run stop.
54
+ #: Recorded closure effect or actual internal-run stop outcome.
43
55
  effect: Literal[
44
56
  "stop_requested",
45
57
  "already_settled",
@@ -50,7 +62,9 @@ class InternResourceStopEffect(BaseModel):
50
62
  "stop_accepted",
51
63
  "stop_failed",
52
64
  ]
65
+ #: Owner recorded for this effect, when available.
53
66
  owner: str | None = None
67
+ #: Backend explanation of the closure effect.
54
68
  reason: str
55
69
 
56
70
 
@@ -58,32 +72,76 @@ class InternRuntimeResourceEpoch(BaseModel):
58
72
  """One admission epoch; closed epochs remain enumerated for recovery."""
59
73
 
60
74
  model_config = ConfigDict(extra="forbid", frozen=True)
75
+ #: Non-negative admission epoch number.
61
76
  epoch: int = Field(ge=0)
77
+ #: Whether the epoch accepts new resources.
62
78
  admission: Literal["open", "closed"]
79
+ #: Reason admission closed; absent while no closure is recorded.
63
80
  closure_kind: InternRuntimeClosureKind | None = None
81
+ #: Timestamp when the admission epoch opened.
64
82
  opened_at: datetime
83
+ #: Timestamp when admission closed, if recorded.
65
84
  closed_at: datetime | None = None
85
+ #: Effects recorded when this epoch closed, including internal-run stop outcomes.
66
86
  effects: list[InternResourceStopEffect] = Field(default_factory=list)
67
87
  # Null while the backend re-drive pass is still converging this epoch.
88
+ #: Cleanup settlement timestamp; null while backend recovery is still converging.
68
89
  cleanup_settled_at: datetime | None = None
69
90
 
70
91
 
71
92
  class InternResourceInventory(BaseModel):
93
+ """Runtime resource observation; creator coverage and cleanup completeness are separate.
94
+
95
+ ```python
96
+ from synth_ai.sdk.research.contracts.intern_resources import InternResourceInventory
97
+
98
+ inventory = InternResourceInventory.from_wire({
99
+ "runtime_kind": "sync", "runtime_id": "session-1",
100
+ "observed_at": "2026-09-29T12:00:00+00:00",
101
+ "coverage": "registered-runtime-resources-v1",
102
+ "coverage_complete": False, "resources": [],
103
+ })
104
+ assert not inventory.disposition_complete
105
+ ```
106
+ """
107
+
72
108
  model_config = ConfigDict(extra="forbid", frozen=True)
109
+ #: Sync session or Async assignment inventory kind.
73
110
  runtime_kind: Literal["sync", "async"]
111
+ #: Identity of the session or assignment whose resources were observed.
74
112
  runtime_id: str
113
+ #: Backend timestamp of this inventory observation.
75
114
  observed_at: datetime
115
+ #: Inventory contract discriminator: registered-runtime-resources-v1.
76
116
  coverage: Literal["registered-runtime-resources-v1"]
117
+ #: Whether creator coverage is complete; separate from resource cleanup.
77
118
  coverage_complete: StrictBool
119
+ #: Backend reasons creator coverage is incomplete.
78
120
  incomplete_reasons: list[str] = Field(default_factory=list)
121
+ #: Registered resources and their individual dispositions.
79
122
  resources: list[InternResourceDisposition]
123
+ #: Recorded creator-set identifier, when available.
80
124
  creator_set: str | None = None
125
+ #: Inventory profile recorded by the backend, when available.
81
126
  profile: str | None = None
127
+ #: Whether cleanup is complete; cannot be true with incomplete creator coverage.
82
128
  disposition_complete: StrictBool = False
129
+ #: Admission epochs retained for recovery, including closed epochs.
83
130
  epochs: list[InternRuntimeResourceEpoch] = Field(default_factory=list)
84
131
 
85
132
  @classmethod
86
- def from_wire(cls, value):
133
+ def from_wire(cls, value: object) -> "InternResourceInventory":
134
+ """Parse the backend wire representation of InternResourceInventory.
135
+
136
+ Args:
137
+ value: Backend response object to validate and convert.
138
+
139
+ Returns:
140
+ The parsed InternResourceInventory with backend values preserved.
141
+
142
+ Raises:
143
+ ValueError: Cleanup is reported complete despite incomplete creator coverage.
144
+ """
87
145
  inventory = cls.model_validate(value)
88
146
  # A complete cleanup can never rest on incomplete creator coverage.
89
147
  if inventory.disposition_complete and not inventory.coverage_complete: