synth-ai 0.20.0.dev628__tar.gz → 0.20.0.dev629__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 (302) hide show
  1. {synth_ai-0.20.0.dev628/synth_ai.egg-info → synth_ai-0.20.0.dev629}/PKG-INFO +1 -1
  2. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/openapi/index-v1.json +4 -118
  3. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/pyproject.toml +2 -1
  4. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/setup.py +1 -2
  5. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/cli/index.py +40 -8
  6. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/README.md +7 -0
  7. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/server.py +20 -5
  8. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/index.py +13 -4
  9. synth_ai-0.20.0.dev629/synth_ai/sdk/index/AGENT_SETUP_PROMPT.md +46 -0
  10. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/README.md +85 -30
  11. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/__init__.py +0 -2
  12. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/catalog.py +2 -2
  13. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/client.py +42 -50
  14. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/public.py +11 -7
  15. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/research_intake.py +19 -26
  16. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/search.py +35 -49
  17. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/transfer.py +6 -10
  18. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/usage_accounting.py +2 -7
  19. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/research_intern.py +12 -0
  20. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/_client_helpers.py +55 -0
  21. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/client.py +2 -54
  22. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629/synth_ai.egg-info}/PKG-INFO +1 -1
  23. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai.egg-info/SOURCES.txt +1 -0
  24. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai.egg-info/entry_points.txt +1 -0
  25. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/LICENSE +0 -0
  26. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/MANIFEST.in +0 -0
  27. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/README.md +0 -0
  28. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/openapi/messaging-v1.json +0 -0
  29. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/openapi/research-v1.json +0 -0
  30. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/setup.cfg +0 -0
  31. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/README.md +0 -0
  32. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/__init__.py +0 -0
  33. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/__main__.py +0 -0
  34. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/cli/AGENTS.md +0 -0
  35. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/cli/README.md +0 -0
  36. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/cli/__init__.py +0 -0
  37. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/cli/__main__.py +0 -0
  38. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/cli/main.py +0 -0
  39. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/cli/research.py +0 -0
  40. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/cli/research_environments.py +0 -0
  41. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/cli/research_image_releases.py +0 -0
  42. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/cli/research_projects.py +0 -0
  43. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/client.py +0 -0
  44. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/README.md +0 -0
  45. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/__init__.py +0 -0
  46. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/auth/__init__.py +0 -0
  47. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/auth/credentials.py +0 -0
  48. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/contracts/__init__.py +0 -0
  49. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/contracts/json_value.py +0 -0
  50. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/contracts/pagination.py +0 -0
  51. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/errors.py +0 -0
  52. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/http/__init__.py +0 -0
  53. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/http/async_transport.py +0 -0
  54. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/http/request.py +0 -0
  55. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/http/retry.py +0 -0
  56. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/http/streaming.py +0 -0
  57. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/http/transport.py +0 -0
  58. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/research/__init__.py +0 -0
  59. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/utils/__init__.py +0 -0
  60. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/utils/env.py +0 -0
  61. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/utils/log_filter.py +0 -0
  62. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/utils/paths.py +0 -0
  63. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/core/utils/urls.py +0 -0
  64. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/__init__.py +0 -0
  65. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/__main__.py +0 -0
  66. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/objective_tools.py +0 -0
  67. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/registry.py +0 -0
  68. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/request_models.py +0 -0
  69. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/__init__.py +0 -0
  70. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/approvals.py +0 -0
  71. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/artifacts.py +0 -0
  72. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/datasets.py +0 -0
  73. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/environments.py +0 -0
  74. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/exports.py +0 -0
  75. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/factories.py +0 -0
  76. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/factory_results.py +0 -0
  77. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/files.py +0 -0
  78. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/image_releases.py +0 -0
  79. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/integrations.py +0 -0
  80. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/intern_program.py +0 -0
  81. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/local_files.py +0 -0
  82. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/logs.py +0 -0
  83. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/models.py +0 -0
  84. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/outputs.py +0 -0
  85. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/policy_schemas.py +0 -0
  86. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/progress.py +0 -0
  87. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/project_data.py +0 -0
  88. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/projects.py +0 -0
  89. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/prs.py +0 -0
  90. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/readiness.py +0 -0
  91. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/repos.py +0 -0
  92. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/research_intern.py +0 -0
  93. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/resources.py +0 -0
  94. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/runs.py +0 -0
  95. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/trained_models.py +0 -0
  96. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/usage.py +0 -0
  97. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/visuals.py +0 -0
  98. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/mcp/research/tools/workspace_inputs.py +0 -0
  99. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/pools.py +0 -0
  100. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/py.typed +0 -0
  101. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/README.md +0 -0
  102. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/__init__.py +0 -0
  103. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/agent_policy.py +0 -0
  104. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/answer.py +0 -0
  105. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/artifacts.py +0 -0
  106. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/contracts.py +0 -0
  107. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/contributions.py +0 -0
  108. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/errors.py +0 -0
  109. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/lifecycle.py +0 -0
  110. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/package.py +0 -0
  111. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/index/submission.py +0 -0
  112. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/messaging/README.md +0 -0
  113. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/messaging/__init__.py +0 -0
  114. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/messaging/client.py +0 -0
  115. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/messaging/contracts.py +0 -0
  116. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/optimizers/__init__.py +0 -0
  117. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/optimizers/client.py +0 -0
  118. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/optimizers/contracts.py +0 -0
  119. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/pagination.py +0 -0
  120. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/__init__.py +0 -0
  121. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/_internal/__init__.py +0 -0
  122. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/_internal/crypto.py +0 -0
  123. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/_internal/env.py +0 -0
  124. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/_internal/urls.py +0 -0
  125. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/account.py +0 -0
  126. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/advanced.py +0 -0
  127. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/advanced_factories.py +0 -0
  128. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/advanced_swarms.py +0 -0
  129. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/artifacts.py +0 -0
  130. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/auth.py +0 -0
  131. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/client.py +0 -0
  132. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/container_pools/__init__.py +0 -0
  133. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/container_pools/api.py +0 -0
  134. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/container_pools/contracts.py +0 -0
  135. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/container_pools/operations.py +0 -0
  136. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/container_pools/packaging.py +0 -0
  137. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/__init__.py +0 -0
  138. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/_activity_wire.py +0 -0
  139. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/_environment_wire.py +0 -0
  140. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/_transcript_wire.py +0 -0
  141. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/_wire.py +0 -0
  142. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/activity.py +0 -0
  143. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/activity_items.py +0 -0
  144. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/actor_images.py +0 -0
  145. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/billing.py +0 -0
  146. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/canonical_usage.py +0 -0
  147. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/checkpoints.py +0 -0
  148. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/cloud_deployment_claims.py +0 -0
  149. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/cloud_deployments.py +0 -0
  150. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/common.py +0 -0
  151. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/dataset_revisions.py +0 -0
  152. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/deliveries.py +0 -0
  153. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/dev_environment_evidence.py +0 -0
  154. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/economics.py +0 -0
  155. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/environment_manifest.py +0 -0
  156. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/environments.py +0 -0
  157. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/evidence.py +0 -0
  158. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/factories.py +0 -0
  159. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/factory_evidence.py +0 -0
  160. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/factory_lenses.py +0 -0
  161. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/factory_operations.py +0 -0
  162. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/factory_role_receipts.py +0 -0
  163. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/failure.py +0 -0
  164. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/image_releases.py +0 -0
  165. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/intern_blockers.py +0 -0
  166. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/intern_grants.py +0 -0
  167. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/intern_program.py +0 -0
  168. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/intern_resources.py +0 -0
  169. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/intern_usage.py +0 -0
  170. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/limit_evidence.py +0 -0
  171. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/local_execution_profile.py +0 -0
  172. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/operator_evidence.py +0 -0
  173. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/project.py +0 -0
  174. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/project_data.py +0 -0
  175. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/project_runtime.py +0 -0
  176. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/project_workspace.py +0 -0
  177. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/project_workspace_evidence.py +0 -0
  178. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/projects.py +0 -0
  179. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/promotions.py +0 -0
  180. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/resource_settlement.py +0 -0
  181. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/run_authority.py +0 -0
  182. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/run_control.py +0 -0
  183. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/run_diagnostics.py +0 -0
  184. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/run_events.py +0 -0
  185. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/run_execution.py +0 -0
  186. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/run_launch.py +0 -0
  187. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/run_observability.py +0 -0
  188. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/run_state.py +0 -0
  189. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/run_timeline.py +0 -0
  190. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/runtime_image.py +0 -0
  191. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/runtime_intent.py +0 -0
  192. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/runtime_stream.py +0 -0
  193. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/runtime_stream_snapshot.py +0 -0
  194. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/scientific_integrity.py +0 -0
  195. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_actor_models.py +0 -0
  196. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_actor_policy_data.py +0 -0
  197. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_agent_harnesses.py +0 -0
  198. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_agent_kinds.py +0 -0
  199. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_agent_models.py +0 -0
  200. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_branching.py +0 -0
  201. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_credential_providers.py +0 -0
  202. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_environment_kinds.py +0 -0
  203. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_evidence_obligations.py +0 -0
  204. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_funding_sources.py +0 -0
  205. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_horizons.py +0 -0
  206. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_host_kinds.py +0 -0
  207. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_inference_providers.py +0 -0
  208. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_network_topology.py +0 -0
  209. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_providers.py +0 -0
  210. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_resource_kinds.py +0 -0
  211. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_roles.py +0 -0
  212. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_run_policy.py +0 -0
  213. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_runbooks.py +0 -0
  214. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_runnable_project.py +0 -0
  215. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_runtime_kinds.py +0 -0
  216. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_tool_providers.py +0 -0
  217. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/smr_work_modes.py +0 -0
  218. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/status.py +0 -0
  219. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/swarm_rollouts.py +0 -0
  220. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/swarms.py +0 -0
  221. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/tag.py +0 -0
  222. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/traces.py +0 -0
  223. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/transcript.py +0 -0
  224. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/types.py +0 -0
  225. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/usage.py +0 -0
  226. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/visuals.py +0 -0
  227. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/wire_models.py +0 -0
  228. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/wire_models_README.md +0 -0
  229. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/work_products.py +0 -0
  230. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/contracts/workspaces.py +0 -0
  231. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/economics.py +0 -0
  232. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/efforts.py +0 -0
  233. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/environments.py +0 -0
  234. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/errors.py +0 -0
  235. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/events.py +0 -0
  236. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/experiments.py +0 -0
  237. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/facade.py +0 -0
  238. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/factories.py +0 -0
  239. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/factory_storage.py +0 -0
  240. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/image_releases.py +0 -0
  241. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/intern_blockers.py +0 -0
  242. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/intern_program.py +0 -0
  243. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/knowledge.py +0 -0
  244. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/models.py +0 -0
  245. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/operations.py +0 -0
  246. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/project_data.py +0 -0
  247. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/project_deliveries.py +0 -0
  248. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/project_workspaces.py +0 -0
  249. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/projects.py +0 -0
  250. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/public.py +0 -0
  251. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/readouts.py +0 -0
  252. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/research_intern.py +0 -0
  253. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/secrets.py +0 -0
  254. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/README.md +0 -0
  255. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/__init__.py +0 -0
  256. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/_base.py +0 -0
  257. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/_run_authority_mixin.py +0 -0
  258. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/approvals.py +0 -0
  259. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/billing.py +0 -0
  260. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/cloud_deployments.py +0 -0
  261. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/config.py +0 -0
  262. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/cost.py +0 -0
  263. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/datasets.py +0 -0
  264. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/dev_environments.py +0 -0
  265. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/environments.py +0 -0
  266. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/exports.py +0 -0
  267. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/factories.py +0 -0
  268. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/factory_evidence.py +0 -0
  269. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/files.py +0 -0
  270. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/github.py +0 -0
  271. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/image_releases.py +0 -0
  272. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/images.py +0 -0
  273. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/logs.py +0 -0
  274. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/models.py +0 -0
  275. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/outputs.py +0 -0
  276. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/progress.py +0 -0
  277. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/project.py +0 -0
  278. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/projects.py +0 -0
  279. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/prs.py +0 -0
  280. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/readiness.py +0 -0
  281. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/repositories.py +0 -0
  282. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/runs.py +0 -0
  283. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/secrets.py +0 -0
  284. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/setup.py +0 -0
  285. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/tag.py +0 -0
  286. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/trained_models.py +0 -0
  287. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/transport.py +0 -0
  288. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/usage.py +0 -0
  289. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/work_products.py +0 -0
  290. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/session/workspace_inputs.py +0 -0
  291. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/surface_parity.py +0 -0
  292. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/swarms.py +0 -0
  293. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/traces.py +0 -0
  294. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/transport/__init__.py +0 -0
  295. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/transport/http.py +0 -0
  296. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/transport/pagination.py +0 -0
  297. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/version.py +0 -0
  298. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/visuals.py +0 -0
  299. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai/sdk/research/wiki.py +0 -0
  300. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai.egg-info/dependency_links.txt +0 -0
  301. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/synth_ai.egg-info/requires.txt +0 -0
  302. {synth_ai-0.20.0.dev628 → synth_ai-0.20.0.dev629}/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.20.0.dev628
