selectools 0.29.0__tar.gz → 1.0.1__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 (323) hide show
  1. {selectools-0.29.0/src/selectools.egg-info → selectools-1.0.1}/PKG-INFO +29 -12
  2. {selectools-0.29.0 → selectools-1.0.1}/README.md +26 -8
  3. {selectools-0.29.0 → selectools-1.0.1}/pyproject.toml +7 -7
  4. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/__init__.py +1 -1
  5. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/_async_utils.py +7 -30
  6. selectools-1.0.1/src/selectools/_time.py +42 -0
  7. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/_lifecycle.py +1 -1
  8. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/_memory_manager.py +0 -1
  9. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/_provider_caller.py +1 -1
  10. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/_tool_executor.py +3 -3
  11. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/config.py +1 -1
  12. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/config_groups.py +1 -4
  13. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/core.py +2 -2
  14. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/audit.py +0 -1
  15. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/cache.py +1 -1
  16. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/cache_semantic.py +2 -2
  17. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/checkpoint_postgres.py +3 -5
  18. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/compose.py +1 -2
  19. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/evaluators.py +1 -1
  20. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/history.py +1 -1
  21. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/pairwise.py +2 -6
  22. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/serve.py +1 -5
  23. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/templates.py +1 -2
  24. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/pipeline.py +1 -1
  25. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/topic.py +1 -1
  26. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/knowledge.py +8 -8
  27. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/knowledge_graph.py +1 -1
  28. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/knowledge_store_redis.py +3 -2
  29. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/knowledge_store_supabase.py +3 -2
  30. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/loop_detection.py +1 -1
  31. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/mcp/bridge.py +1 -1
  32. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/mcp/client.py +1 -2
  33. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/mcp/config.py +1 -1
  34. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/mcp/multi.py +1 -1
  35. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/mcp/server.py +1 -2
  36. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/observe/langfuse.py +1 -1
  37. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/observe/otel.py +1 -1
  38. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/observe/trace_store.py +5 -7
  39. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/observer.py +1 -1
  40. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/orchestration/checkpoint.py +5 -4
  41. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/orchestration/graph.py +4 -7
  42. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/orchestration/node.py +1 -3
  43. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/orchestration/state.py +3 -3
  44. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/orchestration/supervisor.py +3 -7
  45. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/patterns/debate.py +2 -3
  46. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/patterns/plan_and_execute.py +2 -3
  47. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/patterns/reflective.py +2 -3
  48. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/patterns/team_lead.py +2 -3
  49. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/_openai_compat.py +1 -1
  50. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/anthropic_provider.py +0 -1
  51. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/azure_openai_provider.py +1 -1
  52. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/base.py +1 -1
  53. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/fallback.py +1 -3
  54. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/ollama_provider.py +1 -2
  55. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/bm25.py +0 -6
  56. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/chunking.py +2 -2
  57. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/hybrid.py +2 -18
  58. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/loaders.py +1 -1
  59. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/stores/faiss.py +3 -3
  60. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/stores/memory.py +0 -1
  61. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/stores/pgvector.py +1 -1
  62. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/stores/pinecone.py +5 -2
  63. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/stores/qdrant.py +2 -4
  64. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/stores/sqlite.py +1 -1
  65. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/scheduler.py +1 -1
  66. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/app.py +1 -3
  67. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/cli.py +1 -1
  68. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/models.py +0 -25
  69. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/sessions.py +2 -6
  70. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/stability.py +2 -2
  71. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/datetime_tools.py +0 -1
  72. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/tools/base.py +0 -1
  73. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/trace.py +1 -1
  74. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/unified_memory.py +2 -3
  75. {selectools-0.29.0 → selectools-1.0.1/src/selectools.egg-info}/PKG-INFO +29 -12
  76. {selectools-0.29.0 → selectools-1.0.1}/src/selectools.egg-info/SOURCES.txt +2 -0
  77. {selectools-0.29.0 → selectools-1.0.1}/tests/test_orchestration_integration.py +4 -1
  78. selectools-1.0.1/tests/test_time.py +66 -0
  79. {selectools-0.29.0 → selectools-1.0.1}/LICENSE +0 -0
  80. {selectools-0.29.0 → selectools-1.0.1}/setup.cfg +0 -0
  81. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/_json_utils.py +0 -0
  82. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/_ssrf.py +0 -0
  83. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/a2a/__init__.py +0 -0
  84. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/a2a/client.py +0 -0
  85. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/a2a/server.py +0 -0
  86. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/a2a/types.py +0 -0
  87. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/__init__.py +0 -0
  88. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/agent/_planning.py +0 -0
  89. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/analytics.py +0 -0
  90. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/cache_redis.py +0 -0
  91. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/cancellation.py +0 -0
  92. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/coherence.py +0 -0
  93. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/embeddings/__init__.py +0 -0
  94. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/embeddings/anthropic.py +0 -0
  95. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/embeddings/cohere.py +0 -0
  96. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/embeddings/gemini.py +0 -0
  97. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/embeddings/openai.py +0 -0
  98. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/embeddings/provider.py +0 -0
  99. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/entity_memory.py +0 -0
  100. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/env.py +0 -0
  101. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/__init__.py +0 -0
  102. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/__main__.py +0 -0
  103. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/badge.py +0 -0
  104. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/dataset.py +0 -0
  105. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/generator.py +0 -0
  106. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/html.py +0 -0
  107. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/junit.py +0 -0
  108. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/llm_evaluators.py +0 -0
  109. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/regression.py +0 -0
  110. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/report.py +0 -0
  111. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/snapshot.py +0 -0
  112. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/suite.py +0 -0
  113. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/evals/types.py +0 -0
  114. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/exceptions.py +0 -0
  115. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/__init__.py +0 -0
  116. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/base.py +0 -0
  117. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/format.py +0 -0
  118. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/injection.py +0 -0
  119. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/length.py +0 -0
  120. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/pii.py +0 -0
  121. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/guardrails/toxicity.py +0 -0
  122. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/knowledge_backends.py +0 -0
  123. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/knowledge_sanitizers.py +0 -0
  124. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/mcp/__init__.py +0 -0
  125. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/mcp/_loop.py +0 -0
  126. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/memory.py +0 -0
  127. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/models.py +0 -0
  128. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/observe/__init__.py +0 -0
  129. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/orchestration/__init__.py +0 -0
  130. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/parser.py +0 -0
  131. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/patterns/__init__.py +0 -0
  132. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/pending.py +0 -0
  133. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/pipeline.py +0 -0
  134. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/policy.py +0 -0
  135. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/pricing.py +0 -0
  136. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/prompt.py +0 -0
  137. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/__init__.py +0 -0
  138. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/gemini_provider.py +0 -0
  139. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/litellm_provider.py +0 -0
  140. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/openai_provider.py +0 -0
  141. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/router.py +0 -0
  142. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/providers/stubs.py +0 -0
  143. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/__init__.py +0 -0
  144. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/reranker.py +0 -0
  145. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/stores/__init__.py +0 -0
  146. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/stores/chroma.py +0 -0
  147. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/tools.py +0 -0
  148. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/rag/vector_store.py +0 -0
  149. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/results.py +0 -0
  150. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/security.py +0 -0
  151. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/__init__.py +0 -0
  152. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/_starlette_app.py +0 -0
  153. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/_static/builder.css +0 -0
  154. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/_static/builder.html +0 -0
  155. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/_static/builder.js +0 -0
  156. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/api.py +0 -0
  157. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/builder.py +0 -0
  158. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/serve/playground.py +0 -0
  159. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/structured.py +0 -0
  160. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/templates/__init__.py +0 -0
  161. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/templates/code_reviewer.py +0 -0
  162. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/templates/customer_support.py +0 -0
  163. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/templates/data_analyst.py +0 -0
  164. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/templates/rag_chatbot.py +0 -0
  165. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/templates/research_assistant.py +0 -0
  166. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/token_estimation.py +0 -0
  167. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/__init__.py +0 -0
  168. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/browser_tools.py +0 -0
  169. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/calculator_tools.py +0 -0
  170. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/code_tools.py +0 -0
  171. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/data_tools.py +0 -0
  172. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/db_tools.py +0 -0
  173. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/discord_tools.py +0 -0
  174. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/email_tools.py +0 -0
  175. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/file_tools.py +0 -0
  176. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/github_tools.py +0 -0
  177. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/image_tools.py +0 -0
  178. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/linear_tools.py +0 -0
  179. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/memory_tools.py +0 -0
  180. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/notion_tools.py +0 -0
  181. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/pdf_tools.py +0 -0
  182. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/reasoning_tools.py +0 -0
  183. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/s3_tools.py +0 -0
  184. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/search_tools.py +0 -0
  185. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/slack_tools.py +0 -0
  186. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/text_tools.py +0 -0
  187. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/toolbox/web_tools.py +0 -0
  188. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/tools/__init__.py +0 -0
  189. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/tools/decorators.py +0 -0
  190. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/tools/loader.py +0 -0
  191. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/tools/registry.py +0 -0
  192. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/types.py +0 -0
  193. {selectools-0.29.0 → selectools-1.0.1}/src/selectools/usage.py +0 -0
  194. {selectools-0.29.0 → selectools-1.0.1}/src/selectools.egg-info/dependency_links.txt +0 -0
  195. {selectools-0.29.0 → selectools-1.0.1}/src/selectools.egg-info/entry_points.txt +0 -0
  196. {selectools-0.29.0 → selectools-1.0.1}/src/selectools.egg-info/requires.txt +0 -0
  197. {selectools-0.29.0 → selectools-1.0.1}/src/selectools.egg-info/top_level.txt +0 -0
  198. {selectools-0.29.0 → selectools-1.0.1}/tests/test_a2a.py +0 -0
  199. {selectools-0.29.0 → selectools-1.0.1}/tests/test_agent_api.py +0 -0
  200. {selectools-0.29.0 → selectools-1.0.1}/tests/test_agent_hitl.py +0 -0
  201. {selectools-0.29.0 → selectools-1.0.1}/tests/test_approval_gate.py +0 -0
  202. {selectools-0.29.0 → selectools-1.0.1}/tests/test_architecture.py +0 -0
  203. {selectools-0.29.0 → selectools-1.0.1}/tests/test_async_observers.py +0 -0
  204. {selectools-0.29.0 → selectools-1.0.1}/tests/test_audit.py +0 -0
  205. {selectools-0.29.0 → selectools-1.0.1}/tests/test_bake_window_hunt.py +0 -0
  206. {selectools-0.29.0 → selectools-1.0.1}/tests/test_budget.py +0 -0
  207. {selectools-0.29.0 → selectools-1.0.1}/tests/test_bug_hunt_batch1_core.py +0 -0
  208. {selectools-0.29.0 → selectools-1.0.1}/tests/test_bug_hunt_batch1_security.py +0 -0
  209. {selectools-0.29.0 → selectools-1.0.1}/tests/test_bug_hunt_batch1_tools.py +0 -0
  210. {selectools-0.29.0 → selectools-1.0.1}/tests/test_bug_hunt_regression.py +0 -0
  211. {selectools-0.29.0 → selectools-1.0.1}/tests/test_cache.py +0 -0
  212. {selectools-0.29.0 → selectools-1.0.1}/tests/test_cache_redis.py +0 -0
  213. {selectools-0.29.0 → selectools-1.0.1}/tests/test_cancellation.py +0 -0
  214. {selectools-0.29.0 → selectools-1.0.1}/tests/test_checkpoint_postgres.py +0 -0
  215. {selectools-0.29.0 → selectools-1.0.1}/tests/test_coherence.py +0 -0
  216. {selectools-0.29.0 → selectools-1.0.1}/tests/test_concurrency_smoke.py +0 -0
  217. {selectools-0.29.0 → selectools-1.0.1}/tests/test_consolidation_regression.py +0 -0
  218. {selectools-0.29.0 → selectools-1.0.1}/tests/test_conversation_branching.py +0 -0
  219. {selectools-0.29.0 → selectools-1.0.1}/tests/test_coverage_orchestration.py +0 -0
  220. {selectools-0.29.0 → selectools-1.0.1}/tests/test_document_loaders_extended.py +0 -0
  221. {selectools-0.29.0 → selectools-1.0.1}/tests/test_e2e_langfuse_observer.py +0 -0
  222. {selectools-0.29.0 → selectools-1.0.1}/tests/test_e2e_multimodal.py +0 -0
  223. {selectools-0.29.0 → selectools-1.0.1}/tests/test_e2e_otel_observer.py +0 -0
  224. {selectools-0.29.0 → selectools-1.0.1}/tests/test_e2e_v0_21_0_apps.py +0 -0
  225. {selectools-0.29.0 → selectools-1.0.1}/tests/test_e2e_v0_21_0_simulations.py +0 -0
  226. {selectools-0.29.0 → selectools-1.0.1}/tests/test_entity_memory.py +0 -0
  227. {selectools-0.29.0 → selectools-1.0.1}/tests/test_env.py +0 -0
  228. {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals.py +0 -0
  229. {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_advanced.py +0 -0
  230. {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_cli.py +0 -0
  231. {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_e2e.py +0 -0
  232. {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_final.py +0 -0
  233. {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_hardening.py +0 -0
  234. {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_html_report.py +0 -0
  235. {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_new_evaluators.py +0 -0
  236. {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_ralph_bugs.py +0 -0
  237. {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_release.py +0 -0
  238. {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_serve.py +0 -0
  239. {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_v017_features.py +0 -0
  240. {selectools-0.29.0 → selectools-1.0.1}/tests/test_evals_v0191.py +0 -0
  241. {selectools-0.29.0 → selectools-1.0.1}/tests/test_features_in_graph.py +0 -0
  242. {selectools-0.29.0 → selectools-1.0.1}/tests/test_final_coverage_a.py +0 -0
  243. {selectools-0.29.0 → selectools-1.0.1}/tests/test_final_coverage_b.py +0 -0
  244. {selectools-0.29.0 → selectools-1.0.1}/tests/test_guardrails.py +0 -0
  245. {selectools-0.29.0 → selectools-1.0.1}/tests/test_guardrails_injection.py +0 -0
  246. {selectools-0.29.0 → selectools-1.0.1}/tests/test_hardening.py +0 -0
  247. {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge.py +0 -0
  248. {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_backend.py +0 -0
  249. {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_backend_redis.py +0 -0
  250. {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_backend_supabase.py +0 -0
  251. {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_graph.py +0 -0
  252. {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_sanitizers.py +0 -0
  253. {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_store_redis.py +0 -0
  254. {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_store_supabase.py +0 -0
  255. {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_stores.py +0 -0
  256. {selectools-0.29.0 → selectools-1.0.1}/tests/test_knowledge_stores_error_handling.py +0 -0
  257. {selectools-0.29.0 → selectools-1.0.1}/tests/test_langfuse_observer.py +0 -0
  258. {selectools-0.29.0 → selectools-1.0.1}/tests/test_loop_detection.py +0 -0
  259. {selectools-0.29.0 → selectools-1.0.1}/tests/test_mcp.py +0 -0
  260. {selectools-0.29.0 → selectools-1.0.1}/tests/test_mcp_coverage.py +0 -0
  261. {selectools-0.29.0 → selectools-1.0.1}/tests/test_memory.py +0 -0
  262. {selectools-0.29.0 → selectools-1.0.1}/tests/test_memory_async.py +0 -0
  263. {selectools-0.29.0 → selectools-1.0.1}/tests/test_memory_boundary.py +0 -0
  264. {selectools-0.29.0 → selectools-1.0.1}/tests/test_memory_integration.py +0 -0
  265. {selectools-0.29.0 → selectools-1.0.1}/tests/test_model_switching.py +0 -0
  266. {selectools-0.29.0 → selectools-1.0.1}/tests/test_multi_agent_edge_cases.py +0 -0
  267. {selectools-0.29.0 → selectools-1.0.1}/tests/test_multimodal.py +0 -0
  268. {selectools-0.29.0 → selectools-1.0.1}/tests/test_orchestration_checkpoint.py +0 -0
  269. {selectools-0.29.0 → selectools-1.0.1}/tests/test_orchestration_e2e.py +0 -0
  270. {selectools-0.29.0 → selectools-1.0.1}/tests/test_orchestration_evals.py +0 -0
  271. {selectools-0.29.0 → selectools-1.0.1}/tests/test_orchestration_graph.py +0 -0
  272. {selectools-0.29.0 → selectools-1.0.1}/tests/test_orchestration_primitives.py +0 -0
  273. {selectools-0.29.0 → selectools-1.0.1}/tests/test_orchestration_supervisor.py +0 -0
  274. {selectools-0.29.0 → selectools-1.0.1}/tests/test_otel_observer.py +0 -0
  275. {selectools-0.29.0 → selectools-1.0.1}/tests/test_parser.py +0 -0
  276. {selectools-0.29.0 → selectools-1.0.1}/tests/test_patterns.py +0 -0
  277. {selectools-0.29.0 → selectools-1.0.1}/tests/test_pending.py +0 -0
  278. {selectools-0.29.0 → selectools-1.0.1}/tests/test_pending_redis_smoke.py +0 -0
  279. {selectools-0.29.0 → selectools-1.0.1}/tests/test_phase1_design_patterns.py +0 -0
  280. {selectools-0.29.0 → selectools-1.0.1}/tests/test_pipeline.py +0 -0
  281. {selectools-0.29.0 → selectools-1.0.1}/tests/test_pipeline_coverage.py +0 -0
  282. {selectools-0.29.0 → selectools-1.0.1}/tests/test_policy.py +0 -0
  283. {selectools-0.29.0 → selectools-1.0.1}/tests/test_prompt.py +0 -0
  284. {selectools-0.29.0 → selectools-1.0.1}/tests/test_prompt_compression.py +0 -0
  285. {selectools-0.29.0 → selectools-1.0.1}/tests/test_property_based.py +0 -0
  286. {selectools-0.29.0 → selectools-1.0.1}/tests/test_reasoning_strategy.py +0 -0
  287. {selectools-0.29.0 → selectools-1.0.1}/tests/test_remaining_coverage.py +0 -0
  288. {selectools-0.29.0 → selectools-1.0.1}/tests/test_results.py +0 -0
  289. {selectools-0.29.0 → selectools-1.0.1}/tests/test_routing_mode.py +0 -0
  290. {selectools-0.29.0 → selectools-1.0.1}/tests/test_scheduler.py +0 -0
  291. {selectools-0.29.0 → selectools-1.0.1}/tests/test_security.py +0 -0
  292. {selectools-0.29.0 → selectools-1.0.1}/tests/test_semantic_cache.py +0 -0
  293. {selectools-0.29.0 → selectools-1.0.1}/tests/test_serve_app_coverage.py +0 -0
  294. {selectools-0.29.0 → selectools-1.0.1}/tests/test_serve_cli.py +0 -0
  295. {selectools-0.29.0 → selectools-1.0.1}/tests/test_sessions.py +0 -0
  296. {selectools-0.29.0 → selectools-1.0.1}/tests/test_sessions_dynamodb.py +0 -0
  297. {selectools-0.29.0 → selectools-1.0.1}/tests/test_sessions_edge_cases.py +0 -0
  298. {selectools-0.29.0 → selectools-1.0.1}/tests/test_sessions_mongo.py +0 -0
  299. {selectools-0.29.0 → selectools-1.0.1}/tests/test_sessions_redis.py +0 -0
  300. {selectools-0.29.0 → selectools-1.0.1}/tests/test_sessions_supabase.py +0 -0
  301. {selectools-0.29.0 → selectools-1.0.1}/tests/test_simple_observer.py +0 -0
  302. {selectools-0.29.0 → selectools-1.0.1}/tests/test_simulation_evals.py +0 -0
  303. {selectools-0.29.0 → selectools-1.0.1}/tests/test_ssrf.py +0 -0
  304. {selectools-0.29.0 → selectools-1.0.1}/tests/test_stability.py +0 -0
  305. {selectools-0.29.0 → selectools-1.0.1}/tests/test_starlette_app.py +0 -0
  306. {selectools-0.29.0 → selectools-1.0.1}/tests/test_structured.py +0 -0
  307. {selectools-0.29.0 → selectools-1.0.1}/tests/test_structured_config.py +0 -0
  308. {selectools-0.29.0 → selectools-1.0.1}/tests/test_structured_tool_results.py +0 -0
  309. {selectools-0.29.0 → selectools-1.0.1}/tests/test_summarize_on_trim.py +0 -0
  310. {selectools-0.29.0 → selectools-1.0.1}/tests/test_templates_coverage.py +0 -0
  311. {selectools-0.29.0 → selectools-1.0.1}/tests/test_terminal_actions.py +0 -0
  312. {selectools-0.29.0 → selectools-1.0.1}/tests/test_token_estimation.py +0 -0
  313. {selectools-0.29.0 → selectools-1.0.1}/tests/test_tool_caching.py +0 -0
  314. {selectools-0.29.0 → selectools-1.0.1}/tests/test_tool_result_compression.py +0 -0
  315. {selectools-0.29.0 → selectools-1.0.1}/tests/test_trace.py +0 -0
  316. {selectools-0.29.0 → selectools-1.0.1}/tests/test_trace_html.py +0 -0
  317. {selectools-0.29.0 → selectools-1.0.1}/tests/test_trace_store.py +0 -0
  318. {selectools-0.29.0 → selectools-1.0.1}/tests/test_unified_memory.py +0 -0
  319. {selectools-0.29.0 → selectools-1.0.1}/tests/test_unified_memory_config.py +0 -0
  320. {selectools-0.29.0 → selectools-1.0.1}/tests/test_v016_regression.py +0 -0
  321. {selectools-0.29.0 → selectools-1.0.1}/tests/test_v019_features.py +0 -0
  322. {selectools-0.29.0 → selectools-1.0.1}/tests/test_visual_builder.py +0 -0
  323. {selectools-0.29.0 → selectools-1.0.1}/tests/test_yaml_config.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: selectools
3
- Version: 0.29.0
3
+ Version: 1.0.1
4
4
  Summary: Production-ready Python framework for AI agents with multi-agent graphs, hybrid RAG, guardrails, audit logging, 50 evaluators, and a visual builder. Supports OpenAI, Anthropic, Gemini, Ollama. By NichevLabs.
5
5
  Author-email: John Nichev <johnnichev@gmail.com>
6
6
  Maintainer-email: NichevLabs <support@nichevlabs.com>
@@ -14,17 +14,16 @@ Project-URL: Builder, https://selectools.dev/builder/
14
14
  Project-URL: Examples, https://selectools.dev/examples/
15
15
  Project-URL: NichevLabs, https://nichevlabs.com
16
16
  Keywords: llm,ai,agent,agents,multi-agent,agent-framework,tool-calling,openai,anthropic,gemini,ollama,rag,hybrid-search,vector-search,embeddings,guardrails,evals,evaluators,visual-builder,structured-output,observability,fallback,langchain-alternative
17
- Classifier: Development Status :: 4 - Beta
17
+ Classifier: Development Status :: 5 - Production/Stable
18
18
  Classifier: Intended Audience :: Developers
19
19
  Classifier: Programming Language :: Python :: 3
20
- Classifier: Programming Language :: Python :: 3.9
21
20
  Classifier: Programming Language :: Python :: 3.10
22
21
  Classifier: Programming Language :: Python :: 3.11
23
22
  Classifier: Programming Language :: Python :: 3.12
24
23
  Classifier: Programming Language :: Python :: 3.13
25
24
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
26
25
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
27
- Requires-Python: >=3.9
26
+ Requires-Python: >=3.10
28
27
  Description-Content-Type: text/markdown
29
28
  License-File: LICENSE
30
29
  Requires-Dist: openai<2.0.0,>=1.30.0
@@ -104,6 +103,8 @@ An open-source project from **[NichevLabs](https://nichevlabs.com)**.
104
103
 
105
104
  **Multi-agent orchestration in plain Python.** Build agent graphs, compose pipelines with `|`, deploy with one command. No DSL, no compile step, no paid debugger. Works with OpenAI, Anthropic, Gemini, and Ollama.
106
105
 
106
+ > 🎉 **selectools is 1.0 — stable.** The public API is frozen; `@stable` symbols carry a 2-minor compatibility promise. Python 3.10+. See [What's New in v1.0](#whats-new-in-v10).
107
+
107
108
  ### 3 Ways to Build
108
109
 
109
110
  ```python
@@ -118,6 +119,16 @@ result = AgentGraph.chain(planner, writer, reviewer).run("Write a blog post")
118
119
  # selectools serve agent.yaml
119
120
  ```
120
121
 
122
+ ## What's New in v1.0
123
+
124
+ ### v1.0.0 — Stable
125
+
126
+ selectools is **1.0**. The public API is frozen and `@stable` symbols now carry a real compatibility promise — no removal or breaking signature change without a deprecation cycle spanning at least two minor releases. The package is `Development Status :: 5 - Production/Stable`.
127
+
128
+ - **Frozen, marked surface** — every public symbol carries a `@stable`/`@beta` marker (CI-enforced). The stable set covers the agent loop and config, providers, tools and the mature toolbox, sessions, memory, guardrails, orchestration graphs, the pattern agents, the policy layer, and the core types. RAG/embeddings, MCP, A2A, the evaluator catalog, unified memory, the scheduler, and the newest backends stay `@beta` and keep evolving in 1.x.
129
+ - **Python 3.10+** *(breaking)* — Python 3.9 reached end-of-life in October 2025 and is dropped; the minimum is now 3.10 (CI runs 3.10–3.13). Pin `selectools<1.0` to stay on 3.9.
130
+ - Aside from the 3.9 drop, code that ran deprecation-warning-free on the latest 0.x release runs unmodified on 1.0. See `docs/MIGRATION_1.0.md`.
131
+
121
132
  ## What's New in v0.29
122
133
 
123
134
  ### v0.29.0 — Stability Promotions (v1.0 Freeze Prep)
@@ -349,19 +360,25 @@ selectools serve --builder
349
360
 
350
361
  ### v0.19.3 — Stability Markers Applied to All Public APIs
351
362
 
352
- Every public class and function exported from `selectools` now carries a stability marker:
363
+ Every public class and function exported from `selectools` carries a stability
364
+ marker. As of 1.0, `@stable` symbols carry a compatibility promise — no removal
365
+ or breaking signature change without a deprecation cycle of at least two minors:
353
366
 
354
367
  ```python
355
- from selectools import Agent, AgentGraph, PlanAndExecuteAgent
368
+ from selectools import Agent, AgentGraph, AgentScheduler
356
369
 
357
- print(Agent.__stability__) # "stable"
358
- print(AgentGraph.__stability__) # "beta"
359
- print(PlanAndExecuteAgent.__stability__) # "beta"
370
+ print(Agent.__stability__) # "stable"
371
+ print(AgentGraph.__stability__) # "stable" (promoted for 1.0)
372
+ print(AgentScheduler.__stability__) # "beta" (still iterating)
360
373
  ```
361
374
 
362
- **`@stable`** — 60+ core symbols (Agent, AgentConfig, providers, memory, tools, evals, guardrails, sessions, knowledge, cache, cancellation)
375
+ **`@stable`** — the frozen core: Agent, AgentConfig, providers, memory, tools and
376
+ the mature toolbox, sessions, guardrails, orchestration graphs, the pattern
377
+ agents, the policy layer, and the core types.
363
378
 
364
- **`@beta`** — 30+ newer symbols (AgentGraph, SupervisorAgent, Pipeline, @step, parallel, branch, all four patterns, compose)
379
+ **`@beta`** — subsystems still evolving in 1.x: RAG/embeddings, MCP, A2A, the
380
+ evaluator catalog, unified memory, the scheduler, and the newest backends. Run
381
+ `python scripts/stability_audit.py` for the live marker map.
365
382
 
366
383
  ### v0.19.2 — Enterprise Hardening
367
384
 
@@ -555,7 +572,7 @@ def web_search(query: str) -> str:
555
572
  return expensive_api_call(query)
556
573
  ```
557
574
 
558
- Also: Python 3.9–3.13 CI matrix (verified zero compatibility issues).
575
+ Also: Python 3.10–3.13 CI matrix (verified zero compatibility issues).
559
576
 
560
577
  </details>
561
578
 
@@ -16,6 +16,8 @@ An open-source project from **[NichevLabs](https://nichevlabs.com)**.
16
16
 
17
17
  **Multi-agent orchestration in plain Python.** Build agent graphs, compose pipelines with `|`, deploy with one command. No DSL, no compile step, no paid debugger. Works with OpenAI, Anthropic, Gemini, and Ollama.
18
18
 
19
+ > 🎉 **selectools is 1.0 — stable.** The public API is frozen; `@stable` symbols carry a 2-minor compatibility promise. Python 3.10+. See [What's New in v1.0](#whats-new-in-v10).
20
+
19
21
  ### 3 Ways to Build
20
22
 
21
23
  ```python
@@ -30,6 +32,16 @@ result = AgentGraph.chain(planner, writer, reviewer).run("Write a blog post")
30
32
  # selectools serve agent.yaml
31
33
  ```
32
34
 
35
+ ## What's New in v1.0
36
+
37
+ ### v1.0.0 — Stable
38
+
39
+ selectools is **1.0**. The public API is frozen and `@stable` symbols now carry a real compatibility promise — no removal or breaking signature change without a deprecation cycle spanning at least two minor releases. The package is `Development Status :: 5 - Production/Stable`.
40
+
41
+ - **Frozen, marked surface** — every public symbol carries a `@stable`/`@beta` marker (CI-enforced). The stable set covers the agent loop and config, providers, tools and the mature toolbox, sessions, memory, guardrails, orchestration graphs, the pattern agents, the policy layer, and the core types. RAG/embeddings, MCP, A2A, the evaluator catalog, unified memory, the scheduler, and the newest backends stay `@beta` and keep evolving in 1.x.
42
+ - **Python 3.10+** *(breaking)* — Python 3.9 reached end-of-life in October 2025 and is dropped; the minimum is now 3.10 (CI runs 3.10–3.13). Pin `selectools<1.0` to stay on 3.9.
43
+ - Aside from the 3.9 drop, code that ran deprecation-warning-free on the latest 0.x release runs unmodified on 1.0. See `docs/MIGRATION_1.0.md`.
44
+
33
45
  ## What's New in v0.29
34
46
 
35
47
  ### v0.29.0 — Stability Promotions (v1.0 Freeze Prep)
@@ -261,19 +273,25 @@ selectools serve --builder
261
273
 
262
274
  ### v0.19.3 — Stability Markers Applied to All Public APIs
263
275
 
264
- Every public class and function exported from `selectools` now carries a stability marker:
276
+ Every public class and function exported from `selectools` carries a stability
277
+ marker. As of 1.0, `@stable` symbols carry a compatibility promise — no removal
278
+ or breaking signature change without a deprecation cycle of at least two minors:
265
279
 
266
280
  ```python
267
- from selectools import Agent, AgentGraph, PlanAndExecuteAgent
281
+ from selectools import Agent, AgentGraph, AgentScheduler
268
282
 
269
- print(Agent.__stability__) # "stable"
270
- print(AgentGraph.__stability__) # "beta"
271
- print(PlanAndExecuteAgent.__stability__) # "beta"
283
+ print(Agent.__stability__) # "stable"
284
+ print(AgentGraph.__stability__) # "stable" (promoted for 1.0)
285
+ print(AgentScheduler.__stability__) # "beta" (still iterating)
272
286
  ```
273
287
 
274
- **`@stable`** — 60+ core symbols (Agent, AgentConfig, providers, memory, tools, evals, guardrails, sessions, knowledge, cache, cancellation)
288
+ **`@stable`** — the frozen core: Agent, AgentConfig, providers, memory, tools and
289
+ the mature toolbox, sessions, guardrails, orchestration graphs, the pattern
290
+ agents, the policy layer, and the core types.
275
291
 
276
- **`@beta`** — 30+ newer symbols (AgentGraph, SupervisorAgent, Pipeline, @step, parallel, branch, all four patterns, compose)
292
+ **`@beta`** — subsystems still evolving in 1.x: RAG/embeddings, MCP, A2A, the
293
+ evaluator catalog, unified memory, the scheduler, and the newest backends. Run
294
+ `python scripts/stability_audit.py` for the live marker map.
277
295
 
278
296
  ### v0.19.2 — Enterprise Hardening
279
297
 
@@ -467,7 +485,7 @@ def web_search(query: str) -> str:
467
485
  return expensive_api_call(query)
468
486
  ```
469
487
 
470
- Also: Python 3.9–3.13 CI matrix (verified zero compatibility issues).
488
+ Also: Python 3.10–3.13 CI matrix (verified zero compatibility issues).
471
489
 
472
490
  </details>
473
491
 
@@ -4,10 +4,10 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "selectools"
7
- version = "0.29.0"
7
+ version = "1.0.1"
8
8
  description = "Production-ready Python framework for AI agents with multi-agent graphs, hybrid RAG, guardrails, audit logging, 50 evaluators, and a visual builder. Supports OpenAI, Anthropic, Gemini, Ollama. By NichevLabs."
9
9
  readme = "README.md"
10
- requires-python = ">=3.9"
10
+ requires-python = ">=3.10"
11
11
  license = "Apache-2.0"
12
12
  authors = [{name = "John Nichev", email = "johnnichev@gmail.com"}]
13
13
  maintainers = [{name = "NichevLabs", email = "support@nichevlabs.com"}]
@@ -25,10 +25,9 @@ keywords = [
25
25
  "structured-output", "observability", "fallback", "langchain-alternative",
26
26
  ]
27
27
  classifiers = [
28
- "Development Status :: 4 - Beta",
28
+ "Development Status :: 5 - Production/Stable",
29
29
  "Intended Audience :: Developers",
30
30
  "Programming Language :: Python :: 3",
31
- "Programming Language :: Python :: 3.9",
32
31
  "Programming Language :: Python :: 3.10",
33
32
  "Programming Language :: Python :: 3.11",
34
33
  "Programming Language :: Python :: 3.12",
@@ -130,7 +129,7 @@ where = ["src"]
130
129
 
131
130
  [tool.ruff]
132
131
  line-length = 100
133
- target-version = "py39"
132
+ target-version = "py310"
134
133
  extend-exclude = [
135
134
  ".eggs",
136
135
  ".git",
@@ -155,15 +154,16 @@ ignore = [
155
154
  "E501", # line too long (handled by formatter)
156
155
  "E402", # module-level import not at top
157
156
  "E721", # type comparison with == (allowed; legacy test pattern)
158
- "F401", # unused imports (common in __init__.py re-exports)
159
157
  "F541", # f-string without placeholder
160
- "F841", # local variable assigned but never used
161
158
  "B011", # do not call assert False
162
159
  "B023", # function definition does not bind loop variable
163
160
  "B904", # raise without `from` in except (TODO: fix pre-existing violations)
164
161
  ]
165
162
 
166
163
  [tool.ruff.lint.per-file-ignores]
164
+ # F401 unused-import is expected in __init__.py re-export hubs (the public-API
165
+ # surface). Everywhere else, unused imports and unused locals are real findings.
166
+ "**/__init__.py" = ["F401"]
167
167
  "tests/*" = ["B"]
168
168
  "examples/*" = ["B", "F"]
169
169
  "scripts/*" = ["B", "F"]
@@ -1,6 +1,6 @@
1
1
  """Public exports for the selectools package."""
2
2
 
3
- __version__ = "0.29.0"
3
+ __version__ = "1.0.1"
4
4
 
5
5
  # Import submodules (lazy loading for optional dependencies)
6
6
  from . import embeddings, evals, guardrails, models, observe, patterns, rag, toolbox
@@ -16,8 +16,15 @@ import asyncio
16
16
  import contextvars
17
17
  import threading
18
18
  from concurrent.futures import ThreadPoolExecutor
19
+ from contextlib import aclosing
19
20
  from typing import Any, Awaitable, Callable, Optional, TypeVar
20
21
 
22
+ # ``aclosing`` is re-exported from this module so existing call sites
23
+ # (agent._provider_caller, agent.core) and the regression test that imports it
24
+ # from here are unchanged. It was a local backport while selectools supported
25
+ # 3.9; the floor is now >=3.10, where ``contextlib.aclosing`` is stdlib.
26
+ __all__ = ["aclosing", "run_sync", "run_in_executor_copyctx"]
27
+
21
28
  T = TypeVar("T")
22
29
 
23
30
  # Module-level singleton for running coroutines from sync code that is
@@ -63,36 +70,6 @@ def run_sync(coro: Awaitable[T]) -> T:
63
70
  return future.result()
64
71
 
65
72
 
66
- class aclosing: # noqa: N801 — intentionally matches stdlib contextlib.aclosing
67
- """Async context manager that calls ``aclose()`` on exit.
68
-
69
- BUG-33 / Pydantic AI PRs #4476, #4205: ``async for item in gen:``
70
- without a context manager leaks the async generator when the loop
71
- body raises — ``gen.__aexit__`` runs under GC instead of
72
- deterministically. ``contextlib.aclosing`` fixes this, but was only
73
- added in Python 3.10 and selectools supports 3.9+. This class is a
74
- drop-in backport that works on any Python version.
75
-
76
- Usage::
77
-
78
- async with aclosing(provider.astream(...)) as gen:
79
- async for item in gen:
80
- if stop_condition(item):
81
- break # provider gen gets aclose()'d on exit
82
- """
83
-
84
- def __init__(self, thing: Any) -> None:
85
- self._thing = thing
86
-
87
- async def __aenter__(self) -> Any:
88
- """Return the wrapped async iterable so callers can iterate it."""
89
- return self._thing
90
-
91
- async def __aexit__(self, *_exc: Any) -> None:
92
- """Call ``aclose()`` on the wrapped async iterable on exit."""
93
- await self._thing.aclose()
94
-
95
-
96
73
  async def run_in_executor_copyctx(
97
74
  loop: asyncio.AbstractEventLoop,
98
75
  executor: Optional[Any],
@@ -0,0 +1,42 @@
1
+ """Internal time helpers.
2
+
3
+ Centralizes ISO-8601 timestamp parsing so every persistence backend handles a
4
+ trailing ``Z`` (UTC designator) the same way.
5
+
6
+ ``datetime.fromisoformat`` did not accept the ``Z`` suffix until Python 3.11.
7
+ On Python 3.10 (the project's minimum) a ``Z``-suffixed timestamp such as
8
+ ``"2026-06-15T12:00:00Z"`` raises ``ValueError``. Postgres/Supabase/Redis and
9
+ other stores routinely return that form, so parsing it inline crashed the
10
+ knowledge and checkpoint loaders on 3.10. ``parse_iso`` normalizes the suffix
11
+ before delegating, so the same code works on every supported interpreter.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ from datetime import datetime, timezone
17
+ from typing import Union
18
+
19
+
20
+ def parse_iso(value: Union[str, datetime]) -> datetime:
21
+ """Parse an ISO-8601 timestamp, tolerating a trailing ``Z`` (UTC).
22
+
23
+ Accepts either a string or an already-parsed ``datetime`` (returned as-is,
24
+ so callers reading columns that may already be typed do not need their own
25
+ ``isinstance`` guard). Timezone awareness is preserved exactly as encoded:
26
+ an offset-bearing string (including ``Z``) yields an aware datetime; a naive
27
+ string yields a naive datetime. Use :func:`ensure_aware` when a guaranteed
28
+ aware value is required.
29
+ """
30
+ if isinstance(value, datetime):
31
+ return value
32
+ s = str(value)
33
+ if s.endswith("Z"):
34
+ s = s[:-1] + "+00:00"
35
+ return datetime.fromisoformat(s)
36
+
37
+
38
+ def ensure_aware(dt: datetime, *, tz: timezone = timezone.utc) -> datetime:
39
+ """Attach ``tz`` (default UTC) to a naive datetime; pass aware ones through."""
40
+ if dt.tzinfo is None:
41
+ return dt.replace(tzinfo=tz)
42
+ return dt
@@ -8,7 +8,7 @@ import threading
8
8
  from typing import TYPE_CHECKING, Any, Optional, cast
9
9
 
10
10
  if TYPE_CHECKING:
11
- from ..memory import ConversationMemory
11
+ pass
12
12
 
13
13
  logger = logging.getLogger(__name__)
14
14
 
@@ -9,7 +9,6 @@ from ..trace import AgentTrace, StepType, TraceStep
9
9
  from ..types import Message, Role
10
10
 
11
11
  if TYPE_CHECKING:
12
- from ..memory import ConversationMemory
13
12
  from .core import _RunContext
14
13
 
15
14
 
@@ -6,7 +6,7 @@ import asyncio
6
6
  import threading
7
7
  import time
8
8
  from concurrent.futures import ThreadPoolExecutor
9
- from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Tuple
9
+ from typing import TYPE_CHECKING, Callable, List, Optional, Tuple
10
10
 
11
11
  # Module-level singleton for running sync provider calls in an async context.
12
12
  # Creating a new ThreadPoolExecutor per call (inside a retry loop) wastes
@@ -57,8 +57,8 @@ def _get_parallel_dispatch_executor() -> ThreadPoolExecutor:
57
57
 
58
58
 
59
59
  from .._async_utils import run_in_executor_copyctx
60
- from ..coherence import CoherenceResult, acheck_coherence, check_coherence
61
- from ..policy import ApprovalRequest, PolicyDecision, PolicyResult, ToolPolicy
60
+ from ..coherence import acheck_coherence, check_coherence
61
+ from ..policy import ApprovalRequest, PolicyDecision, PolicyResult
62
62
  from ..security import screen_output as screen_tool_output
63
63
  from ..trace import StepType, TraceStep
64
64
  from ..types import Message, Role
@@ -1215,7 +1215,7 @@ class _ToolExecutorMixin:
1215
1215
  for i in candidate_indices
1216
1216
  ]
1217
1217
  )
1218
- for i, text in zip(candidate_indices, compressed_texts):
1218
+ for i, text in zip(candidate_indices, compressed_texts, strict=False):
1219
1219
  compressed_by_index[i] = text
1220
1220
  self._store_compressed_in_cache(
1221
1221
  results[i].tool, results[i].tool_call.parameters, results[i].result, text
@@ -7,7 +7,7 @@ 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 beta, stable
10
+ from ..stability import stable
11
11
 
12
12
  if TYPE_CHECKING:
13
13
  from ..cache import Cache
@@ -24,23 +24,20 @@ Usage::
24
24
  from __future__ import annotations
25
25
 
26
26
  from dataclasses import dataclass, field
27
- from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Union
27
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
28
28
 
29
29
  from ..stability import stable
30
30
 
31
31
  if TYPE_CHECKING:
32
- from ..cache import Cache
33
32
  from ..cancellation import CancellationToken
34
33
  from ..entity_memory import EntityMemory
35
34
  from ..guardrails import GuardrailsPipeline
36
35
  from ..knowledge import KnowledgeMemory
37
36
  from ..knowledge_graph import KnowledgeGraphMemory
38
- from ..observer import AgentObserver
39
37
  from ..policy import ToolPolicy
40
38
  from ..providers.base import Provider
41
39
  from ..sessions import SessionStore
42
40
  from ..unified_memory import UnifiedMemory
43
- from ..usage import AgentUsage
44
41
 
45
42
 
46
43
  @stable
@@ -17,7 +17,7 @@ from .._async_utils import aclosing, run_in_executor_copyctx
17
17
  from ..analytics import AgentAnalytics
18
18
  from ..parser import ToolCallParser
19
19
  from ..prompt import PromptBuilder
20
- from ..providers.base import Provider, ProviderError
20
+ from ..providers.base import Provider
21
21
  from ..providers.openai_provider import OpenAIProvider
22
22
  from ..results import Artifact, _begin_artifact_collection
23
23
  from ..stability import beta, deprecated, stable
@@ -1593,7 +1593,7 @@ class Agent(_ToolExecutorMixin, _ProviderCallerMixin, _LifecycleMixin, _MemoryMa
1593
1593
  # finally block and releases HTTP connections — instead
1594
1594
  # of waiting for GC and emitting `async generator raised
1595
1595
  # StopAsyncIteration` warnings.
1596
- async with aclosing(
1596
+ async with aclosing( # type: ignore[type-var] # astream is an async generator (has aclose) but typed AsyncIterable
1597
1597
  self.provider.astream(
1598
1598
  model=self._effective_model,
1599
1599
  system_prompt=self._system_prompt,
@@ -18,7 +18,6 @@ import hashlib
18
18
  import json
19
19
  import os
20
20
  import threading
21
- import time
22
21
  from datetime import datetime, timezone
23
22
  from enum import Enum
24
23
  from typing import Any, Dict, List, Optional
@@ -287,7 +287,7 @@ class CacheKeyBuilder:
287
287
 
288
288
 
289
289
  # Cache is @runtime_checkable: a ``__stability__`` class attribute would become
290
- # a structural protocol member on Python 3.9-3.11 and break ``isinstance()``
290
+ # a structural protocol member on Python 3.10-3.11 and break ``isinstance()``
291
291
  # for implementations that do not define it, so it is registered instead.
292
292
  register_stability("Cache", "stable")
293
293
 
@@ -12,7 +12,7 @@ from __future__ import annotations
12
12
  import math
13
13
  import threading
14
14
  import time
15
- from dataclasses import dataclass, field
15
+ from dataclasses import dataclass
16
16
  from typing import TYPE_CHECKING, Any, List, Optional, Tuple
17
17
 
18
18
  from .cache import CacheStats
@@ -210,7 +210,7 @@ class SemanticCache:
210
210
 
211
211
  def _cosine_similarity(a: List[float], b: List[float]) -> float:
212
212
  """Compute cosine similarity between two vectors (pure Python, no numpy)."""
213
- dot = sum(x * y for x, y in zip(a, b))
213
+ dot = sum(x * y for x, y in zip(a, b, strict=False))
214
214
  norm_a = math.sqrt(sum(x * x for x in a))
215
215
  norm_b = math.sqrt(sum(x * x for x in b))
216
216
  if norm_a == 0.0 or norm_b == 0.0:
@@ -20,9 +20,9 @@ import json
20
20
  import re
21
21
  import threading
22
22
  import uuid
23
- from datetime import datetime, timezone
24
- from typing import Any, Dict, List, Optional, Tuple
23
+ from typing import List, Tuple
25
24
 
25
+ from ._time import parse_iso
26
26
  from .orchestration.checkpoint import (
27
27
  CheckpointMetadata,
28
28
  _deserialize_checkpoint,
@@ -137,9 +137,7 @@ class PostgresCheckpointStore:
137
137
  step=r[2],
138
138
  node_name=r[3],
139
139
  interrupted=r[4],
140
- created_at=(
141
- r[5] if isinstance(r[5], datetime) else datetime.fromisoformat(str(r[5]))
142
- ),
140
+ created_at=parse_iso(r[5]),
143
141
  )
144
142
  for r in rows
145
143
  ]
@@ -21,11 +21,10 @@ Usage::
21
21
 
22
22
  from __future__ import annotations
23
23
 
24
- from typing import Any, Callable, List, Optional, Sequence
24
+ from typing import Any, Callable, List, Optional
25
25
 
26
26
  from .stability import beta
27
27
  from .tools.base import Tool
28
- from .tools.decorators import tool as tool_decorator
29
28
 
30
29
 
31
30
  @beta
@@ -1248,6 +1248,6 @@ DEFAULT_EVALUATORS: List[Any] = [
1248
1248
 
1249
1249
 
1250
1250
  # Evaluator is @runtime_checkable: a ``__stability__`` class attribute would become
1251
- # a structural protocol member on Python 3.9-3.11 and break ``isinstance()``
1251
+ # a structural protocol member on Python 3.10-3.11 and break ``isinstance()``
1252
1252
  # for implementations that do not define it, so it is registered instead.
1253
1253
  register_stability("Evaluator", "beta")
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  import json
6
6
  from dataclasses import dataclass, field
7
7
  from pathlib import Path
8
- from typing import Any, Dict, List, Optional, Union
8
+ from typing import Any, List, Optional, Union
9
9
 
10
10
  from ..stability import beta
11
11
 
@@ -2,18 +2,14 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import time
6
- import uuid
7
5
  from dataclasses import dataclass, field
8
6
  from typing import Any, Dict, List, Optional
9
7
 
10
- from .. import __version__
11
8
  from ..agent import Agent
12
9
  from ..stability import beta
13
- from .evaluators import DEFAULT_EVALUATORS
14
10
  from .report import EvalReport
15
11
  from .suite import EvalSuite
16
- from .types import CaseResult, CaseVerdict, EvalMetadata, TestCase
12
+ from .types import CaseResult, CaseVerdict, TestCase
17
13
 
18
14
 
19
15
  @beta
@@ -167,7 +163,7 @@ class PairwiseEval:
167
163
  report_b = suite_b.run()
168
164
 
169
165
  pairwise_results: List[PairwiseCaseResult] = []
170
- for cr_a, cr_b in zip(report_a.case_results, report_b.case_results):
166
+ for cr_a, cr_b in zip(report_a.case_results, report_b.case_results, strict=False):
171
167
  winner, reason = self._compare_case(cr_a, cr_b)
172
168
  pairwise_results.append(
173
169
  PairwiseCaseResult(
@@ -2,16 +2,12 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import html
6
5
  import json
7
6
  import threading
8
- import time
9
7
  from http.server import HTTPServer, SimpleHTTPRequestHandler
10
- from io import BytesIO
11
- from typing import Any, Callable, Dict, List, Optional
8
+ from typing import Any, Dict
12
9
 
13
10
  from ..stability import beta
14
- from .types import CaseVerdict
15
11
 
16
12
 
17
13
  class _DashboardHandler(SimpleHTTPRequestHandler):
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import Any, List, Optional
5
+ from typing import List, Optional
6
6
 
7
7
  from ..agent import Agent
8
8
  from ..stability import beta
@@ -10,7 +10,6 @@ from .evaluators import (
10
10
  ContainsEvaluator,
11
11
  CustomEvaluator,
12
12
  InjectionResistanceEvaluator,
13
- JsonValidityEvaluator,
14
13
  LengthEvaluator,
15
14
  PerformanceEvaluator,
16
15
  PIILeakEvaluator,
@@ -10,7 +10,7 @@ from __future__ import annotations
10
10
 
11
11
  import logging
12
12
  from dataclasses import dataclass, field
13
- from typing import List, Optional
13
+ from typing import List
14
14
 
15
15
  from selectools.stability import stable
16
16
 
@@ -49,7 +49,7 @@ class TopicGuardrail(Guardrail):
49
49
  normalized = re.sub(r"[\u200b\u200c\u200d\ufeff\u00ad]", "", normalized)
50
50
 
51
51
  matched: List[str] = []
52
- for pattern, topic in zip(self._patterns, self.deny):
52
+ for pattern, topic in zip(self._patterns, self.deny, strict=False):
53
53
  if pattern.search(normalized):
54
54
  matched.append(topic)
55
55