selectools 0.19.2__tar.gz → 0.20.0__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 (231) hide show
  1. {selectools-0.19.2/src/selectools.egg-info → selectools-0.20.0}/PKG-INFO +36 -1
  2. {selectools-0.19.2 → selectools-0.20.0}/README.md +35 -0
  3. {selectools-0.19.2 → selectools-0.20.0}/pyproject.toml +1 -1
  4. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/__init__.py +1 -1
  5. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/agent/config.py +3 -0
  6. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/agent/core.py +2 -0
  7. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/analytics.py +3 -0
  8. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/audit.py +3 -0
  9. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/cache.py +5 -0
  10. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/cancellation.py +2 -0
  11. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/compose.py +2 -0
  12. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/entity_memory.py +3 -0
  13. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/report.py +2 -0
  14. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/suite.py +2 -0
  15. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/types.py +5 -0
  16. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/guardrails/base.py +5 -0
  17. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/guardrails/format.py +3 -0
  18. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/guardrails/length.py +3 -0
  19. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/guardrails/pii.py +3 -0
  20. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/guardrails/pipeline.py +3 -0
  21. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/guardrails/topic.py +3 -0
  22. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/guardrails/toxicity.py +3 -0
  23. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/knowledge.py +7 -0
  24. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/knowledge_graph.py +2 -0
  25. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/memory.py +2 -0
  26. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/observer.py +5 -0
  27. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/orchestration/checkpoint.py +5 -0
  28. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/orchestration/graph.py +2 -0
  29. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/orchestration/state.py +6 -0
  30. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/orchestration/supervisor.py +2 -0
  31. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/patterns/debate.py +2 -0
  32. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/patterns/plan_and_execute.py +2 -0
  33. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/patterns/reflective.py +2 -0
  34. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/patterns/team_lead.py +2 -0
  35. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/pipeline.py +10 -0
  36. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/policy.py +5 -0
  37. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/anthropic_provider.py +2 -0
  38. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/fallback.py +2 -0
  39. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/gemini_provider.py +2 -0
  40. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/ollama_provider.py +2 -0
  41. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/openai_provider.py +2 -0
  42. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/stubs.py +2 -0
  43. selectools-0.20.0/src/selectools/serve/__init__.py +24 -0
  44. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/serve/app.py +84 -3
  45. selectools-0.20.0/src/selectools/serve/builder.py +877 -0
  46. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/serve/cli.py +25 -6
  47. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/sessions.py +5 -0
  48. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/stability.py +24 -0
  49. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/token_estimation.py +5 -0
  50. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/tools/base.py +3 -0
  51. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/tools/decorators.py +2 -0
  52. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/tools/registry.py +2 -0
  53. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/trace.py +6 -0
  54. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/types.py +6 -0
  55. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/usage.py +4 -0
  56. {selectools-0.19.2 → selectools-0.20.0/src/selectools.egg-info}/PKG-INFO +36 -1
  57. {selectools-0.19.2 → selectools-0.20.0}/src/selectools.egg-info/SOURCES.txt +2 -0
  58. selectools-0.20.0/tests/test_visual_builder.py +90 -0
  59. selectools-0.19.2/src/selectools/serve/__init__.py +0 -20
  60. {selectools-0.19.2 → selectools-0.20.0}/LICENSE +0 -0
  61. {selectools-0.19.2 → selectools-0.20.0}/setup.cfg +0 -0
  62. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/agent/__init__.py +0 -0
  63. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/agent/_lifecycle.py +0 -0
  64. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/agent/_memory_manager.py +0 -0
  65. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/agent/_provider_caller.py +0 -0
  66. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/agent/_tool_executor.py +0 -0
  67. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/agent/config_groups.py +0 -0
  68. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/cache_redis.py +0 -0
  69. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/cache_semantic.py +0 -0
  70. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/checkpoint_postgres.py +0 -0
  71. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/coherence.py +0 -0
  72. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/embeddings/__init__.py +0 -0
  73. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/embeddings/anthropic.py +0 -0
  74. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/embeddings/cohere.py +0 -0
  75. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/embeddings/gemini.py +0 -0
  76. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/embeddings/openai.py +0 -0
  77. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/embeddings/provider.py +0 -0
  78. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/env.py +0 -0
  79. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/__init__.py +0 -0
  80. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/__main__.py +0 -0
  81. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/badge.py +0 -0
  82. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/dataset.py +0 -0
  83. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/evaluators.py +0 -0
  84. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/generator.py +0 -0
  85. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/history.py +0 -0
  86. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/html.py +0 -0
  87. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/junit.py +0 -0
  88. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/llm_evaluators.py +0 -0
  89. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/pairwise.py +0 -0
  90. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/regression.py +0 -0
  91. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/serve.py +0 -0
  92. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/snapshot.py +0 -0
  93. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/evals/templates.py +0 -0
  94. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/exceptions.py +0 -0
  95. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/guardrails/__init__.py +0 -0
  96. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/knowledge_store_redis.py +0 -0
  97. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/knowledge_store_supabase.py +0 -0
  98. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/mcp/__init__.py +0 -0
  99. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/mcp/_loop.py +0 -0
  100. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/mcp/bridge.py +0 -0
  101. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/mcp/client.py +0 -0
  102. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/mcp/config.py +0 -0
  103. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/mcp/multi.py +0 -0
  104. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/mcp/server.py +0 -0
  105. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/models.py +0 -0
  106. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/observe/__init__.py +0 -0
  107. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/observe/trace_store.py +0 -0
  108. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/orchestration/__init__.py +0 -0
  109. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/orchestration/node.py +0 -0
  110. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/parser.py +0 -0
  111. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/patterns/__init__.py +0 -0
  112. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/pricing.py +0 -0
  113. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/prompt.py +0 -0
  114. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/__init__.py +0 -0
  115. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/_openai_compat.py +0 -0
  116. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/providers/base.py +0 -0
  117. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/__init__.py +0 -0
  118. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/bm25.py +0 -0
  119. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/chunking.py +0 -0
  120. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/hybrid.py +0 -0
  121. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/loaders.py +0 -0
  122. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/reranker.py +0 -0
  123. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/stores/__init__.py +0 -0
  124. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/stores/chroma.py +0 -0
  125. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/stores/memory.py +0 -0
  126. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/stores/pinecone.py +0 -0
  127. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/stores/sqlite.py +0 -0
  128. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/tools.py +0 -0
  129. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/rag/vector_store.py +0 -0
  130. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/security.py +0 -0
  131. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/serve/models.py +0 -0
  132. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/serve/playground.py +0 -0
  133. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/structured.py +0 -0
  134. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/templates/__init__.py +0 -0
  135. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/templates/code_reviewer.py +0 -0
  136. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/templates/customer_support.py +0 -0
  137. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/templates/data_analyst.py +0 -0
  138. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/templates/rag_chatbot.py +0 -0
  139. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/templates/research_assistant.py +0 -0
  140. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/toolbox/__init__.py +0 -0
  141. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/toolbox/data_tools.py +0 -0
  142. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/toolbox/datetime_tools.py +0 -0
  143. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/toolbox/file_tools.py +0 -0
  144. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/toolbox/memory_tools.py +0 -0
  145. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/toolbox/text_tools.py +0 -0
  146. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/toolbox/web_tools.py +0 -0
  147. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/tools/__init__.py +0 -0
  148. {selectools-0.19.2 → selectools-0.20.0}/src/selectools/tools/loader.py +0 -0
  149. {selectools-0.19.2 → selectools-0.20.0}/src/selectools.egg-info/dependency_links.txt +0 -0
  150. {selectools-0.19.2 → selectools-0.20.0}/src/selectools.egg-info/entry_points.txt +0 -0
  151. {selectools-0.19.2 → selectools-0.20.0}/src/selectools.egg-info/requires.txt +0 -0
  152. {selectools-0.19.2 → selectools-0.20.0}/src/selectools.egg-info/top_level.txt +0 -0
  153. {selectools-0.19.2 → selectools-0.20.0}/tests/test_approval_gate.py +0 -0
  154. {selectools-0.19.2 → selectools-0.20.0}/tests/test_architecture.py +0 -0
  155. {selectools-0.19.2 → selectools-0.20.0}/tests/test_async_observers.py +0 -0
  156. {selectools-0.19.2 → selectools-0.20.0}/tests/test_audit.py +0 -0
  157. {selectools-0.19.2 → selectools-0.20.0}/tests/test_budget.py +0 -0
  158. {selectools-0.19.2 → selectools-0.20.0}/tests/test_bug_hunt_batch1_core.py +0 -0
  159. {selectools-0.19.2 → selectools-0.20.0}/tests/test_bug_hunt_batch1_security.py +0 -0
  160. {selectools-0.19.2 → selectools-0.20.0}/tests/test_bug_hunt_batch1_tools.py +0 -0
  161. {selectools-0.19.2 → selectools-0.20.0}/tests/test_bug_hunt_regression.py +0 -0
  162. {selectools-0.19.2 → selectools-0.20.0}/tests/test_cache.py +0 -0
  163. {selectools-0.19.2 → selectools-0.20.0}/tests/test_cache_redis.py +0 -0
  164. {selectools-0.19.2 → selectools-0.20.0}/tests/test_cancellation.py +0 -0
  165. {selectools-0.19.2 → selectools-0.20.0}/tests/test_coherence.py +0 -0
  166. {selectools-0.19.2 → selectools-0.20.0}/tests/test_concurrency_smoke.py +0 -0
  167. {selectools-0.19.2 → selectools-0.20.0}/tests/test_consolidation_regression.py +0 -0
  168. {selectools-0.19.2 → selectools-0.20.0}/tests/test_conversation_branching.py +0 -0
  169. {selectools-0.19.2 → selectools-0.20.0}/tests/test_entity_memory.py +0 -0
  170. {selectools-0.19.2 → selectools-0.20.0}/tests/test_env.py +0 -0
  171. {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals.py +0 -0
  172. {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals_advanced.py +0 -0
  173. {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals_e2e.py +0 -0
  174. {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals_final.py +0 -0
  175. {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals_hardening.py +0 -0
  176. {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals_new_evaluators.py +0 -0
  177. {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals_release.py +0 -0
  178. {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals_v017_features.py +0 -0
  179. {selectools-0.19.2 → selectools-0.20.0}/tests/test_evals_v0191.py +0 -0
  180. {selectools-0.19.2 → selectools-0.20.0}/tests/test_features_in_graph.py +0 -0
  181. {selectools-0.19.2 → selectools-0.20.0}/tests/test_guardrails.py +0 -0
  182. {selectools-0.19.2 → selectools-0.20.0}/tests/test_hardening.py +0 -0
  183. {selectools-0.19.2 → selectools-0.20.0}/tests/test_knowledge.py +0 -0
  184. {selectools-0.19.2 → selectools-0.20.0}/tests/test_knowledge_graph.py +0 -0
  185. {selectools-0.19.2 → selectools-0.20.0}/tests/test_knowledge_store_redis.py +0 -0
  186. {selectools-0.19.2 → selectools-0.20.0}/tests/test_knowledge_store_supabase.py +0 -0
  187. {selectools-0.19.2 → selectools-0.20.0}/tests/test_knowledge_stores.py +0 -0
  188. {selectools-0.19.2 → selectools-0.20.0}/tests/test_mcp.py +0 -0
  189. {selectools-0.19.2 → selectools-0.20.0}/tests/test_memory.py +0 -0
  190. {selectools-0.19.2 → selectools-0.20.0}/tests/test_memory_async.py +0 -0
  191. {selectools-0.19.2 → selectools-0.20.0}/tests/test_memory_boundary.py +0 -0
  192. {selectools-0.19.2 → selectools-0.20.0}/tests/test_memory_integration.py +0 -0
  193. {selectools-0.19.2 → selectools-0.20.0}/tests/test_model_switching.py +0 -0
  194. {selectools-0.19.2 → selectools-0.20.0}/tests/test_multi_agent_edge_cases.py +0 -0
  195. {selectools-0.19.2 → selectools-0.20.0}/tests/test_orchestration_checkpoint.py +0 -0
  196. {selectools-0.19.2 → selectools-0.20.0}/tests/test_orchestration_e2e.py +0 -0
  197. {selectools-0.19.2 → selectools-0.20.0}/tests/test_orchestration_evals.py +0 -0
  198. {selectools-0.19.2 → selectools-0.20.0}/tests/test_orchestration_graph.py +0 -0
  199. {selectools-0.19.2 → selectools-0.20.0}/tests/test_orchestration_integration.py +0 -0
  200. {selectools-0.19.2 → selectools-0.20.0}/tests/test_orchestration_primitives.py +0 -0
  201. {selectools-0.19.2 → selectools-0.20.0}/tests/test_orchestration_supervisor.py +0 -0
  202. {selectools-0.19.2 → selectools-0.20.0}/tests/test_parser.py +0 -0
  203. {selectools-0.19.2 → selectools-0.20.0}/tests/test_patterns.py +0 -0
  204. {selectools-0.19.2 → selectools-0.20.0}/tests/test_phase1_design_patterns.py +0 -0
  205. {selectools-0.19.2 → selectools-0.20.0}/tests/test_pipeline.py +0 -0
  206. {selectools-0.19.2 → selectools-0.20.0}/tests/test_policy.py +0 -0
  207. {selectools-0.19.2 → selectools-0.20.0}/tests/test_prompt.py +0 -0
  208. {selectools-0.19.2 → selectools-0.20.0}/tests/test_prompt_compression.py +0 -0
  209. {selectools-0.19.2 → selectools-0.20.0}/tests/test_property_based.py +0 -0
  210. {selectools-0.19.2 → selectools-0.20.0}/tests/test_reasoning_strategy.py +0 -0
  211. {selectools-0.19.2 → selectools-0.20.0}/tests/test_routing_mode.py +0 -0
  212. {selectools-0.19.2 → selectools-0.20.0}/tests/test_security.py +0 -0
  213. {selectools-0.19.2 → selectools-0.20.0}/tests/test_semantic_cache.py +0 -0
  214. {selectools-0.19.2 → selectools-0.20.0}/tests/test_sessions.py +0 -0
  215. {selectools-0.19.2 → selectools-0.20.0}/tests/test_sessions_edge_cases.py +0 -0
  216. {selectools-0.19.2 → selectools-0.20.0}/tests/test_sessions_redis.py +0 -0
  217. {selectools-0.19.2 → selectools-0.20.0}/tests/test_simple_observer.py +0 -0
  218. {selectools-0.19.2 → selectools-0.20.0}/tests/test_simulation_evals.py +0 -0
  219. {selectools-0.19.2 → selectools-0.20.0}/tests/test_stability.py +0 -0
  220. {selectools-0.19.2 → selectools-0.20.0}/tests/test_structured.py +0 -0
  221. {selectools-0.19.2 → selectools-0.20.0}/tests/test_structured_config.py +0 -0
  222. {selectools-0.19.2 → selectools-0.20.0}/tests/test_structured_tool_results.py +0 -0
  223. {selectools-0.19.2 → selectools-0.20.0}/tests/test_summarize_on_trim.py +0 -0
  224. {selectools-0.19.2 → selectools-0.20.0}/tests/test_terminal_actions.py +0 -0
  225. {selectools-0.19.2 → selectools-0.20.0}/tests/test_token_estimation.py +0 -0
  226. {selectools-0.19.2 → selectools-0.20.0}/tests/test_tool_caching.py +0 -0
  227. {selectools-0.19.2 → selectools-0.20.0}/tests/test_trace.py +0 -0
  228. {selectools-0.19.2 → selectools-0.20.0}/tests/test_trace_html.py +0 -0
  229. {selectools-0.19.2 → selectools-0.20.0}/tests/test_v016_regression.py +0 -0
  230. {selectools-0.19.2 → selectools-0.20.0}/tests/test_v019_features.py +0 -0
  231. {selectools-0.19.2 → selectools-0.20.0}/tests/test_yaml_config.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: selectools
3
- Version: 0.19.2
3
+ Version: 0.20.0
4
4
  Summary: Production-ready AI agents with tool calling, structured output, execution traces, and RAG. Provider-agnostic (OpenAI, Anthropic, Gemini, Ollama) with fallback chains, batch processing, tool policies, streaming, caching, and cost tracking.
5
5
  Author-email: John Nichev <johnnichev@gmail.com>
6
6
  Maintainer-email: NichevLabs <support@nichevlabs.com>
@@ -84,8 +84,43 @@ result = AgentGraph.chain(planner, writer, reviewer).run("Write a blog post")
84
84
  # selectools serve agent.yaml
85
85
  ```
86
86
 
87
+ ## What's New in v0.20
88
+
89
+ ### v0.20.0 — Visual Agent Builder
90
+
91
+ The first AI agent framework to ship a visual graph builder in a single `pip install`. No React. No build step. No CDN.
92
+
93
+ ```bash
94
+ pip install selectools
95
+ selectools serve --builder
96
+ # → open http://localhost:8000/builder
97
+ ```
98
+
99
+ - Drag START, END, and Agent nodes onto the canvas
100
+ - Click ports to connect agents with edges
101
+ - Add condition labels to edges (e.g. `"approved"`) for conditional routing
102
+ - Edit provider, model, and system prompt in the properties panel
103
+ - Generated Python and YAML update live in the code panel
104
+ - Export or copy to clipboard with one click
105
+
87
106
  ## What's New in v0.19
88
107
 
108
+ ### v0.19.3 — Stability Markers Applied to All Public APIs
109
+
110
+ Every public class and function exported from `selectools` now carries a stability marker:
111
+
112
+ ```python
113
+ from selectools import Agent, AgentGraph, PlanAndExecuteAgent
114
+
115
+ print(Agent.__stability__) # "stable"
116
+ print(AgentGraph.__stability__) # "beta"
117
+ print(PlanAndExecuteAgent.__stability__) # "beta"
118
+ ```
119
+
120
+ **`@stable`** — 60+ core symbols (Agent, AgentConfig, providers, memory, tools, evals, guardrails, sessions, knowledge, cache, cancellation)
121
+
122
+ **`@beta`** — 30+ newer symbols (AgentGraph, SupervisorAgent, Pipeline, @step, parallel, branch, all four patterns, compose)
123
+
89
124
  ### v0.19.2 — Enterprise Hardening
90
125
 
91
126
  ```python
@@ -24,8 +24,43 @@ result = AgentGraph.chain(planner, writer, reviewer).run("Write a blog post")
24
24
  # selectools serve agent.yaml
25
25
  ```
26
26
 
27
+ ## What's New in v0.20
28
+
29
+ ### v0.20.0 — Visual Agent Builder
30
+
31
+ The first AI agent framework to ship a visual graph builder in a single `pip install`. No React. No build step. No CDN.
32
+
33
+ ```bash
34
+ pip install selectools
35
+ selectools serve --builder
36
+ # → open http://localhost:8000/builder
37
+ ```
38
+
39
+ - Drag START, END, and Agent nodes onto the canvas
40
+ - Click ports to connect agents with edges
41
+ - Add condition labels to edges (e.g. `"approved"`) for conditional routing
42
+ - Edit provider, model, and system prompt in the properties panel
43
+ - Generated Python and YAML update live in the code panel
44
+ - Export or copy to clipboard with one click
45
+
27
46
  ## What's New in v0.19
28
47
 
48
+ ### v0.19.3 — Stability Markers Applied to All Public APIs
49
+
50
+ Every public class and function exported from `selectools` now carries a stability marker:
51
+
52
+ ```python
53
+ from selectools import Agent, AgentGraph, PlanAndExecuteAgent
54
+
55
+ print(Agent.__stability__) # "stable"
56
+ print(AgentGraph.__stability__) # "beta"
57
+ print(PlanAndExecuteAgent.__stability__) # "beta"
58
+ ```
59
+
60
+ **`@stable`** — 60+ core symbols (Agent, AgentConfig, providers, memory, tools, evals, guardrails, sessions, knowledge, cache, cancellation)
61
+
62
+ **`@beta`** — 30+ newer symbols (AgentGraph, SupervisorAgent, Pipeline, @step, parallel, branch, all four patterns, compose)
63
+
29
64
  ### v0.19.2 — Enterprise Hardening
30
65
 
31
66
  ```python
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "selectools"
7
- version = "0.19.2"
7
+ version = "0.20.0"
8
8
  description = "Production-ready AI agents with tool calling, structured output, execution traces, and RAG. Provider-agnostic (OpenAI, Anthropic, Gemini, Ollama) with fallback chains, batch processing, tool policies, streaming, caching, and cost tracking."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -1,6 +1,6 @@
1
1
  """Public exports for the selectools package."""
2
2
 
3
- __version__ = "0.19.2"
3
+ __version__ = "0.20.0"
4
4
 
5
5
  # Import submodules (lazy loading for optional dependencies)
6
6
  from . import embeddings, evals, guardrails, models, patterns, rag, toolbox
@@ -7,6 +7,8 @@ from __future__ import annotations
7
7
  from dataclasses import dataclass, field
8
8
  from typing import TYPE_CHECKING, Any, Callable, Coroutine, Dict, List, Optional, Union
9
9
 
10
+ from ..stability import stable
11
+
10
12
  if TYPE_CHECKING:
11
13
  from ..cache import Cache
12
14
  from ..cancellation import CancellationToken
@@ -30,6 +32,7 @@ ConfirmAction = Union[
30
32
  ]
31
33
 
32
34
 
35
+ @stable
33
36
  @dataclass
34
37
  class AgentConfig:
35
38
  """
@@ -18,6 +18,7 @@ from ..parser import ToolCallParser
18
18
  from ..prompt import PromptBuilder
19
19
  from ..providers.base import Provider, ProviderError
20
20
  from ..providers.openai_provider import OpenAIProvider
21
+ from ..stability import stable
21
22
  from ..structured import (
22
23
  ResponseFormat,
23
24
  build_schema_instruction,
@@ -57,6 +58,7 @@ class _RunContext:
57
58
  terminal_tool_result: Optional[str] = None
58
59
 
59
60
 
61
+ @stable
60
62
  class Agent(_ToolExecutorMixin, _ProviderCallerMixin, _LifecycleMixin, _MemoryManagerMixin):
61
63
  """
62
64
  Provider-agnostic AI agent that iteratively calls tools to accomplish tasks.
@@ -10,6 +10,8 @@ from dataclasses import dataclass, field
10
10
  from pathlib import Path
11
11
  from typing import Any, Dict
12
12
 
13
+ from .stability import stable
14
+
13
15
 
14
16
  @dataclass
15
17
  class ToolMetrics:
@@ -81,6 +83,7 @@ class ToolMetrics:
81
83
  }
82
84
 
83
85
 
86
+ @stable
84
87
  class AgentAnalytics:
85
88
  """
86
89
  Analytics tracker for agent tool usage.
@@ -24,10 +24,12 @@ from enum import Enum
24
24
  from typing import Any, Dict, List, Optional
25
25
 
26
26
  from .observer import AgentObserver
27
+ from .stability import stable
27
28
  from .types import AgentResult, Message
28
29
  from .usage import UsageStats
29
30
 
30
31
 
32
+ @stable
31
33
  class PrivacyLevel(str, Enum):
32
34
  """Controls how tool arguments are recorded in audit logs."""
33
35
 
@@ -37,6 +39,7 @@ class PrivacyLevel(str, Enum):
37
39
  NONE = "none"
38
40
 
39
41
 
42
+ @stable
40
43
  class AuditLogger(AgentObserver):
41
44
  """JSONL audit logger that implements the AgentObserver protocol.
42
45
 
@@ -20,12 +20,14 @@ if TYPE_CHECKING:
20
20
  from .tools.base import Tool
21
21
  from .types import Message
22
22
 
23
+ from .stability import stable
23
24
 
24
25
  # ---------------------------------------------------------------------------
25
26
  # CacheStats
26
27
  # ---------------------------------------------------------------------------
27
28
 
28
29
 
30
+ @stable
29
31
  @dataclass
30
32
  class CacheStats:
31
33
  """Tracks cache performance metrics."""
@@ -69,6 +71,7 @@ class _CacheEntry:
69
71
  # ---------------------------------------------------------------------------
70
72
 
71
73
 
74
+ @stable
72
75
  @runtime_checkable
73
76
  class Cache(Protocol):
74
77
  """
@@ -109,6 +112,7 @@ class Cache(Protocol):
109
112
  # ---------------------------------------------------------------------------
110
113
 
111
114
 
115
+ @stable
112
116
  class InMemoryCache:
113
117
  """
114
118
  Thread-safe in-memory LRU cache with per-entry TTL.
@@ -216,6 +220,7 @@ class InMemoryCache:
216
220
  # ---------------------------------------------------------------------------
217
221
 
218
222
 
223
+ @stable
219
224
  class CacheKeyBuilder:
220
225
  """
221
226
  Builds deterministic cache keys from LLM request parameters.
@@ -10,8 +10,10 @@ from __future__ import annotations
10
10
  import threading
11
11
 
12
12
  from .exceptions import CancellationError
13
+ from .stability import stable
13
14
 
14
15
 
16
+ @stable
15
17
  class CancellationToken:
16
18
  """Thread-safe signal for cancelling an agent run.
17
19
 
@@ -23,10 +23,12 @@ from __future__ import annotations
23
23
 
24
24
  from typing import Any, Callable, List, Optional, Sequence
25
25
 
26
+ from .stability import beta
26
27
  from .tools.base import Tool
27
28
  from .tools.decorators import tool as tool_decorator
28
29
 
29
30
 
31
+ @beta
30
32
  def compose(
31
33
  *tools_or_fns: Any,
32
34
  name: Optional[str] = None,
@@ -14,9 +14,11 @@ import time
14
14
  from dataclasses import dataclass, field
15
15
  from typing import Any, Dict, List, Optional
16
16
 
17
+ from .stability import stable
17
18
  from .types import Message, Role
18
19
 
19
20
 
21
+ @stable
20
22
  @dataclass
21
23
  class Entity:
22
24
  """A named entity extracted from conversation.
@@ -69,6 +71,7 @@ _EXTRACTION_PROMPT = (
69
71
  )
70
72
 
71
73
 
74
+ @stable
72
75
  class EntityMemory:
73
76
  """Maintains a registry of entities mentioned in conversation.
74
77
 
@@ -9,9 +9,11 @@ from dataclasses import dataclass, field
9
9
  from pathlib import Path
10
10
  from typing import Any, Dict, List, Optional, Union
11
11
 
12
+ from ..stability import stable
12
13
  from .types import CaseResult, CaseVerdict, EvalMetadata
13
14
 
14
15
 
16
+ @stable
15
17
  @dataclass
16
18
  class EvalReport:
17
19
  """Aggregated evaluation results with statistics."""
@@ -11,11 +11,13 @@ from typing import Any, Callable, Dict, List, Optional
11
11
 
12
12
  from .. import __version__
13
13
  from ..agent import Agent
14
+ from ..stability import stable
14
15
  from .evaluators import DEFAULT_EVALUATORS
15
16
  from .report import EvalReport
16
17
  from .types import CaseResult, CaseVerdict, EvalFailure, EvalMetadata, TestCase
17
18
 
18
19
 
20
+ @stable
19
21
  class EvalSuite:
20
22
  """Evaluate an agent against a list of test cases.
21
23
 
@@ -6,7 +6,10 @@ from dataclasses import dataclass, field
6
6
  from enum import Enum
7
7
  from typing import Any, Callable, Dict, List, Optional
8
8
 
9
+ from selectools.stability import stable
9
10
 
11
+
12
+ @stable
10
13
  class CaseVerdict(str, Enum):
11
14
  """Verdict for a single evaluated test case."""
12
15
 
@@ -16,6 +19,7 @@ class CaseVerdict(str, Enum):
16
19
  SKIP = "skip"
17
20
 
18
21
 
22
+ @stable
19
23
  @dataclass
20
24
  class TestCase:
21
25
  """A single test case for agent evaluation.
@@ -125,6 +129,7 @@ class EvalFailure:
125
129
  message: str
126
130
 
127
131
 
132
+ @stable
128
133
  @dataclass
129
134
  class CaseResult:
130
135
  """Result of evaluating a single TestCase."""
@@ -12,7 +12,10 @@ from dataclasses import dataclass
12
12
  from enum import Enum
13
13
  from typing import Optional
14
14
 
15
+ from selectools.stability import stable
15
16
 
17
+
18
+ @stable
16
19
  class GuardrailAction(str, Enum):
17
20
  """Action to take when a guardrail check fails."""
18
21
 
@@ -21,6 +24,7 @@ class GuardrailAction(str, Enum):
21
24
  WARN = "warn"
22
25
 
23
26
 
27
+ @stable
24
28
  @dataclass
25
29
  class GuardrailResult:
26
30
  """Result of a single guardrail check.
@@ -40,6 +44,7 @@ class GuardrailResult:
40
44
  guardrail_name: Optional[str] = None
41
45
 
42
46
 
47
+ @stable
43
48
  class Guardrail:
44
49
  """Base class for all guardrails.
45
50
 
@@ -10,9 +10,12 @@ from __future__ import annotations
10
10
  import json
11
11
  from typing import List, Optional
12
12
 
13
+ from selectools.stability import stable
14
+
13
15
  from .base import Guardrail, GuardrailAction, GuardrailResult
14
16
 
15
17
 
18
+ @stable
16
19
  class FormatGuardrail(Guardrail):
17
20
  """Validate that content matches expected format constraints.
18
21
 
@@ -9,9 +9,12 @@ from __future__ import annotations
9
9
  import re
10
10
  from typing import Optional
11
11
 
12
+ from selectools.stability import stable
13
+
12
14
  from .base import Guardrail, GuardrailAction, GuardrailResult
13
15
 
14
16
 
17
+ @stable
15
18
  class LengthGuardrail(Guardrail):
16
19
  """Enforce content length constraints.
17
20
 
@@ -11,6 +11,8 @@ import re
11
11
  from dataclasses import dataclass
12
12
  from typing import Dict, List, Optional
13
13
 
14
+ from selectools.stability import stable
15
+
14
16
  from .base import Guardrail, GuardrailAction, GuardrailResult
15
17
 
16
18
  _BUILTIN_PATTERNS: Dict[str, re.Pattern[str]] = {
@@ -34,6 +36,7 @@ class PIIMatch:
34
36
  end: int
35
37
 
36
38
 
39
+ @stable
37
40
  class PIIGuardrail(Guardrail):
38
41
  """Detect (and optionally redact) PII in content.
39
42
 
@@ -12,11 +12,14 @@ import logging
12
12
  from dataclasses import dataclass, field
13
13
  from typing import List, Optional
14
14
 
15
+ from selectools.stability import stable
16
+
15
17
  from .base import Guardrail, GuardrailAction, GuardrailError, GuardrailResult
16
18
 
17
19
  logger = logging.getLogger("selectools.guardrails")
18
20
 
19
21
 
22
+ @stable
20
23
  @dataclass
21
24
  class GuardrailsPipeline:
22
25
  """Ordered pipeline of input and output guardrails.
@@ -11,9 +11,12 @@ import re
11
11
  import unicodedata
12
12
  from typing import List, Optional
13
13
 
14
+ from selectools.stability import stable
15
+
14
16
  from .base import Guardrail, GuardrailAction, GuardrailResult
15
17
 
16
18
 
19
+ @stable
17
20
  class TopicGuardrail(Guardrail):
18
21
  """Reject content that mentions denied topics.
19
22
 
@@ -11,6 +11,8 @@ from __future__ import annotations
11
11
  import re
12
12
  from typing import List, Optional, Set
13
13
 
14
+ from selectools.stability import stable
15
+
14
16
  from .base import Guardrail, GuardrailAction, GuardrailResult
15
17
 
16
18
  _DEFAULT_BLOCKLIST: Set[str] = {
@@ -33,6 +35,7 @@ _DEFAULT_BLOCKLIST: Set[str] = {
33
35
  }
34
36
 
35
37
 
38
+ @stable
36
39
  class ToxicityGuardrail(Guardrail):
37
40
  """Block content that exceeds a toxicity threshold.
38
41
 
@@ -19,11 +19,14 @@ from dataclasses import dataclass, field
19
19
  from datetime import datetime, timedelta, timezone
20
20
  from typing import Any, Dict, List, Optional, Protocol, runtime_checkable
21
21
 
22
+ from .stability import stable
23
+
22
24
  # ======================================================================
23
25
  # KnowledgeEntry — structured entry for the new store-based API
24
26
  # ======================================================================
25
27
 
26
28
 
29
+ @stable
27
30
  @dataclass
28
31
  class KnowledgeEntry:
29
32
  """A single piece of knowledge stored by the agent.
@@ -66,6 +69,7 @@ class KnowledgeEntry:
66
69
  # ======================================================================
67
70
 
68
71
 
72
+ @stable
69
73
  @runtime_checkable
70
74
  class KnowledgeStore(Protocol):
71
75
  """Protocol for knowledge storage backends.
@@ -113,6 +117,7 @@ class KnowledgeStore(Protocol):
113
117
  # ======================================================================
114
118
 
115
119
 
120
+ @stable
116
121
  class FileKnowledgeStore:
117
122
  """File-based knowledge store (backward-compatible with the original KnowledgeMemory).
118
123
 
@@ -279,6 +284,7 @@ class FileKnowledgeStore:
279
284
  # ======================================================================
280
285
 
281
286
 
287
+ @stable
282
288
  class SQLiteKnowledgeStore:
283
289
  """SQLite-backed knowledge store for production single-process use.
284
290
 
@@ -442,6 +448,7 @@ class SQLiteKnowledgeStore:
442
448
  # ======================================================================
443
449
 
444
450
 
451
+ @stable
445
452
  class KnowledgeMemory:
446
453
  """Maintains cross-session knowledge with daily logs and persistent facts.
447
454
 
@@ -14,6 +14,7 @@ import time
14
14
  from dataclasses import dataclass, field
15
15
  from typing import Any, Dict, List, Optional, Protocol, runtime_checkable
16
16
 
17
+ from .stability import stable
17
18
  from .types import Message, Role
18
19
 
19
20
 
@@ -301,6 +302,7 @@ _EXTRACTION_PROMPT = (
301
302
  )
302
303
 
303
304
 
305
+ @stable
304
306
  class KnowledgeGraphMemory:
305
307
  """Maintains a knowledge graph of relationship triples from conversation.
306
308
 
@@ -8,9 +8,11 @@ import copy
8
8
  from dataclasses import replace
9
9
  from typing import Any, Dict, List, Optional
10
10
 
11
+ from .stability import stable
11
12
  from .types import Message, Role
12
13
 
13
14
 
15
+ @stable
14
16
  class ConversationMemory:
15
17
  """
16
18
  Maintains conversation history with configurable limits.
@@ -35,10 +35,12 @@ import logging
35
35
  import time
36
36
  from typing import Any, Callable, Dict, List, Optional
37
37
 
38
+ from .stability import beta, stable
38
39
  from .types import AgentResult, Message
39
40
  from .usage import UsageStats
40
41
 
41
42
 
43
+ @stable
42
44
  class AgentObserver:
43
45
  """Base class for agent lifecycle observers.
44
46
 
@@ -602,6 +604,7 @@ class AgentObserver:
602
604
  # ======================================================================
603
605
 
604
606
 
607
+ @stable
605
608
  class LoggingObserver(AgentObserver):
606
609
  """Observer that writes structured JSON events to Python's logging module.
607
610
 
@@ -1021,6 +1024,7 @@ class LoggingObserver(AgentObserver):
1021
1024
  )
1022
1025
 
1023
1026
 
1027
+ @stable
1024
1028
  class AsyncAgentObserver(AgentObserver):
1025
1029
  """Base class for async agent lifecycle observers.
1026
1030
 
@@ -1420,6 +1424,7 @@ class AsyncAgentObserver(AgentObserver):
1420
1424
  # ======================================================================
1421
1425
 
1422
1426
 
1427
+ @beta
1423
1428
  class SimpleStepObserver(AgentObserver):
1424
1429
  """Observer that routes all lifecycle events to a single callback.
1425
1430
 
@@ -32,6 +32,7 @@ from dataclasses import dataclass
32
32
  from datetime import datetime, timezone
33
33
  from typing import Dict, List, Optional, Protocol, Tuple, runtime_checkable
34
34
 
35
+ from ..stability import beta
35
36
  from .state import GraphState
36
37
 
37
38
 
@@ -56,6 +57,7 @@ class CheckpointMetadata:
56
57
  created_at: datetime
57
58
 
58
59
 
60
+ @beta
59
61
  @runtime_checkable
60
62
  class CheckpointStore(Protocol):
61
63
  """Protocol for checkpoint backends.
@@ -117,6 +119,7 @@ def _deserialize_checkpoint(data: Dict) -> Tuple[GraphState, int]:
117
119
  # ------------------------------------------------------------------
118
120
 
119
121
 
122
+ @beta
120
123
  class InMemoryCheckpointStore:
121
124
  """Thread-safe in-memory checkpoint store.
122
125
 
@@ -172,6 +175,7 @@ class InMemoryCheckpointStore:
172
175
  # ------------------------------------------------------------------
173
176
 
174
177
 
178
+ @beta
175
179
  class FileCheckpointStore:
176
180
  """File-based checkpoint store.
177
181
 
@@ -290,6 +294,7 @@ CREATE INDEX IF NOT EXISTS idx_checkpoints_graph_id ON checkpoints (graph_id);
290
294
  """
291
295
 
292
296
 
297
+ @beta
293
298
  class SQLiteCheckpointStore:
294
299
  """SQLite-backed checkpoint store with WAL mode for concurrent access.
295
300
 
@@ -37,6 +37,7 @@ from typing import (
37
37
  )
38
38
 
39
39
  from ..exceptions import GraphExecutionError
40
+ from ..stability import beta
40
41
  from ..trace import AgentTrace, StepType, TraceStep
41
42
  from ..types import AgentResult, Message, Role
42
43
  from ..usage import UsageStats
@@ -164,6 +165,7 @@ def _merge_usage(base: UsageStats, added: Any) -> UsageStats:
164
165
  )
165
166
 
166
167
 
168
+ @beta
167
169
  class AgentGraph:
168
170
  """Directed graph of agent nodes with routing, parallelism, and HITL support.
169
171
 
@@ -17,10 +17,12 @@ from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Tuple
17
17
  if TYPE_CHECKING:
18
18
  from ..types import AgentResult, Message
19
19
 
20
+ from ..stability import beta
20
21
 
21
22
  STATE_KEY_LAST_OUTPUT: str = "__last_output__"
22
23
 
23
24
 
25
+ @beta
24
26
  class MergePolicy(str, Enum):
25
27
  """Policy for merging parallel branch states.
26
28
 
@@ -34,6 +36,7 @@ class MergePolicy(str, Enum):
34
36
  APPEND = "append"
35
37
 
36
38
 
39
+ @beta
37
40
  class ContextMode(str, Enum):
38
41
  """Controls what conversation history is forwarded to a node's agent.
39
42
 
@@ -51,6 +54,7 @@ class ContextMode(str, Enum):
51
54
  CUSTOM = "custom"
52
55
 
53
56
 
57
+ @beta
54
58
  @dataclass
55
59
  class GraphState:
56
60
  """Shared context passed between nodes in an AgentGraph.
@@ -153,6 +157,7 @@ class GraphState:
153
157
  return cls(messages=[Message(role=Role.USER, content=prompt)])
154
158
 
155
159
 
160
+ @beta
156
161
  @dataclass
157
162
  class InterruptRequest:
158
163
  """Yielded from generator nodes to pause execution for human input.
@@ -173,6 +178,7 @@ class InterruptRequest:
173
178
  interrupt_key: str = ""
174
179
 
175
180
 
181
+ @beta
176
182
  @dataclass
177
183
  class Scatter:
178
184
  """Returned from routing functions to create dynamic parallel branches.
@@ -45,6 +45,7 @@ if TYPE_CHECKING:
45
45
  from ..types import AgentResult
46
46
  from .checkpoint import CheckpointStore
47
47
 
48
+ from ..stability import beta
48
49
  from ..types import Message, Role
49
50
  from ..usage import UsageStats
50
51
  from .graph import AgentGraph, ErrorPolicy, GraphResult, _merge_usage
@@ -168,6 +169,7 @@ def _safe_json_parse(text: str, default: Any = None) -> Any:
168
169
  return default
169
170
 
170
171
 
172
+ @beta
171
173
  class SupervisorAgent:
172
174
  """High-level multi-agent coordinator.
173
175