3
+ Version: 0.20.0.dev629
4
4
  Summary: Python SDK and CLI for Synth Managed Research and Research Factory
5
5
  Author-email: Synth AI <josh@usesynth.ai>
6
6
  License-Expression: MIT
@@ -650,7 +650,7 @@
650
650
  "properties": {
651
651
  "concurrency_limit": {
652
652
  "default": 1,
653
- "maximum": 32.0,
653
+ "maximum": 50.0,
654
654
  "minimum": 1.0,
655
655
  "title": "Concurrency Limit",
656
656
  "type": "integer"
@@ -3320,80 +3320,6 @@
3320
3320
  "title": "PromoCreditSummary",
3321
3321
  "type": "object"
3322
3322
  },
3323
- "PublicSearchResult": {
3324
- "additionalProperties": false,
3325
- "description": "Anonymous public search: text citing contribution IDs, like every Index search.\n\nSame response rule as the authenticated ``SearchResult`` (inline\n``[<contribution_id>]`` markers equal ``citations`` in first-appearance\norder); no ranked hits, excerpts, titles or URLs.",
3326
- "properties": {
3327
- "amount_cents": {
3328
- "const": 0,
3329
- "default": 0,
3330
- "title": "Amount Cents",
3331
- "type": "integer"
3332
- },
3333
- "citations": {
3334
- "items": {
3335
- "$ref": "#/components/schemas/ContributionReference"
3336
- },
3337
- "maxItems": 10,
3338
- "title": "Citations",
3339
- "type": "array"
3340
- },
3341
- "corpus_generation": {
3342
- "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,127}$",
3343
- "title": "Corpus Generation",
3344
- "type": "string"
3345
- },
3346
- "mode": {
3347
- "const": "fast",
3348
- "default": "fast",
3349
- "title": "Mode",
3350
- "type": "string"
3351
- },
3352
- "parser_version": {
3353
- "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,127}$",
3354
- "title": "Parser Version",
3355
- "type": "string"
3356
- },
3357
- "ranker_version": {
3358
- "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,127}$",
3359
- "title": "Ranker Version",
3360
- "type": "string"
3361
- },
3362
- "request_id": {
3363
- "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,127}$",
3364
- "title": "Request Id",
3365
- "type": "string"
3366
- },
3367
- "response": {
3368
- "maxLength": 16384,
3369
- "minLength": 1,
3370
- "title": "Response",
3371
- "type": "string"
3372
- },
3373
- "status": {
3374
- "const": "completed",
3375
- "default": "completed",
3376
- "title": "Status",
3377
- "type": "string"
3378
- },
3379
- "taxonomy_version": {
3380
- "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,127}$",
3381
- "title": "Taxonomy Version",
3382
- "type": "string"
3383
- }
3384
- },
3385
- "required": [
3386
- "request_id",
3387
- "corpus_generation",
3388
- "ranker_version",
3389
- "parser_version",
3390
- "taxonomy_version",
3391
- "response",
3392
- "citations"
3393
- ],
3394
- "title": "PublicSearchResult",
3395
- "type": "object"
3396
- },
3397
3323
  "PublicUsage": {
3398
3324
  "additionalProperties": false,
3399
3325
  "properties": {
@@ -4805,7 +4731,7 @@
4805
4731
  },
4806
4732
  "SearchExecutionVersions": {
4807
4733
  "additionalProperties": false,
4808
- "description": "Exact implementation identities used by one result.",
4734
+ "description": "Exact implementation identities used by one result.\n\nAn identity the execution did not use is omitted, never ``null``.",
4809
4735
  "properties": {
4810
4736
  "agent_version": {
4811
4737
  "anyOf": [
@@ -5137,6 +5063,7 @@
5137
5063
  "complete",
5138
5064
  "insufficient_evidence",
5139
5065
  "usable_partial",
5066
+ "infrastructure_stopped",
5140
5067
  "no_deliverable",
5141
5068
  "infrastructure_failure",
5142
5069
  "cancelled",
@@ -5320,7 +5247,7 @@
5320
5247
  "type": "null"
5321
5248
  }
5322
5249
  ],
5323
- "default": "synth.index.fast.v1",
5250
+ "default": "synth.index.fast.v2",
5324
5251
  "title": "Price Version"
5325
5252
  },
5326
5253
  "read_calls": {
@@ -8906,47 +8833,6 @@
8906
8833
  ]
8907
8834
  }
8908
8835
  },
8909
- "/api/v1/index/public/search": {
8910
- "post": {
8911
- "operationId": "index.public.search",
8912
- "requestBody": {
8913
- "content": {
8914
- "application/json": {
8915
- "schema": {
8916
- "$ref": "#/components/schemas/SearchSpec-Input"
8917
- }
8918
- }
8919
- },
8920
- "required": true
8921
- },
8922
- "responses": {
8923
- "200": {
8924
- "content": {
8925
- "application/json": {
8926
- "schema": {
8927
- "$ref": "#/components/schemas/PublicSearchResult"
8928
- }
8929
- }
8930
- },
8931
- "description": "Successful Response"
8932
- },
8933
- "422": {
8934
- "content": {
8935
- "application/json": {
8936
- "schema": {
8937
- "$ref": "#/components/schemas/HTTPValidationError"
8938
- }
8939
- }
8940
- },
8941
- "description": "Validation Error"
8942
- }
8943
- },
8944
- "summary": "Search",
8945
- "tags": [
8946
- "index-public"
8947
- ]
8948
- }
8949
- },
8950
8836
  "/api/v1/index/public/tags": {
8951
8837
  "get": {
8952
8838
  "operationId": "index.public.tags.list",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "synth-ai"
3
- version = "0.20.0.dev628"
3
+ version = "0.20.0.dev629"
4
4
  description = "Python SDK and CLI for Synth Managed Research and Research Factory"
5
5
  authors = [{name = "Synth AI", email = "josh@usesynth.ai"}]
6
6
  license = "MIT"
@@ -18,6 +18,7 @@ dependencies = [
18
18
  [project.scripts]
19
19
  synth-ai = "synth_ai.cli:cli"
20
20
  synth-ai-research-mcp = "synth_ai.mcp.research.server:main"
21
+ synth-ai-index-mcp = "synth_ai.mcp.research.server:main_index"
21
22
 
22
23
  [project.optional-dependencies]
23
24
  pools = [
@@ -5,13 +5,12 @@ contract bytes as the reviewed source. Keep openapi/ as the single source and
5
5
  copy only the three public contract snapshots into the wheel, never other JSON.
6
6
  """
7
7
 
8
- from pathlib import Path
9
8
  import shutil
9
+ from pathlib import Path
10
10
 
11
11
  from setuptools import setup
12
12
  from setuptools.command.build_py import build_py
13
13
 
14
-
15
14
  SCHEMAS = ("index-v1.json", "research-v1.json", "messaging-v1.json")
16
15
 
17
16
 
@@ -19,10 +19,10 @@ def index() -> None:
19
19
  @click.option("--max-results", type=click.IntRange(1, 10), default=5, show_default=True)
20
20
  @click.option(
21
21
  "--deadline-seconds",
22
- type=click.IntRange(1, 90),
23
- default=90,
22
+ type=click.IntRange(1, 300),
23
+ default=180,
24
24
  show_default=True,
25
- help="Deep execution ceiling; ignored for fast only by omitting it from the request.",
25
+ help="Durable Deep execution ceiling; omitted from fast requests.",
26
26
  )
27
27
  @click.option(
28
28
  "--private-collection",
@@ -31,6 +31,10 @@ def index() -> None:
31
31
  help="Search only these authorized private collection IDs.",
32
32
  )
33
33
  @click.option("--idempotency-key", help="Stable retry identity for this logical search.")
34
+ @click.option("--allow-wallet", is_flag=True, help="Explicitly allow wallet funding.")
35
+ @click.option(
36
+ "--max-charge-cents", type=click.IntRange(0, 1_000_000), help="Maximum charge in cents."
37
+ )
34
38
  @click.option("--backend-url", envvar="SYNTH_BACKEND_URL", help="Synth backend base URL.")
35
39
  @click.option("--api-key", envvar="SYNTH_API_KEY", help="Authorized Synth API key.")
36
40
  def search(
@@ -40,6 +44,8 @@ def search(
40
44
  deadline_seconds: int,
41
45
  private_collections: tuple[str, ...],
42
46
  idempotency_key: str | None,
47
+ allow_wallet: bool,
48
+ max_charge_cents: int | None,
43
49
  backend_url: str | None,
44
50
  api_key: str | None,
45
51
  ) -> None:
@@ -49,6 +55,7 @@ def search(
49
55
  from synth_ai import SynthClient
50
56
  from synth_ai.core.errors import SynthError
51
57
  from synth_ai.sdk.index.search import (
58
+ SearchBillingConstraints,
52
59
  SearchExecutionCancelledError,
53
60
  SearchExecutionFailedError,
54
61
  SearchExecutionLimits,
@@ -78,6 +85,9 @@ def search(
78
85
  scope=scope,
79
86
  max_results=max_results,
80
87
  limits=limits,
88
+ billing=SearchBillingConstraints(
89
+ allow_wallet=allow_wallet, max_charge_cents=max_charge_cents
90
+ ),
81
91
  idempotency_key=idempotency_key,
82
92
  )
83
93
  except (
@@ -125,6 +135,12 @@ def search(
125
135
  required=True,
126
136
  help="Stable retry identity for retrieval, admission and synthesis.",
127
137
  )
138
+ @click.option("--allow-wallet", is_flag=True, help="Explicitly allow wallet funding for retrieval.")
139
+ @click.option(
140
+ "--max-charge-cents",
141
+ type=click.IntRange(0, 1_000_000),
142
+ help="Maximum retrieval charge in cents.",
143
+ )
128
144
  @click.option("--backend-url", envvar="SYNTH_BACKEND_URL", help="Synth backend base URL.")
129
145
  @click.option("--api-key", envvar="SYNTH_API_KEY", help="Authorized Synth API key.")
130
146
  def answer(
@@ -136,6 +152,8 @@ def answer(
136
152
  deadline_seconds: int,
137
153
  private_collections: tuple[str, ...],
138
154
  idempotency_key: str,
155
+ allow_wallet: bool,
156
+ max_charge_cents: int | None,
139
157
  backend_url: str | None,
140
158
  api_key: str | None,
141
159
  ) -> None:
@@ -145,6 +163,7 @@ def answer(
145
163
  from synth_ai import SynthClient
146
164
  from synth_ai.core.errors import SynthError
147
165
  from synth_ai.sdk.index.search import (
166
+ SearchBillingConstraints,
148
167
  SearchExecutionLimits,
149
168
  SearchMode,
150
169
  SearchScope,
@@ -173,6 +192,9 @@ def answer(
173
192
  limits=limits,
174
193
  max_answer_tokens=max_answer_tokens,
175
194
  max_answer_cost_usd_micros=max_answer_cost_usd_micros,
195
+ billing=SearchBillingConstraints(
196
+ allow_wallet=allow_wallet, max_charge_cents=max_charge_cents
197
+ ),
176
198
  idempotency_key=idempotency_key,
177
199
  )
178
200
  except (ValueError, SynthError, HTTPError) as error:
@@ -192,11 +214,15 @@ def searches() -> None:
192
214
  @click.argument("query")
193
215
  @click.option("--mode", type=click.Choice(("fast", "deep")), default="deep", show_default=True)
194
216
  @click.option("--max-results", type=click.IntRange(1, 10), default=5, show_default=True)
195
- @click.option("--deadline-seconds", type=click.IntRange(1, 90), default=90, show_default=True)
217
+ @click.option("--deadline-seconds", type=click.IntRange(1, 300), default=180, show_default=True)
196
218
  @click.option("--private-collection", "private_collections", multiple=True)
197
219
  @click.option(
198
220
  "--idempotency-key", required=True, help="Reuse this key after an uncertain response."
199
221
  )
222
+ @click.option("--allow-wallet", is_flag=True, help="Explicitly allow wallet funding.")
223
+ @click.option(
224
+ "--max-charge-cents", type=click.IntRange(0, 1_000_000), help="Maximum charge in cents."
225
+ )
200
226
  @click.option("--backend-url", envvar="SYNTH_BACKEND_URL")
201
227
  @click.option("--api-key", envvar="SYNTH_API_KEY")
202
228
  def searches_create(
@@ -206,6 +232,8 @@ def searches_create(
206
232
  deadline_seconds: int,
207
233
  private_collections: tuple[str, ...],
208
234
  idempotency_key: str,
235
+ allow_wallet: bool,
236
+ max_charge_cents: int | None,
209
237
  backend_url: str | None,
210
238
  api_key: str | None,
211
239
  ) -> None:
@@ -215,6 +243,7 @@ def searches_create(
215
243
  from synth_ai import SynthClient
216
244
  from synth_ai.core.errors import SynthError
217
245
  from synth_ai.sdk.index.search import (
246
+ SearchBillingConstraints,
218
247
  SearchContent,
219
248
  SearchExecutionLimits,
220
249
  SearchMode,
@@ -240,6 +269,9 @@ def searches_create(
240
269
  if selected_mode is SearchMode.DEEP
241
270
  else None
242
271
  ),
272
+ billing=SearchBillingConstraints(
273
+ allow_wallet=allow_wallet, max_charge_cents=max_charge_cents
274
+ ),
243
275
  )
244
276
  with SynthClient(api_key=api_key, base_url=backend_url) as client:
245
277
  snapshot = client.index.searches.create(spec, idempotency_key=idempotency_key).snapshot
@@ -376,9 +408,9 @@ def submit(
376
408
  from synth_ai import SynthClient
377
409
  from synth_ai.core.errors import SynthError
378
410
  from synth_ai.sdk.index.research_intake import (
379
- IntakeLocked,
411
+ IntakeLockedError,
380
412
  IntakeStateError,
381
- TerminalRevision,
413
+ TerminalRevisionError,
382
414
  submit_conversion,
383
415
  )
384
416
 
@@ -397,9 +429,9 @@ def submit(
397
429
  TypeError,
398
430
  SynthError,
399
431
  HTTPError,
400
- IntakeLocked,
432
+ IntakeLockedError,
401
433
  IntakeStateError,
402
- TerminalRevision,
434
+ TerminalRevisionError,
403
435
  ) as error:
404
436
  raise click.ClickException(str(error)) from error
405
437
  click.echo(json.dumps(result, indent=2, sort_keys=True))
@@ -47,6 +47,13 @@ becoming callable without a scope.
47
47
 
48
48
  ## What the entrypoint advertises
49
49
 
50
+ `synth-ai-index-mcp` is the Index-only stdio entrypoint. It requires an explicit
51
+ `SYNTH_BACKEND_URL`, advertises no unrelated Research tools, and defaults to
52
+ read-only. Without `SYNTH_API_KEY` it advertises public browse tools only;
53
+ authenticated search and durable-search lifecycle tools require the key.
54
+ `SYNTH_INDEX_MCP_WRITE_ENABLED=true` separately enables Contribution draft,
55
+ upload, and submission tools. Tool discovery performs no backend request.
56
+
50
57
  `synth-ai-research-mcp` advertises the stable subset (64 of 254 tools). The rest
51
58
  are built but hidden, and because `call_tool` resolves against the advertised
52
59
  set they are also uncallable. Set `SYNTH_RESEARCH_MCP_ADVANCED_TOOLS=1` to
@@ -413,15 +413,19 @@ class ResearchMcpServer:
413
413
  include_advanced_tools: bool = False,
414
414
  index_client_factory: IndexClientFactory | None = None,
415
415
  index_write_enabled: bool = True,
416
+ index_only: bool = False,
416
417
  ) -> None:
417
- self._default_api_key = api_key
418
+ self._default_api_key = api_key or None
418
419
  self._default_backend_base = backend_base
419
420
  self._include_advanced_tools = include_advanced_tools
420
421
  self._index_client_factory = index_client_factory
421
422
  self._index_write_enabled = index_write_enabled
423
+ self._index_only = index_only
422
424
  self._tools = build_tool_registry(self._build_tools())
423
425
 
424
426
  def _advertised_tools(self) -> dict[str, ToolDefinition]:
427
+ if self._index_only:
428
+ return {name: tool for name, tool in self._tools.items() if name in INDEX_TOOL_NAMES}
425
429
  if self._include_advanced_tools:
426
430
  return self._tools
427
431
  return {
@@ -484,6 +488,7 @@ class ResearchMcpServer:
484
488
  tool
485
489
  for tool in build_index_tools(
486
490
  self._index_client_factory,
491
+ include_search=self._default_api_key is not None,
487
492
  include_answer=self._default_api_key is not None,
488
493
  include_lifecycle=self._default_api_key is not None,
489
494
  )
@@ -2799,7 +2804,10 @@ class ResearchMcpServer:
2799
2804
  "id": request_id,
2800
2805
  "result": {
2801
2806
  "protocolVersion": DEFAULT_PROTOCOL_VERSION,
2802
- "serverInfo": {"name": SERVER_NAME, "version": __version__},
2807
+ "serverInfo": {
2808
+ "name": "synth-index" if self._index_only else SERVER_NAME,
2809
+ "version": __version__,
2810
+ },
2803
2811
  "capabilities": {"tools": {}},
2804
2812
  },
2805
2813
  }
@@ -2887,7 +2895,7 @@ def _explicit_index_flag(name: str) -> bool:
2887
2895
  return value == "true"
2888
2896
 
2889
2897
 
2890
- def _stdio_server() -> ResearchMcpServer:
2898
+ def _stdio_server(*, index_only: bool = False) -> ResearchMcpServer:
2891
2899
  """Capture explicit Index process config; construct clients only on invocation.
2892
2900
 
2893
2901
  No credential discovery, home files, or network access during MCP discovery.
@@ -2895,7 +2903,7 @@ def _stdio_server() -> ResearchMcpServer:
2895
2903
  """
2896
2904
  from contextlib import contextmanager
2897
2905
 
2898
- enabled = _explicit_index_flag("SYNTH_INDEX_MCP_ENABLED")
2906
+ enabled = index_only or _explicit_index_flag("SYNTH_INDEX_MCP_ENABLED")
2899
2907
  writes = _explicit_index_flag("SYNTH_INDEX_MCP_WRITE_ENABLED")
2900
2908
  if writes and not enabled:
2901
2909
  raise ValueError("Index MCP writes require SYNTH_INDEX_MCP_ENABLED=true")
@@ -2903,7 +2911,7 @@ def _stdio_server() -> ResearchMcpServer:
2903
2911
  api_key = None
2904
2912
  backend_base = None
2905
2913
  if enabled:
2906
- api_key = os.environ.get("SYNTH_API_KEY", "").strip()
2914
+ api_key = os.environ.get("SYNTH_API_KEY", "").strip() or None
2907
2915
  backend_base = os.environ.get("SYNTH_BACKEND_URL", "").strip()
2908
2916
  if not backend_base:
2909
2917
  raise ValueError("Index MCP requires explicit SYNTH_BACKEND_URL")
@@ -2948,6 +2956,7 @@ def _stdio_server() -> ResearchMcpServer:
2948
2956
  include_advanced_tools=_advanced_tools_requested(),
2949
2957
  index_client_factory=factory,
2950
2958
  index_write_enabled=writes,
2959
+ index_only=index_only,
2951
2960
  )
2952
2961
 
2953
2962
 
@@ -2956,6 +2965,11 @@ def main() -> None:
2956
2965
  _stdio_server().serve_stdio()
2957
2966
 
2958
2967
 
2968
+ def main_index() -> None:
2969
+ """Index-only stdio MCP entrypoint; no unrelated Research tools."""
2970
+ _stdio_server(index_only=True).serve_stdio()
2971
+
2972
+
2959
2973
  __all__ = [
2960
2974
  "ADVANCED_TOOLS_ENV",
2961
2975
  "DEFAULT_PROTOCOL_VERSION",
@@ -2964,4 +2978,5 @@ __all__ = [
2964
2978
  "SUPPORTED_PROTOCOL_VERSIONS",
2965
2979
  "_read_message",
2966
2980
  "main",
2981
+ "main_index",
2967
2982
  ]
@@ -57,7 +57,14 @@ _KEY = Field(min_length=1, max_length=128, pattern=r"^[a-zA-Z0-9_.-]+$")
57
57
 
58
58
 
59
59
  class IndexSearchRequest(IndexContract):
60
- search: SearchSpec
60
+ search: SearchSpec = Field(
61
+ description=(
62
+ "Search intent and caller-owned billing bound. Current FAST public and private "
63
+ "searches cost 5 cents; wallet funding needs billing.allow_wallet=true and "
64
+ "billing.max_charge_cents>=5. DEEP needs a mode grant and a ceiling of "
65
+ "at least 10 cents. Never infer funding consent from the query."
66
+ )
67
+ )
61
68
  idempotency_key: str = _KEY
62
69
 
63
70
 
@@ -116,6 +123,7 @@ def read_selected_files(root: str, files: Mapping[str, str]) -> dict[str, bytes]
116
123
  def build_index_tools(
117
124
  client_factory: IndexClientFactory,
118
125
  *,
126
+ include_search: bool = True,
119
127
  include_answer: bool = True,
120
128
  include_lifecycle: bool = True,
121
129
  ) -> list[ToolDefinition]:
@@ -219,14 +227,14 @@ def build_index_tools(
219
227
  tools = [
220
228
  ToolDefinition(
221
229
  name="index_search",
222
- description="Search reviewed Synth Index research Contributions. Public callers can use fast mode; authenticated callers can use durable deep mode. Reuse the same idempotency key when retrying a logical search. Preserve exact revision citations.",
230
+ description="Search reviewed Synth Index Contributions with an authenticated funding identity. Current FAST public and private searches cost 5 cents; wallet funding requires search.billing.allow_wallet=true and max_charge_cents>=5. Do not infer consent. Reuse the same idempotency key for uncertain retries and preserve exact revision citations.",
223
231
  input_schema=IndexSearchRequest.model_json_schema(),
224
232
  handler=search,
225
233
  required_scopes=read,
226
234
  ),
227
235
  ToolDefinition(
228
236
  name="index_search_create",
229
- description="Create one durable fast or deep Search. Return its Search ID and state immediately; reuse the idempotency key after uncertain responses.",
237
+ description="Create one durable FAST or DEEP Search. Current FAST public/private wallet searches need explicit consent and a ceiling of at least 5 cents; DEEP needs a mode grant and at least 10 cents. Return its Search ID and state immediately; reuse the idempotency key after uncertain responses.",
230
238
  input_schema=IndexSearchRequest.model_json_schema(),
231
239
  handler=search_create,
232
240
  required_scopes=read,
@@ -319,6 +327,7 @@ def build_index_tools(
319
327
  return [
320
328
  tool
321
329
  for tool in tools
322
- if (include_answer or tool.name != "index_answer")
330
+ if (include_search or tool.name != "index_search")
331
+ and (include_answer or tool.name != "index_answer")
323
332
  and (include_lifecycle or tool.name not in lifecycle_names)
324
333
  ]
@@ -0,0 +1,46 @@
1
+ # Coding-agent setup prompt for Synth Index
2
+
3
+ Copy the text below into a coding-agent task after you have chosen the Synth
4
+ backend environment and an authorized way to supply its API key. This prompt
5
+ configures an API/MCP integration; it does not ask the agent to build an Index
6
+ product UI or to run a paid search during setup.
7
+
8
+ > Set up Synth Index for this coding project through the `synth-ai` Python SDK
9
+ > and its `synth-ai-index-mcp` stdio server. Index usage is API/MCP-only. Do
10
+ > not add a search page, browser proxy, or customer-facing product workflow.
11
+ >
12
+ > First inspect the project's existing Python environment and coding-agent MCP
13
+ > configuration. Use the supported `synth-ai` package and verify that the
14
+ > `synth-ai-index-mcp` executable is available. Configure one MCP server with
15
+ > `SYNTH_INDEX_MCP_WRITE_ENABLED=false` and an
16
+ > explicit `SYNTH_BACKEND_URL` for the environment I named. Supply
17
+ > `SYNTH_API_KEY` only through this project's already-authorized, non-committed
18
+ > secret-injection mechanism. Never print, commit, paste into chat, or place the
19
+ > key in tool arguments. Do not use macOS Keychain or another credential store
20
+ > without my explicit authorization for that operation. If the backend URL or
21
+ > authorized key source is missing, report exactly what is missing and stop.
22
+ >
23
+ > Verify that the server starts and advertises `index_search` and
24
+ > `index_search_create` with the key. Without a key it may advertise public
25
+ > browse tools, but it must not advertise search or durable-search lifecycle
26
+ > tools. Tool discovery must not execute a search or incur a charge.
27
+ >
28
+ > For a later search I explicitly request, first state the aggregate maximum
29
+ > charge and use a fresh idempotency key. Current public- and private-scope FAST
30
+ > searches are both priced at 5 cents. Wallet funding requires
31
+ > `search.billing.allow_wallet=true` and `max_charge_cents` of at least 5; do
32
+ > not infer my wallet consent from a query. DEEP also needs a mode grant and a
33
+ > ceiling of at least 10 cents. If a response is uncertain, retry the same
34
+ > logical request with the **same** idempotency key, not a new charge attempt.
35
+ > Preserve returned Contribution and revision IDs when reporting evidence.
36
+ > Do not enable Contribution writes unless I separately ask for them.
37
+ >
38
+ > Report the package version, backend environment name (not a secret), MCP
39
+ > server configuration with secret values redacted, advertised Index tool names,
40
+ > and any blocker. Do not claim live search works unless a separately
41
+ > authorized search actually completes and yields a receipt.
42
+
43
+ The server entry point and environment flags are documented in
44
+ [`README.md`](README.md). The typed billing object is
45
+ `SearchBillingConstraints` in [`search.py`](search.py); the backend remains the
46
+ authority for grants, balances, prices, and receipts.