From a0b1dd7861d4a794240d58c3f23361de5bb393d2 Mon Sep 17 00:00:00 2001 From: tin Date: Thu, 30 Jul 2026 21:07:13 +0000 Subject: [PATCH] refactor(proxy): drop model-change pubsub env knobs The channel name and the poll/reconnect timings were configurability nobody asked for, and each new os.getenv key must be documented in the docs repo before CI's env-key check passes. They are plain module constants now. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/constants.py | 13 ++++--------- litellm/litellm_core_utils/env_utils.py | 15 --------------- litellm/proxy/model_change_broadcast.py | 6 +----- 3 files changed, 5 insertions(+), 29 deletions(-) diff --git a/litellm/constants.py b/litellm/constants.py index 3f99676bbde..7c4e92bac59 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -2,11 +2,7 @@ import os import sys from typing import List, Literal, Optional -from litellm.litellm_core_utils.env_utils import ( - get_env_float, - get_env_int, - get_env_int_or_none, -) +from litellm.litellm_core_utils.env_utils import get_env_int, get_env_int_or_none DEFAULT_HEALTH_CHECK_PROMPT = str(os.getenv("DEFAULT_HEALTH_CHECK_PROMPT", "test from litellm")) AZURE_DEFAULT_RESPONSES_API_VERSION = str(os.getenv("AZURE_DEFAULT_RESPONSES_API_VERSION", "preview")) @@ -1482,10 +1478,9 @@ PROXY_BUDGET_RESCHEDULER_MAX_TIME = int(os.getenv("PROXY_BUDGET_RESCHEDULER_MAX_ PROXY_BATCH_WRITE_AT = int(os.getenv("PROXY_BATCH_WRITE_AT", 10)) # in seconds, increased from 10 PROXY_CONFIG_RELOAD_INTERVAL_SECONDS = get_env_int("PROXY_CONFIG_RELOAD_INTERVAL_SECONDS", 30) -MODEL_CHANGE_PUBSUB_ENABLED = os.getenv("MODEL_CHANGE_PUBSUB_ENABLED", "true").lower() in ["true", "1"] -MODEL_CHANGE_PUBSUB_CHANNEL = os.getenv("MODEL_CHANGE_PUBSUB_CHANNEL", "litellm:model_changes") -MODEL_CHANGE_PUBSUB_POLL_TIMEOUT_SECONDS = get_env_float("MODEL_CHANGE_PUBSUB_POLL_TIMEOUT_SECONDS", 0.5) -MODEL_CHANGE_PUBSUB_RECONNECT_SECONDS = get_env_float("MODEL_CHANGE_PUBSUB_RECONNECT_SECONDS", 5.0) +MODEL_CHANGE_PUBSUB_CHANNEL = "litellm:model_changes" +MODEL_CHANGE_PUBSUB_POLL_TIMEOUT_SECONDS = 0.5 +MODEL_CHANGE_PUBSUB_RECONNECT_SECONDS = 5.0 # APScheduler Configuration - MEMORY LEAK FIX # These settings prevent memory leaks in APScheduler's normalize() and _apply_jitter() functions diff --git a/litellm/litellm_core_utils/env_utils.py b/litellm/litellm_core_utils/env_utils.py index bc124eb1ae5..3a64f44fb25 100644 --- a/litellm/litellm_core_utils/env_utils.py +++ b/litellm/litellm_core_utils/env_utils.py @@ -21,21 +21,6 @@ def get_env_int(env_var: str, default: int) -> int: return default -def get_env_float(env_var: str, default: float) -> float: - """Parse an environment variable as a float, falling back to default on invalid values. - - Same forgiving behaviour as `get_env_int`, so a typo in a tuning knob cannot crash - the process at import time. - """ - raw = os.getenv(env_var) - if raw is None: - return default - try: - return float(raw.strip()) - except (ValueError, TypeError): - return default - - def get_env_int_or_none(env_var: str) -> int | None: """Parse an environment variable as an integer, returning None when it is unset or unusable. diff --git a/litellm/proxy/model_change_broadcast.py b/litellm/proxy/model_change_broadcast.py index b5f25ef4ca2..e82d5cdc09f 100644 --- a/litellm/proxy/model_change_broadcast.py +++ b/litellm/proxy/model_change_broadcast.py @@ -25,7 +25,6 @@ from litellm._logging import verbose_proxy_logger from litellm._uuid import uuid from litellm.constants import ( MODEL_CHANGE_PUBSUB_CHANNEL, - MODEL_CHANGE_PUBSUB_ENABLED, MODEL_CHANGE_PUBSUB_POLL_TIMEOUT_SECONDS, MODEL_CHANGE_PUBSUB_RECONNECT_SECONDS, ) @@ -84,9 +83,6 @@ async def broadcast_model_change( Tell sibling pods that the model table changed. Never raises: the write it follows has already succeeded, and the periodic reconcile still converges. """ - if not MODEL_CHANGE_PUBSUB_ENABLED: - return - backend = redis_cache if redis_cache is not None else _coordination_redis() if backend is None: return @@ -210,7 +206,7 @@ class ModelChangeSubscriberHandle: redis_cache: RedisPubSubBackend | None, reconcile: Callable[[], Awaitable[None]], ) -> None: - if not MODEL_CHANGE_PUBSUB_ENABLED or redis_cache is None: + if redis_cache is None: return self.stop() subscriber = ModelChangeSubscriber(redis_cache=redis_cache, reconcile=reconcile)