fix(providers): guard chat_with_retry against explicit None max_tokens (#3102)

This commit is contained in:
04cb
2026-04-15 23:52:38 +08:00
committed by Xubin Ren
parent 6829b8b475
commit 54f7ad3752
2 changed files with 73 additions and 5 deletions
+17 -5
View File
@@ -512,10 +512,14 @@ class LLMProvider(ABC):
on_retry_wait: Callable[[str], Awaitable[None]] | None = None,
) -> LLMResponse:
"""Call chat_stream() with retry on transient provider failures."""
if max_tokens is self._SENTINEL:
if max_tokens is self._SENTINEL or max_tokens is None:
max_tokens = self.generation.max_tokens
if temperature is self._SENTINEL:
if max_tokens is None:
max_tokens = GenerationSettings.max_tokens
if temperature is self._SENTINEL or temperature is None:
temperature = self.generation.temperature
if temperature is None:
temperature = GenerationSettings.temperature
if reasoning_effort is self._SENTINEL:
reasoning_effort = self.generation.reasoning_effort
@@ -549,12 +553,20 @@ class LLMProvider(ABC):
Parameters default to ``self.generation`` when not explicitly passed,
so callers no longer need to thread temperature / max_tokens /
reasoning_effort through every layer.
reasoning_effort through every layer. Explicit ``None`` is also
normalized to the provider's generation defaults, with a final fallback
to :class:`GenerationSettings` class defaults so that downstream
``_build_kwargs`` never sees ``None`` for ``max_tokens`` / ``temperature``
(which would crash ``max(1, max_tokens)``).
"""
if max_tokens is self._SENTINEL:
if max_tokens is self._SENTINEL or max_tokens is None:
max_tokens = self.generation.max_tokens
if temperature is self._SENTINEL:
if max_tokens is None:
max_tokens = GenerationSettings.max_tokens
if temperature is self._SENTINEL or temperature is None:
temperature = self.generation.temperature
if temperature is None:
temperature = GenerationSettings.temperature
if reasoning_effort is self._SENTINEL:
reasoning_effort = self.generation.reasoning_effort