This page documents the tested combinations of Python versions, provider SDKs, and optional dependencies. All combinations in the CI matrix are validated on every commit.
selectools requires Python 3.10 or newer (requires-python = ">=3.10"). Python 3.9 reached upstream end-of-life in October 2025 and was dropped ahead of the 1.0 release. The last series supporting 3.9 is 0.29.x; if you are stuck on 3.9, pin selectools<0.30. See MIGRATION_1.0 for details.
Model note: function calling on gemini-2.5-flash-lite¶
gemini-2.5-flash-lite supports function calling, but it is markedly less reliable at it than gemini-2.5-flash. It is known to intermittently return an empty candidate (often finish_reason=MALFORMED_FUNCTION_CALL or UNEXPECTED_TOOL_CALL) instead of a function call — see issue #66 and upstream reports (e.g. litellm#16651, deepagents#417). When this happens inside an Agent loop, the iteration produces neither text nor a tool call.
GeminiProvider logs a WARNING (logger selectools.providers.gemini_provider) whenever a tool-equipped response contains neither text nor tool calls, including the finish_reason. If you see this warning repeatedly with gemini-2.5-flash-lite, switch to gemini-2.5-flash, simplify your tool schemas, or reduce the number of tools per request.
GeminiProvider also sanitizes tool schemas for Gemini's API, which rejects two shapes that other providers accept (both were hard 400 errors before sanitization):
bare list parameters ({"type": "array"} without items) — a permissive items: {"type": "string"} is injected
Dict[K, V] parameters (additionalProperties) — stripped; the parameter degrades to a plain object
Ollama is accessed via the OpenAI-compatible API (OllamaProvider inherits _OpenAICompatProvider). No extra package required. Tested with Ollama server 0.3.x+.
LiteLLMProvider routes through the litellm package ([litellm] extra) and inherits its model coverage. Compatibility with individual upstream models follows LiteLLM's own support matrix.
If you discover a combination that should work but doesn't, please open an issue at github.com/johnnichev/selectools/issues with your Python version, OS, and the output of selectools doctor.