fix(local): recognize unqualified hostnames as local endpoints (#9248)
Docker Compose service names (e.g. ollama, litellm, hermes-litellm) are unqualified hostnames with no dots. These are always local — they resolve via Docker DNS, /etc/hosts, or mDNS. Without this fix, the stale stream timeout fires on local LLM proxies, causing infinite reconnect loops. Closes #7905
This commit is contained in:
@ -441,6 +441,10 @@ def is_local_endpoint(base_url: str) -> bool:
|
|||||||
# Docker / Podman / Lima internal DNS names (e.g. host.docker.internal)
|
# Docker / Podman / Lima internal DNS names (e.g. host.docker.internal)
|
||||||
if any(host.endswith(suffix) for suffix in _CONTAINER_LOCAL_SUFFIXES):
|
if any(host.endswith(suffix) for suffix in _CONTAINER_LOCAL_SUFFIXES):
|
||||||
return True
|
return True
|
||||||
|
# Unqualified hostnames (no dots) are local by definition — Docker
|
||||||
|
# Compose service names, /etc/hosts entries, or mDNS names.
|
||||||
|
if host and "." not in host:
|
||||||
|
return True
|
||||||
# RFC-1918 private ranges, link-local, and Tailscale CGNAT
|
# RFC-1918 private ranges, link-local, and Tailscale CGNAT
|
||||||
try:
|
try:
|
||||||
addr = ipaddress.ip_address(host)
|
addr = ipaddress.ip_address(host)
|
||||||
|
|||||||
@ -98,6 +98,16 @@ class TestIsLocalEndpoint:
|
|||||||
def test_container_dns_names(self, url):
|
def test_container_dns_names(self, url):
|
||||||
assert is_local_endpoint(url) is True
|
assert is_local_endpoint(url) is True
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("url", [
|
||||||
|
"http://ollama:11434",
|
||||||
|
"http://litellm:4000/v1",
|
||||||
|
"http://hermes-litellm:8080",
|
||||||
|
"http://vllm:8000",
|
||||||
|
])
|
||||||
|
def test_unqualified_docker_hostnames(self, url):
|
||||||
|
"""Unqualified hostnames (no dots) are local — Docker Compose, /etc/hosts, etc."""
|
||||||
|
assert is_local_endpoint(url) is True
|
||||||
|
|
||||||
@pytest.mark.parametrize("url", [
|
@pytest.mark.parametrize("url", [
|
||||||
"https://api.openai.com",
|
"https://api.openai.com",
|
||||||
"https://openrouter.ai/api",
|
"https://openrouter.ai/api",
|
||||||
|
|||||||
Reference in New Issue
Block a user