selectools 0.27.1__tar.gz → 0.27.2__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 (319) hide show
  1. {selectools-0.27.1/src/selectools.egg-info → selectools-0.27.2}/PKG-INFO +5 -1
  2. {selectools-0.27.1 → selectools-0.27.2}/README.md +4 -0
  3. {selectools-0.27.1 → selectools-0.27.2}/pyproject.toml +1 -1
  4. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/__init__.py +1 -1
  5. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/config.py +4 -1
  6. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/core.py +28 -13
  7. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/app.py +4 -2
  8. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/types.py +9 -0
  9. {selectools-0.27.1 → selectools-0.27.2/src/selectools.egg-info}/PKG-INFO +5 -1
  10. {selectools-0.27.1 → selectools-0.27.2}/tests/test_model_switching.py +46 -0
  11. {selectools-0.27.1 → selectools-0.27.2}/LICENSE +0 -0
  12. {selectools-0.27.1 → selectools-0.27.2}/setup.cfg +0 -0
  13. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/_async_utils.py +0 -0
  14. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/_json_utils.py +0 -0
  15. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/a2a/__init__.py +0 -0
  16. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/a2a/client.py +0 -0
  17. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/a2a/server.py +0 -0
  18. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/a2a/types.py +0 -0
  19. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/__init__.py +0 -0
  20. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/_lifecycle.py +0 -0
  21. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/_memory_manager.py +0 -0
  22. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/_planning.py +0 -0
  23. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/_provider_caller.py +0 -0
  24. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/_tool_executor.py +0 -0
  25. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/agent/config_groups.py +0 -0
  26. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/analytics.py +0 -0
  27. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/audit.py +0 -0
  28. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/cache.py +0 -0
  29. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/cache_redis.py +0 -0
  30. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/cache_semantic.py +0 -0
  31. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/cancellation.py +0 -0
  32. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/checkpoint_postgres.py +0 -0
  33. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/coherence.py +0 -0
  34. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/compose.py +0 -0
  35. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/embeddings/__init__.py +0 -0
  36. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/embeddings/anthropic.py +0 -0
  37. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/embeddings/cohere.py +0 -0
  38. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/embeddings/gemini.py +0 -0
  39. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/embeddings/openai.py +0 -0
  40. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/embeddings/provider.py +0 -0
  41. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/entity_memory.py +0 -0
  42. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/env.py +0 -0
  43. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/__init__.py +0 -0
  44. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/__main__.py +0 -0
  45. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/badge.py +0 -0
  46. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/dataset.py +0 -0
  47. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/evaluators.py +0 -0
  48. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/generator.py +0 -0
  49. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/history.py +0 -0
  50. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/html.py +0 -0
  51. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/junit.py +0 -0
  52. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/llm_evaluators.py +0 -0
  53. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/pairwise.py +0 -0
  54. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/regression.py +0 -0
  55. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/report.py +0 -0
  56. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/serve.py +0 -0
  57. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/snapshot.py +0 -0
  58. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/suite.py +0 -0
  59. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/templates.py +0 -0
  60. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/evals/types.py +0 -0
  61. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/exceptions.py +0 -0
  62. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/__init__.py +0 -0
  63. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/base.py +0 -0
  64. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/format.py +0 -0
  65. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/injection.py +0 -0
  66. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/length.py +0 -0
  67. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/pii.py +0 -0
  68. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/pipeline.py +0 -0
  69. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/topic.py +0 -0
  70. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/guardrails/toxicity.py +0 -0
  71. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/knowledge.py +0 -0
  72. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/knowledge_backends.py +0 -0
  73. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/knowledge_graph.py +0 -0
  74. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/knowledge_sanitizers.py +0 -0
  75. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/knowledge_store_redis.py +0 -0
  76. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/knowledge_store_supabase.py +0 -0
  77. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/loop_detection.py +0 -0
  78. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/mcp/__init__.py +0 -0
  79. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/mcp/_loop.py +0 -0
  80. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/mcp/bridge.py +0 -0
  81. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/mcp/client.py +0 -0
  82. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/mcp/config.py +0 -0
  83. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/mcp/multi.py +0 -0
  84. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/mcp/server.py +0 -0
  85. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/memory.py +0 -0
  86. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/models.py +0 -0
  87. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/observe/__init__.py +0 -0
  88. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/observe/langfuse.py +0 -0
  89. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/observe/otel.py +0 -0
  90. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/observe/trace_store.py +0 -0
  91. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/observer.py +0 -0
  92. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/orchestration/__init__.py +0 -0
  93. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/orchestration/checkpoint.py +0 -0
  94. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/orchestration/graph.py +0 -0
  95. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/orchestration/node.py +0 -0
  96. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/orchestration/state.py +0 -0
  97. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/orchestration/supervisor.py +0 -0
  98. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/parser.py +0 -0
  99. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/patterns/__init__.py +0 -0
  100. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/patterns/debate.py +0 -0
  101. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/patterns/plan_and_execute.py +0 -0
  102. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/patterns/reflective.py +0 -0
  103. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/patterns/team_lead.py +0 -0
  104. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/pending.py +0 -0
  105. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/pipeline.py +0 -0
  106. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/policy.py +0 -0
  107. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/pricing.py +0 -0
  108. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/prompt.py +0 -0
  109. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/__init__.py +0 -0
  110. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/_openai_compat.py +0 -0
  111. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/anthropic_provider.py +0 -0
  112. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/azure_openai_provider.py +0 -0
  113. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/base.py +0 -0
  114. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/fallback.py +0 -0
  115. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/gemini_provider.py +0 -0
  116. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/litellm_provider.py +0 -0
  117. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/ollama_provider.py +0 -0
  118. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/openai_provider.py +0 -0
  119. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/router.py +0 -0
  120. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/providers/stubs.py +0 -0
  121. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/__init__.py +0 -0
  122. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/bm25.py +0 -0
  123. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/chunking.py +0 -0
  124. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/hybrid.py +0 -0
  125. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/loaders.py +0 -0
  126. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/reranker.py +0 -0
  127. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/stores/__init__.py +0 -0
  128. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/stores/chroma.py +0 -0
  129. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/stores/faiss.py +0 -0
  130. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/stores/memory.py +0 -0
  131. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/stores/pgvector.py +0 -0
  132. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/stores/pinecone.py +0 -0
  133. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/stores/qdrant.py +0 -0
  134. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/stores/sqlite.py +0 -0
  135. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/tools.py +0 -0
  136. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/rag/vector_store.py +0 -0
  137. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/results.py +0 -0
  138. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/scheduler.py +0 -0
  139. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/security.py +0 -0
  140. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/__init__.py +0 -0
  141. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/_starlette_app.py +0 -0
  142. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/_static/builder.css +0 -0
  143. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/_static/builder.html +0 -0
  144. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/_static/builder.js +0 -0
  145. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/api.py +0 -0
  146. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/builder.py +0 -0
  147. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/cli.py +0 -0
  148. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/models.py +0 -0
  149. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/serve/playground.py +0 -0
  150. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/sessions.py +0 -0
  151. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/stability.py +0 -0
  152. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/structured.py +0 -0
  153. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/templates/__init__.py +0 -0
  154. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/templates/code_reviewer.py +0 -0
  155. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/templates/customer_support.py +0 -0
  156. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/templates/data_analyst.py +0 -0
  157. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/templates/rag_chatbot.py +0 -0
  158. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/templates/research_assistant.py +0 -0
  159. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/token_estimation.py +0 -0
  160. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/__init__.py +0 -0
  161. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/browser_tools.py +0 -0
  162. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/calculator_tools.py +0 -0
  163. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/code_tools.py +0 -0
  164. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/data_tools.py +0 -0
  165. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/datetime_tools.py +0 -0
  166. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/db_tools.py +0 -0
  167. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/discord_tools.py +0 -0
  168. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/email_tools.py +0 -0
  169. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/file_tools.py +0 -0
  170. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/github_tools.py +0 -0
  171. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/image_tools.py +0 -0
  172. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/linear_tools.py +0 -0
  173. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/memory_tools.py +0 -0
  174. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/notion_tools.py +0 -0
  175. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/pdf_tools.py +0 -0
  176. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/reasoning_tools.py +0 -0
  177. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/s3_tools.py +0 -0
  178. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/search_tools.py +0 -0
  179. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/slack_tools.py +0 -0
  180. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/text_tools.py +0 -0
  181. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/toolbox/web_tools.py +0 -0
  182. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/tools/__init__.py +0 -0
  183. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/tools/base.py +0 -0
  184. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/tools/decorators.py +0 -0
  185. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/tools/loader.py +0 -0
  186. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/tools/registry.py +0 -0
  187. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/trace.py +0 -0
  188. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/unified_memory.py +0 -0
  189. {selectools-0.27.1 → selectools-0.27.2}/src/selectools/usage.py +0 -0
  190. {selectools-0.27.1 → selectools-0.27.2}/src/selectools.egg-info/SOURCES.txt +0 -0
  191. {selectools-0.27.1 → selectools-0.27.2}/src/selectools.egg-info/dependency_links.txt +0 -0
  192. {selectools-0.27.1 → selectools-0.27.2}/src/selectools.egg-info/entry_points.txt +0 -0
  193. {selectools-0.27.1 → selectools-0.27.2}/src/selectools.egg-info/requires.txt +0 -0
  194. {selectools-0.27.1 → selectools-0.27.2}/src/selectools.egg-info/top_level.txt +0 -0
  195. {selectools-0.27.1 → selectools-0.27.2}/tests/test_a2a.py +0 -0
  196. {selectools-0.27.1 → selectools-0.27.2}/tests/test_agent_api.py +0 -0
  197. {selectools-0.27.1 → selectools-0.27.2}/tests/test_agent_hitl.py +0 -0
  198. {selectools-0.27.1 → selectools-0.27.2}/tests/test_approval_gate.py +0 -0
  199. {selectools-0.27.1 → selectools-0.27.2}/tests/test_architecture.py +0 -0
  200. {selectools-0.27.1 → selectools-0.27.2}/tests/test_async_observers.py +0 -0
  201. {selectools-0.27.1 → selectools-0.27.2}/tests/test_audit.py +0 -0
  202. {selectools-0.27.1 → selectools-0.27.2}/tests/test_bake_window_hunt.py +0 -0
  203. {selectools-0.27.1 → selectools-0.27.2}/tests/test_budget.py +0 -0
  204. {selectools-0.27.1 → selectools-0.27.2}/tests/test_bug_hunt_batch1_core.py +0 -0
  205. {selectools-0.27.1 → selectools-0.27.2}/tests/test_bug_hunt_batch1_security.py +0 -0
  206. {selectools-0.27.1 → selectools-0.27.2}/tests/test_bug_hunt_batch1_tools.py +0 -0
  207. {selectools-0.27.1 → selectools-0.27.2}/tests/test_bug_hunt_regression.py +0 -0
  208. {selectools-0.27.1 → selectools-0.27.2}/tests/test_cache.py +0 -0
  209. {selectools-0.27.1 → selectools-0.27.2}/tests/test_cache_redis.py +0 -0
  210. {selectools-0.27.1 → selectools-0.27.2}/tests/test_cancellation.py +0 -0
  211. {selectools-0.27.1 → selectools-0.27.2}/tests/test_checkpoint_postgres.py +0 -0
  212. {selectools-0.27.1 → selectools-0.27.2}/tests/test_coherence.py +0 -0
  213. {selectools-0.27.1 → selectools-0.27.2}/tests/test_concurrency_smoke.py +0 -0
  214. {selectools-0.27.1 → selectools-0.27.2}/tests/test_consolidation_regression.py +0 -0
  215. {selectools-0.27.1 → selectools-0.27.2}/tests/test_conversation_branching.py +0 -0
  216. {selectools-0.27.1 → selectools-0.27.2}/tests/test_coverage_orchestration.py +0 -0
  217. {selectools-0.27.1 → selectools-0.27.2}/tests/test_document_loaders_extended.py +0 -0
  218. {selectools-0.27.1 → selectools-0.27.2}/tests/test_e2e_langfuse_observer.py +0 -0
  219. {selectools-0.27.1 → selectools-0.27.2}/tests/test_e2e_multimodal.py +0 -0
  220. {selectools-0.27.1 → selectools-0.27.2}/tests/test_e2e_otel_observer.py +0 -0
  221. {selectools-0.27.1 → selectools-0.27.2}/tests/test_e2e_v0_21_0_apps.py +0 -0
  222. {selectools-0.27.1 → selectools-0.27.2}/tests/test_e2e_v0_21_0_simulations.py +0 -0
  223. {selectools-0.27.1 → selectools-0.27.2}/tests/test_entity_memory.py +0 -0
  224. {selectools-0.27.1 → selectools-0.27.2}/tests/test_env.py +0 -0
  225. {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals.py +0 -0
  226. {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_advanced.py +0 -0
  227. {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_cli.py +0 -0
  228. {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_e2e.py +0 -0
  229. {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_final.py +0 -0
  230. {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_hardening.py +0 -0
  231. {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_html_report.py +0 -0
  232. {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_new_evaluators.py +0 -0
  233. {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_ralph_bugs.py +0 -0
  234. {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_release.py +0 -0
  235. {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_serve.py +0 -0
  236. {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_v017_features.py +0 -0
  237. {selectools-0.27.1 → selectools-0.27.2}/tests/test_evals_v0191.py +0 -0
  238. {selectools-0.27.1 → selectools-0.27.2}/tests/test_features_in_graph.py +0 -0
  239. {selectools-0.27.1 → selectools-0.27.2}/tests/test_final_coverage_a.py +0 -0
  240. {selectools-0.27.1 → selectools-0.27.2}/tests/test_final_coverage_b.py +0 -0
  241. {selectools-0.27.1 → selectools-0.27.2}/tests/test_guardrails.py +0 -0
  242. {selectools-0.27.1 → selectools-0.27.2}/tests/test_guardrails_injection.py +0 -0
  243. {selectools-0.27.1 → selectools-0.27.2}/tests/test_hardening.py +0 -0
  244. {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge.py +0 -0
  245. {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_backend.py +0 -0
  246. {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_backend_redis.py +0 -0
  247. {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_backend_supabase.py +0 -0
  248. {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_graph.py +0 -0
  249. {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_sanitizers.py +0 -0
  250. {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_store_redis.py +0 -0
  251. {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_store_supabase.py +0 -0
  252. {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_stores.py +0 -0
  253. {selectools-0.27.1 → selectools-0.27.2}/tests/test_knowledge_stores_error_handling.py +0 -0
  254. {selectools-0.27.1 → selectools-0.27.2}/tests/test_langfuse_observer.py +0 -0
  255. {selectools-0.27.1 → selectools-0.27.2}/tests/test_loop_detection.py +0 -0
  256. {selectools-0.27.1 → selectools-0.27.2}/tests/test_mcp.py +0 -0
  257. {selectools-0.27.1 → selectools-0.27.2}/tests/test_mcp_coverage.py +0 -0
  258. {selectools-0.27.1 → selectools-0.27.2}/tests/test_memory.py +0 -0
  259. {selectools-0.27.1 → selectools-0.27.2}/tests/test_memory_async.py +0 -0
  260. {selectools-0.27.1 → selectools-0.27.2}/tests/test_memory_boundary.py +0 -0
  261. {selectools-0.27.1 → selectools-0.27.2}/tests/test_memory_integration.py +0 -0
  262. {selectools-0.27.1 → selectools-0.27.2}/tests/test_multi_agent_edge_cases.py +0 -0
  263. {selectools-0.27.1 → selectools-0.27.2}/tests/test_multimodal.py +0 -0
  264. {selectools-0.27.1 → selectools-0.27.2}/tests/test_orchestration_checkpoint.py +0 -0
  265. {selectools-0.27.1 → selectools-0.27.2}/tests/test_orchestration_e2e.py +0 -0
  266. {selectools-0.27.1 → selectools-0.27.2}/tests/test_orchestration_evals.py +0 -0
  267. {selectools-0.27.1 → selectools-0.27.2}/tests/test_orchestration_graph.py +0 -0
  268. {selectools-0.27.1 → selectools-0.27.2}/tests/test_orchestration_integration.py +0 -0
  269. {selectools-0.27.1 → selectools-0.27.2}/tests/test_orchestration_primitives.py +0 -0
  270. {selectools-0.27.1 → selectools-0.27.2}/tests/test_orchestration_supervisor.py +0 -0
  271. {selectools-0.27.1 → selectools-0.27.2}/tests/test_otel_observer.py +0 -0
  272. {selectools-0.27.1 → selectools-0.27.2}/tests/test_parser.py +0 -0
  273. {selectools-0.27.1 → selectools-0.27.2}/tests/test_patterns.py +0 -0
  274. {selectools-0.27.1 → selectools-0.27.2}/tests/test_pending.py +0 -0
  275. {selectools-0.27.1 → selectools-0.27.2}/tests/test_pending_redis_smoke.py +0 -0
  276. {selectools-0.27.1 → selectools-0.27.2}/tests/test_phase1_design_patterns.py +0 -0
  277. {selectools-0.27.1 → selectools-0.27.2}/tests/test_pipeline.py +0 -0
  278. {selectools-0.27.1 → selectools-0.27.2}/tests/test_pipeline_coverage.py +0 -0
  279. {selectools-0.27.1 → selectools-0.27.2}/tests/test_policy.py +0 -0
  280. {selectools-0.27.1 → selectools-0.27.2}/tests/test_prompt.py +0 -0
  281. {selectools-0.27.1 → selectools-0.27.2}/tests/test_prompt_compression.py +0 -0
  282. {selectools-0.27.1 → selectools-0.27.2}/tests/test_property_based.py +0 -0
  283. {selectools-0.27.1 → selectools-0.27.2}/tests/test_reasoning_strategy.py +0 -0
  284. {selectools-0.27.1 → selectools-0.27.2}/tests/test_remaining_coverage.py +0 -0
  285. {selectools-0.27.1 → selectools-0.27.2}/tests/test_results.py +0 -0
  286. {selectools-0.27.1 → selectools-0.27.2}/tests/test_routing_mode.py +0 -0
  287. {selectools-0.27.1 → selectools-0.27.2}/tests/test_scheduler.py +0 -0
  288. {selectools-0.27.1 → selectools-0.27.2}/tests/test_security.py +0 -0
  289. {selectools-0.27.1 → selectools-0.27.2}/tests/test_semantic_cache.py +0 -0
  290. {selectools-0.27.1 → selectools-0.27.2}/tests/test_serve_app_coverage.py +0 -0
  291. {selectools-0.27.1 → selectools-0.27.2}/tests/test_serve_cli.py +0 -0
  292. {selectools-0.27.1 → selectools-0.27.2}/tests/test_sessions.py +0 -0
  293. {selectools-0.27.1 → selectools-0.27.2}/tests/test_sessions_dynamodb.py +0 -0
  294. {selectools-0.27.1 → selectools-0.27.2}/tests/test_sessions_edge_cases.py +0 -0
  295. {selectools-0.27.1 → selectools-0.27.2}/tests/test_sessions_mongo.py +0 -0
  296. {selectools-0.27.1 → selectools-0.27.2}/tests/test_sessions_redis.py +0 -0
  297. {selectools-0.27.1 → selectools-0.27.2}/tests/test_sessions_supabase.py +0 -0
  298. {selectools-0.27.1 → selectools-0.27.2}/tests/test_simple_observer.py +0 -0
  299. {selectools-0.27.1 → selectools-0.27.2}/tests/test_simulation_evals.py +0 -0
  300. {selectools-0.27.1 → selectools-0.27.2}/tests/test_stability.py +0 -0
  301. {selectools-0.27.1 → selectools-0.27.2}/tests/test_starlette_app.py +0 -0
  302. {selectools-0.27.1 → selectools-0.27.2}/tests/test_structured.py +0 -0
  303. {selectools-0.27.1 → selectools-0.27.2}/tests/test_structured_config.py +0 -0
  304. {selectools-0.27.1 → selectools-0.27.2}/tests/test_structured_tool_results.py +0 -0
  305. {selectools-0.27.1 → selectools-0.27.2}/tests/test_summarize_on_trim.py +0 -0
  306. {selectools-0.27.1 → selectools-0.27.2}/tests/test_templates_coverage.py +0 -0
  307. {selectools-0.27.1 → selectools-0.27.2}/tests/test_terminal_actions.py +0 -0
  308. {selectools-0.27.1 → selectools-0.27.2}/tests/test_token_estimation.py +0 -0
  309. {selectools-0.27.1 → selectools-0.27.2}/tests/test_tool_caching.py +0 -0
  310. {selectools-0.27.1 → selectools-0.27.2}/tests/test_tool_result_compression.py +0 -0
  311. {selectools-0.27.1 → selectools-0.27.2}/tests/test_trace.py +0 -0
  312. {selectools-0.27.1 → selectools-0.27.2}/tests/test_trace_html.py +0 -0
  313. {selectools-0.27.1 → selectools-0.27.2}/tests/test_trace_store.py +0 -0
  314. {selectools-0.27.1 → selectools-0.27.2}/tests/test_unified_memory.py +0 -0
  315. {selectools-0.27.1 → selectools-0.27.2}/tests/test_unified_memory_config.py +0 -0
  316. {selectools-0.27.1 → selectools-0.27.2}/tests/test_v016_regression.py +0 -0
  317. {selectools-0.27.1 → selectools-0.27.2}/tests/test_v019_features.py +0 -0
  318. {selectools-0.27.1 → selectools-0.27.2}/tests/test_visual_builder.py +0 -0
  319. {selectools-0.27.1 → selectools-0.27.2}/tests/test_yaml_config.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: selectools
3
- Version: 0.27.1
3
+ Version: 0.27.2
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>
@@ -116,6 +116,10 @@ result = AgentGraph.chain(planner, writer, reviewer).run("Write a blog post")
116
116
 
117
117
  ## What's New in v0.27
118
118
 
119
+ ### v0.27.2 — Provider Model Fix & Tool-less Agents
120
+
121
+ Fixes a P0: the agent ignored every provider's default model and sent `gpt-5-mini` to all of them, so **any non-OpenAI provider (Anthropic, Gemini, Ollama, LiteLLM) 404'd on every request**. `AgentConfig.model` now defaults to `None` and resolves to the provider's own default. Also: `Agent(tools=[])` is now valid (pure conversational agents), and the structured-output (`result.parsed` vs `.content`) and streaming (accumulate `StreamChunk` deltas, not the terminal `AgentResult`) sharp edges are documented.
122
+
119
123
  ### v0.27.1 — Bug-Hunt Patch
120
124
 
121
125
  An adversarial bug hunt of the v0.27.0 surface fixed 10 confirmed bugs (no API changes, no breaking changes). Highlights: scheduled agents recorded the `AgentResult` repr instead of the answer text; `PromptInjectionGuardrail` blocked benign requests ("pretend you are a pirate", "show the rules"); `s3_get_object` leaked its HTTP connection; and unified memory persisted un-redacted input in async mode. See `CHANGELOG.md` for the full list.
@@ -32,6 +32,10 @@ result = AgentGraph.chain(planner, writer, reviewer).run("Write a blog post")
32
32
 
33
33
  ## What's New in v0.27
34
34
 
35
+ ### v0.27.2 — Provider Model Fix & Tool-less Agents
36
+
37
+ Fixes a P0: the agent ignored every provider's default model and sent `gpt-5-mini` to all of them, so **any non-OpenAI provider (Anthropic, Gemini, Ollama, LiteLLM) 404'd on every request**. `AgentConfig.model` now defaults to `None` and resolves to the provider's own default. Also: `Agent(tools=[])` is now valid (pure conversational agents), and the structured-output (`result.parsed` vs `.content`) and streaming (accumulate `StreamChunk` deltas, not the terminal `AgentResult`) sharp edges are documented.
38
+
35
39
  ### v0.27.1 — Bug-Hunt Patch
36
40
 
37
41
  An adversarial bug hunt of the v0.27.0 surface fixed 10 confirmed bugs (no API changes, no breaking changes). Highlights: scheduled agents recorded the `AgentResult` repr instead of the answer text; `PromptInjectionGuardrail` blocked benign requests ("pretend you are a pirate", "show the rules"); `s3_get_object` leaked its HTTP connection; and unified memory persisted un-redacted input in async mode. See `CHANGELOG.md` for the full list.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "selectools"
7
- version = "0.27.1"
7
+ version = "0.27.2"
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
10
  requires-python = ">=3.9"
@@ -1,6 +1,6 @@
1
1
  """Public exports for the selectools package."""
2
2
 
3
- __version__ = "0.27.1"
3
+ __version__ = "0.27.2"
4
4
 
5
5
  # Import submodules (lazy loading for optional dependencies)
6
6
  from . import embeddings, evals, guardrails, models, observe, patterns, rag, toolbox
@@ -123,7 +123,10 @@ class AgentConfig:
123
123
  """
124
124
 
125
125
  name: str = "agent"
126
- model: str = "gpt-5-mini"
126
+ # None means "use the provider's own default_model". A hardcoded default
127
+ # here would be sent to EVERY provider — e.g. an OpenAI model id reaching
128
+ # the Anthropic API and 404-ing on every call.
129
+ model: Optional[str] = None
127
130
  temperature: float = 0.0
128
131
  max_tokens: int = 1000
129
132
  max_iterations: int = 6
@@ -160,11 +160,10 @@ class Agent(_ToolExecutorMixin, _ProviderCallerMixin, _LifecycleMixin, _MemoryMa
160
160
  ... memory=ConversationMemory(max_messages=20)
161
161
  ... )
162
162
  """
163
- if not tools:
164
- raise ValueError("Agent requires at least one tool.")
165
-
166
- self.tools = tools
167
- self._tools_by_name = {tool.name: tool for tool in tools}
163
+ # An empty tool list is valid: a pure conversational agent (no tools)
164
+ # is a normal use case — the provider is simply called with no tools.
165
+ self.tools = tools or []
166
+ self._tools_by_name = {tool.name: tool for tool in self.tools}
168
167
  self.provider = provider or OpenAIProvider()
169
168
  strategy = config.reasoning_strategy if config else None
170
169
  if prompt_builder:
@@ -248,10 +247,16 @@ class Agent(_ToolExecutorMixin, _ProviderCallerMixin, _LifecycleMixin, _MemoryMa
248
247
  def _effective_model(self) -> str:
249
248
  """The model to use for the current iteration.
250
249
 
251
- Returns the model set by ``model_selector`` if active, otherwise
252
- falls back to ``self.config.model``.
250
+ Resolution order: a ``model_selector`` override, then an explicit
251
+ ``config.model``, then the provider's own ``default_model``. Without the
252
+ provider fallback a non-OpenAI provider would receive the OpenAI default
253
+ and 404. The final ``"gpt-5-mini"`` only applies to providers that expose
254
+ no default (e.g. the LocalProvider stub, which ignores the model).
253
255
  """
254
- return getattr(self, "_current_model", None) or self.config.model
256
+ override = getattr(self, "_current_model", None) or self.config.model
257
+ if override:
258
+ return override
259
+ return getattr(self.provider, "default_model", None) or "gpt-5-mini"
255
260
 
256
261
  def __call__(
257
262
  self,
@@ -316,14 +321,11 @@ class Agent(_ToolExecutorMixin, _ProviderCallerMixin, _LifecycleMixin, _MemoryMa
316
321
 
317
322
  Raises:
318
323
  KeyError: If no tool with that name exists.
319
- ValueError: If removing would leave the agent with zero tools.
320
324
  """
321
325
  if tool_name not in self._tools_by_name:
322
326
  raise KeyError(
323
327
  f"Tool '{tool_name}' not found. Available: {', '.join(self._tools_by_name.keys())}"
324
328
  )
325
- if len(self.tools) <= 1:
326
- raise ValueError("Agent requires at least one tool.")
327
329
 
328
330
  removed = self._tools_by_name.pop(tool_name)
329
331
  self.tools = [t for t in self.tools if t.name != tool_name]
@@ -1391,8 +1393,21 @@ class Agent(_ToolExecutorMixin, _ProviderCallerMixin, _LifecycleMixin, _MemoryMa
1391
1393
  parent_run_id: Optional run-ID of a parent agent for trace linking.
1392
1394
 
1393
1395
  Yields:
1394
- StreamChunk: Intermediate content chunks.
1395
- AgentResult: The final result object (yielded at the very end).
1396
+ StreamChunk: incremental content deltas (and tool-call chunks).
1397
+ AgentResult: the final, complete result yielded once at the very
1398
+ end. Its ``.content`` is the WHOLE answer, not a delta.
1399
+
1400
+ Consuming the stream — accumulate the ``StreamChunk`` deltas and treat
1401
+ the terminal ``AgentResult`` separately. Do NOT add the final
1402
+ ``AgentResult.content`` to the accumulated deltas, or you will get the
1403
+ answer twice::
1404
+
1405
+ text = ""
1406
+ async for chunk in agent.astream("..."):
1407
+ if isinstance(chunk, StreamChunk):
1408
+ text += chunk.content or "" # deltas only
1409
+ else: # AgentResult (terminal)
1410
+ result = chunk # full answer + metadata
1396
1411
  """
1397
1412
  messages = self._normalize_messages(messages)
1398
1413
 
@@ -172,7 +172,9 @@ class AgentRouter:
172
172
  response = HealthResponse(
173
173
  status="ok",
174
174
  version=__version__,
175
- model=self.agent.config.model,
175
+ # Report the resolved model (config.model may be None = use the
176
+ # provider's default).
177
+ model=self.agent._effective_model,
176
178
  provider=getattr(self.agent.provider, "name", "unknown"),
177
179
  tools=[t.name for t in self.agent.tools],
178
180
  )
@@ -188,7 +190,7 @@ class AgentRouter:
188
190
  """Handle GET /schema."""
189
191
  return {
190
192
  "tools": [t.schema() for t in self.agent.tools],
191
- "model": self.agent.config.model,
193
+ "model": self.agent._effective_model,
192
194
  }
193
195
 
194
196
 
@@ -328,6 +328,15 @@ class AgentResult:
328
328
  {'query': 'Python'}
329
329
  >>> result.iterations
330
330
  2
331
+
332
+ Structured output: when ``response_format`` is set, the validated object is
333
+ on ``result.parsed`` — ``result.content`` stays the raw JSON *text*::
334
+
335
+ >>> result = agent.run("Extract: John is 30", response_format=Person)
336
+ >>> result.parsed # the typed object you want
337
+ Person(name='John', age=30)
338
+ >>> result.content # the JSON string, NOT the object
339
+ '{"name": "John", "age": 30}'
331
340
  """
332
341
 
333
342
  message: Message
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: selectools
3
- Version: 0.27.1
3
+ Version: 0.27.2
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>
@@ -116,6 +116,10 @@ result = AgentGraph.chain(planner, writer, reviewer).run("Write a blog post")
116
116
 
117
117
  ## What's New in v0.27
118
118
 
119
+ ### v0.27.2 — Provider Model Fix & Tool-less Agents
120
+
121
+ Fixes a P0: the agent ignored every provider's default model and sent `gpt-5-mini` to all of them, so **any non-OpenAI provider (Anthropic, Gemini, Ollama, LiteLLM) 404'd on every request**. `AgentConfig.model` now defaults to `None` and resolves to the provider's own default. Also: `Agent(tools=[])` is now valid (pure conversational agents), and the structured-output (`result.parsed` vs `.content`) and streaming (accumulate `StreamChunk` deltas, not the terminal `AgentResult`) sharp edges are documented.
122
+
119
123
  ### v0.27.1 — Bug-Hunt Patch
120
124
 
121
125
  An adversarial bug hunt of the v0.27.0 surface fixed 10 confirmed bugs (no API changes, no breaking changes). Highlights: scheduled agents recorded the `AgentResult` repr instead of the answer text; `PromptInjectionGuardrail` blocked benign requests ("pretend you are a pirate", "show the rules"); `s3_get_object` leaked its HTTP connection; and unified memory persisted un-redacted input in async mode. See `CHANGELOG.md` for the full list.
@@ -157,3 +157,49 @@ class TestModelSwitching:
157
157
  # If it weren't reset, the second run would start with "switched"
158
158
  # instead of "default", and model_selector would see it's already
159
159
  # "switched" and not fire on_model_switch
160
+
161
+
162
+ # --------------------------------------------------------------------------- #
163
+ # Bug hunt 2026-06-14: agent must use the provider's default_model, not a
164
+ # hardcoded "gpt-5-mini", when config.model is unset.
165
+ # --------------------------------------------------------------------------- #
166
+
167
+
168
+ class _ModelCapturingProvider:
169
+ """Records the `model` the agent passes to complete()."""
170
+
171
+ name = "capture"
172
+
173
+ def __init__(self, default_model: str) -> None:
174
+ self.default_model = default_model
175
+ self.seen_models: list = []
176
+
177
+ def complete(self, *, model=None, system_prompt="", messages, tools=None, **kw):
178
+ self.seen_models.append(model)
179
+ return _resp("done")
180
+
181
+ async def acomplete(self, *, model=None, system_prompt="", messages, tools=None, **kw):
182
+ self.seen_models.append(model)
183
+ return _resp("done")
184
+
185
+
186
+ def test_uses_provider_default_model_when_config_model_unset():
187
+ prov = _ModelCapturingProvider(default_model="claude-sonnet-4-6")
188
+ agent = Agent(tools=[_DUMMY], provider=prov, config=AgentConfig())
189
+ assert agent._effective_model == "claude-sonnet-4-6"
190
+ agent.run("hi")
191
+ assert prov.seen_models == ["claude-sonnet-4-6"] # NOT "gpt-5-mini"
192
+
193
+
194
+ def test_explicit_config_model_overrides_provider_default():
195
+ prov = _ModelCapturingProvider(default_model="claude-sonnet-4-6")
196
+ agent = Agent(tools=[_DUMMY], provider=prov, config=AgentConfig(model="gpt-4o"))
197
+ assert agent._effective_model == "gpt-4o"
198
+ agent.run("hi")
199
+ assert prov.seen_models == ["gpt-4o"]
200
+
201
+
202
+ def test_config_model_defaults_to_none():
203
+ # The default must be None (sentinel for "use the provider default"), not a
204
+ # hardcoded model id that would reach every provider.
205
+ assert AgentConfig().model is None
File without changes
File without changes