Files
odysseus/tests/test_llm_core_connect_timeout.py
cirim 056d1fb960 fix(llm): make connect timeout configurable
Use a configurable LLM_CONNECT_TIMEOUT for call and stream connect budgets instead of the previous hard-coded 3s default.
2026-06-15 15:11:38 +09:00

58 lines
2.1 KiB
Python

"""Regression tests for the configurable LLM connect timeout.
Background: chat uses the streaming path, which (unlike llm_call) does not retry
a connect error -- it marks the host and emits a 503 immediately. With the old
hard-coded connect=3.0s, a brief blip on the first (cold) connect of an idle
chat to an offshore/public endpoint surfaced as an intermittent 503 that cleared
on resend. The connect budget is now LLMConfig.CONNECT_TIMEOUT (env
LLM_CONNECT_TIMEOUT), applied via _call_timeout/_stream_timeout helpers.
"""
import importlib
import httpx
import pytest
from src import llm_core
from src.llm_core import LLMConfig, _call_timeout, _stream_timeout
def test_default_connect_timeout_is_widened_not_three():
# Regression guard: must not regress to the old too-tight 3.0s default.
assert LLMConfig.CONNECT_TIMEOUT >= 8.0
assert LLMConfig.CONNECT_TIMEOUT != 3.0
assert LLMConfig.CONNECT_TIMEOUT == 10.0
def test_call_timeout_uses_config_connect_and_passes_read():
t = _call_timeout(45)
assert isinstance(t, httpx.Timeout)
assert t.connect == LLMConfig.CONNECT_TIMEOUT
assert t.read == 45.0
assert t.write == 10.0
assert t.pool == 5.0
def test_stream_timeout_uses_config_connect_and_passes_read():
t = _stream_timeout(300)
assert isinstance(t, httpx.Timeout)
assert t.connect == LLMConfig.CONNECT_TIMEOUT
assert t.read == 300.0
assert t.write == 30.0
assert t.pool == 5.0
def test_helpers_are_config_driven(monkeypatch):
# Helpers read LLMConfig at call time, so ops can tune without code edits.
monkeypatch.setattr(LLMConfig, "CONNECT_TIMEOUT", 4.5)
assert _call_timeout(30).connect == 4.5
assert _stream_timeout(30).connect == 4.5
def test_env_override_is_honoured(monkeypatch):
monkeypatch.setenv("LLM_CONNECT_TIMEOUT", "6.5")
reloaded = importlib.reload(llm_core)
try:
assert reloaded.LLMConfig.CONNECT_TIMEOUT == 6.5
finally:
monkeypatch.delenv("LLM_CONNECT_TIMEOUT", raising=False)
importlib.reload(llm_core) # restore module-level default for other tests