From d1d61e9c127922dcef42bb35f5d34afb000a35a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Cabrero-Holgueras?= Date: Wed, 21 Jan 2026 13:50:00 +0100 Subject: [PATCH 1/2] fix: redis url not properly obtained --- nilai-api/src/nilai_api/config/database.py | 6 ++++-- nilai-api/src/nilai_api/state.py | 4 +--- nilai-models/src/nilai_models/daemon.py | 4 +--- .../src/nilai_models/lmstudio_announcer.py | 13 ++++--------- .../src/nilai_common/config/host.py | 11 ++++------- .../nilai-common/src/nilai_common/discovery.py | 17 +++++++++++------ tests/unit/nilai-common/test_discovery.py | 8 +++----- 7 files changed, 28 insertions(+), 35 deletions(-) diff --git a/nilai-api/src/nilai_api/config/database.py b/nilai-api/src/nilai_api/config/database.py index 31c8aa06..3e9aa761 100644 --- a/nilai-api/src/nilai_api/config/database.py +++ b/nilai-api/src/nilai_api/config/database.py @@ -10,8 +10,10 @@ class DatabaseConfig(BaseModel): class DiscoveryConfig(BaseModel): - host: str = Field(default="localhost", description="Redis host for discovery") - port: int = Field(default=6379, description="Redis port for discovery") + url: str = Field( + default="redis://localhost:6379", + description="Redis URL for discovery (preferred default)", + ) class RedisConfig(BaseModel): diff --git a/nilai-api/src/nilai_api/state.py b/nilai-api/src/nilai_api/state.py index 37385a65..01e02149 100644 --- a/nilai-api/src/nilai_api/state.py +++ b/nilai-api/src/nilai_api/state.py @@ -16,9 +16,7 @@ def __init__(self): self.private_key, self.public_key, self.b64_public_key = generate_key_pair() self.sem = Semaphore(2) - self.discovery_service = ModelServiceDiscovery( - host=CONFIG.discovery.host, port=CONFIG.discovery.port - ) + self.discovery_service = ModelServiceDiscovery(url=CONFIG.discovery.url) self._discovery_initialized = False self._uptime = time.time() diff --git a/nilai-models/src/nilai_models/daemon.py b/nilai-models/src/nilai_models/daemon.py index d486ff7e..998856a5 100644 --- a/nilai-models/src/nilai_models/daemon.py +++ b/nilai-models/src/nilai_models/daemon.py @@ -89,9 +89,7 @@ async def main(): logging.basicConfig(level=logging.INFO) # Initialize discovery service - discovery_service = ModelServiceDiscovery( - host=SETTINGS.discovery_host, port=SETTINGS.discovery_port - ) + discovery_service = ModelServiceDiscovery(url=SETTINGS.discovery_url) await discovery_service.initialize() # Fetch metadata and create endpoint diff --git a/nilai-models/src/nilai_models/lmstudio_announcer.py b/nilai-models/src/nilai_models/lmstudio_announcer.py index a8e83b3f..ce58fd6e 100644 --- a/nilai-models/src/nilai_models/lmstudio_announcer.py +++ b/nilai-models/src/nilai_models/lmstudio_announcer.py @@ -76,15 +76,12 @@ async def _fetch_model_ids( async def _announce_model( metadata: ModelMetadata, base_url: str, - discovery_host: str, - discovery_port: int, + discovery_url: str, lease_ttl: int, prefix: str, ): """Register and maintain a model announcement in Redis.""" - discovery = ModelServiceDiscovery( - host=discovery_host, port=discovery_port, lease_ttl=lease_ttl - ) + discovery = ModelServiceDiscovery(url=discovery_url, lease_ttl=lease_ttl) await discovery.initialize() endpoint = ModelEndpoint(url=base_url.rstrip("/"), metadata=metadata) @@ -198,8 +195,7 @@ async def main(): "Announcing LMStudio models %s via %s with Redis at %s:%s", ", ".join(model_ids), registration_url, - SETTINGS.discovery_host, - SETTINGS.discovery_port, + SETTINGS.discovery_url, ) # Create announcement tasks for all models @@ -220,8 +216,7 @@ async def main(): multimodal_default, ), base_url=registration_url, - discovery_host=SETTINGS.discovery_host, - discovery_port=SETTINGS.discovery_port, + discovery_url=SETTINGS.discovery_url, lease_ttl=lease_ttl, prefix=discovery_prefix, ) diff --git a/packages/nilai-common/src/nilai_common/config/host.py b/packages/nilai-common/src/nilai_common/config/host.py index 14e93f7f..3855824e 100644 --- a/packages/nilai-common/src/nilai_common/config/host.py +++ b/packages/nilai-common/src/nilai_common/config/host.py @@ -14,11 +14,9 @@ class HostSettings(BaseModel): host: str = Field(default="localhost", description="Host of the service") port: int = Field(default=8000, description="Port of the service") - discovery_host: str = Field( - default="localhost", description="Host of the discovery service" - ) - discovery_port: int = Field( - default=6379, description="Port of the discovery service" + discovery_url: str = Field( + default="redis://redis:6379", + description="Redis URL of the discovery service (preferred)", ) gunicorn_workers: int = Field(default=10, description="Number of gunicorn workers") @@ -27,7 +25,6 @@ class HostSettings(BaseModel): SETTINGS: HostSettings = HostSettings( host=str(os.getenv("SVC_HOST", "localhost")), port=int(os.getenv("SVC_PORT", 8000)), - discovery_host=str(os.getenv("DISCOVERY_HOST", "redis")), - discovery_port=int(os.getenv("DISCOVERY_PORT", 6379)), + discovery_url=str(os.getenv("DISCOVERY_URL", "redis://redis:6379")), gunicorn_workers=int(os.getenv("NILAI_GUNICORN_WORKERS", 10)), ) diff --git a/packages/nilai-common/src/nilai_common/discovery.py b/packages/nilai-common/src/nilai_common/discovery.py index 345a9a6d..66a6dcea 100644 --- a/packages/nilai-common/src/nilai_common/discovery.py +++ b/packages/nilai-common/src/nilai_common/discovery.py @@ -14,17 +14,21 @@ class ModelServiceDiscovery: - def __init__(self, host: str = "localhost", port: int = 6379, lease_ttl: int = 60): + def __init__( + self, + url: str = "redis://localhost:6379", + lease_ttl: int = 60, + ): """ Initialize Redis client for model service discovery. + :param url: Redis URL (e.g., redis:// or rediss://). Preferred default. :param host: Redis server host :param port: Redis server port :param lease_ttl: TTL time for endpoint registration (in seconds) """ - self.host = host - self.port = port self.lease_ttl = lease_ttl + self.url = url self._client: Optional[redis.Redis] = None self._model_key: Optional[str] = None @@ -39,9 +43,10 @@ async def initialize(self): Initialize the Redis client. """ if self._client is None: - self._client = await redis.Redis( - host=self.host, port=self.port, decode_responses=True - ) + if self.url: + self._client = redis.from_url(self.url, decode_responses=True) + else: + raise ValueError("A Redis URL is required for service discovery") @property async def client(self) -> redis.Redis: diff --git a/tests/unit/nilai-common/test_discovery.py b/tests/unit/nilai-common/test_discovery.py index 363e99d0..d0e075b2 100644 --- a/tests/unit/nilai-common/test_discovery.py +++ b/tests/unit/nilai-common/test_discovery.py @@ -10,7 +10,7 @@ async def model_service_discovery(redis_host_port): """Create a ModelServiceDiscovery instance connected to the test Redis container.""" host, port = redis_host_port - discovery = ModelServiceDiscovery(host=host, port=port, lease_ttl=60) + discovery = ModelServiceDiscovery(url=f"redis://{host}:{port}", lease_ttl=60) await discovery.initialize() yield discovery await discovery.close() @@ -172,8 +172,7 @@ async def test_keep_alive(model_service_discovery, model_endpoint): """Test the keep_alive functionality that refreshes TTL.""" # Register a model with a short TTL short_ttl_discovery = ModelServiceDiscovery( - host=model_service_discovery.host, - port=model_service_discovery.port, + url=model_service_discovery.url, lease_ttl=2, # 2 second TTL ) await short_ttl_discovery.initialize() @@ -214,8 +213,7 @@ async def test_keep_alive_with_stored_key(model_service_discovery, model_endpoin """Test keep_alive using the stored key from registration.""" # Register a model with a short TTL short_ttl_discovery = ModelServiceDiscovery( - host=model_service_discovery.host, - port=model_service_discovery.port, + url=model_service_discovery.url, lease_ttl=2, # 2 second TTL ) await short_ttl_discovery.initialize() From 93ebdf4c7c836c9fbb437b865a14b31cdc70736e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Cabrero-Holgueras?= Date: Wed, 21 Jan 2026 14:26:44 +0100 Subject: [PATCH 2/2] fix: removed DISCOVERY_HOST and DISCOVERY_PORT --- .env.ci | 3 +-- .env.sample | 3 +++ docker/compose/docker-compose.deepseek-14b-gpu.yml | 3 +-- docker/compose/docker-compose.gemma-27b-gpu.yml | 3 +-- docker/compose/docker-compose.gemma-4b-gpu.ci.yml | 3 +-- docker/compose/docker-compose.gpt-120b-gpu.yml | 3 +-- docker/compose/docker-compose.gpt-20b-gpu.ci.yml | 3 +-- docker/compose/docker-compose.gpt-20b-gpu.yml | 3 +-- docker/compose/docker-compose.llama-1b-cpu.yml | 3 +-- docker/compose/docker-compose.llama-1b-gpu.ci.yml | 3 +-- docker/compose/docker-compose.llama-1b-gpu.yml | 3 +-- docker/compose/docker-compose.llama-3b-gpu.yml | 3 +-- docker/compose/docker-compose.llama-70b-gpu.yml | 3 +-- docker/compose/docker-compose.llama-8b-gpu.yml | 3 +-- docker/compose/docker-compose.lmstudio.yml | 3 +-- docker/compose/docker-compose.nilai-prod-1.yml | 3 +-- docker/compose/docker-compose.nilai-prod-2.yml | 6 ++---- docker/compose/docker-compose.qwen-2b-gpu.ci.yml | 3 +-- 18 files changed, 21 insertions(+), 36 deletions(-) diff --git a/.env.ci b/.env.ci index 0ecaea1d..58dff8cc 100644 --- a/.env.ci +++ b/.env.ci @@ -42,8 +42,7 @@ POSTGRES_PORT = 5432 REDIS_URL = "redis://redis:6379" # Model Discovery Redis Docker Compose Config -DISCOVERY_HOST = "redis" -DISCOVERY_PORT = 6379 +DISCOVERY_URL = "redis://redis:6379" # Grafana Docker Compose Config GF_SECURITY_ADMIN_USER = "admin" diff --git a/.env.sample b/.env.sample index 6c623b66..61db679b 100644 --- a/.env.sample +++ b/.env.sample @@ -37,6 +37,9 @@ POSTGRES_PORT = 5432 # Redis Docker Compose Config REDIS_URL = "redis://redis:6379" +# Model Discovery Redis Docker Compose Config +DISCOVERY_URL = "redis://redis:6379" + # Etcd Docker Compose Config ETCD_HOST = "etcd" ETCD_PORT = 2379 diff --git a/docker/compose/docker-compose.deepseek-14b-gpu.yml b/docker/compose/docker-compose.deepseek-14b-gpu.yml index 187c4225..d259715c 100644 --- a/docker/compose/docker-compose.deepseek-14b-gpu.yml +++ b/docker/compose/docker-compose.deepseek-14b-gpu.yml @@ -24,8 +24,7 @@ services: environment: - SVC_HOST=deepseek_14b_gpu - SVC_PORT=8000 - - DISCOVERY_HOST=redis - - DISCOVERY_PORT=6379 + - DISCOVERY_URL=redis://redis:6379 - TOOL_SUPPORT=false volumes: - hugging_face_models:/root/.cache/huggingface # cache models diff --git a/docker/compose/docker-compose.gemma-27b-gpu.yml b/docker/compose/docker-compose.gemma-27b-gpu.yml index 185a4855..78e6e8c3 100644 --- a/docker/compose/docker-compose.gemma-27b-gpu.yml +++ b/docker/compose/docker-compose.gemma-27b-gpu.yml @@ -29,8 +29,7 @@ services: environment: - SVC_HOST=gemma_27b_gpu - SVC_PORT=8000 - - DISCOVERY_HOST=redis - - DISCOVERY_PORT=6379 + - DISCOVERY_URL=redis://redis:6379 - TOOL_SUPPORT=false - MULTIMODAL_SUPPORT=true - MODEL_NUM_RETRIES=60 diff --git a/docker/compose/docker-compose.gemma-4b-gpu.ci.yml b/docker/compose/docker-compose.gemma-4b-gpu.ci.yml index 3302d82f..6c7a266f 100644 --- a/docker/compose/docker-compose.gemma-4b-gpu.ci.yml +++ b/docker/compose/docker-compose.gemma-4b-gpu.ci.yml @@ -28,8 +28,7 @@ services: environment: - SVC_HOST=gemma_4b_gpu - SVC_PORT=8000 - - DISCOVERY_HOST=redis - - DISCOVERY_PORT=6379 + - DISCOVERY_URL=redis://redis:6379 - TOOL_SUPPORT=false - MULTIMODAL_SUPPORT=true - CUDA_LAUNCH_BLOCKING=1 diff --git a/docker/compose/docker-compose.gpt-120b-gpu.yml b/docker/compose/docker-compose.gpt-120b-gpu.yml index 3ab05936..f7898cf7 100644 --- a/docker/compose/docker-compose.gpt-120b-gpu.yml +++ b/docker/compose/docker-compose.gpt-120b-gpu.yml @@ -28,8 +28,7 @@ services: environment: - SVC_HOST=gpt_120b_gpu - SVC_PORT=8000 - - DISCOVERY_HOST=redis - - DISCOVERY_PORT=6379 + - DISCOVERY_URL=redis://redis:6379 - TOOL_SUPPORT=true volumes: - hugging_face_models:/root/.cache/huggingface # cache models diff --git a/docker/compose/docker-compose.gpt-20b-gpu.ci.yml b/docker/compose/docker-compose.gpt-20b-gpu.ci.yml index 5fb24352..73988af0 100644 --- a/docker/compose/docker-compose.gpt-20b-gpu.ci.yml +++ b/docker/compose/docker-compose.gpt-20b-gpu.ci.yml @@ -23,8 +23,7 @@ services: environment: - SVC_HOST=gpt_20b_gpu - SVC_PORT=8000 - - DISCOVERY_HOST=redis - - DISCOVERY_PORT=6379 + - DISCOVERY_URL=redis://redis:6379 - TOOL_SUPPORT=true volumes: - hugging_face_models:/root/.cache/huggingface # cache models diff --git a/docker/compose/docker-compose.gpt-20b-gpu.yml b/docker/compose/docker-compose.gpt-20b-gpu.yml index 9694249c..c84ba762 100644 --- a/docker/compose/docker-compose.gpt-20b-gpu.yml +++ b/docker/compose/docker-compose.gpt-20b-gpu.yml @@ -28,8 +28,7 @@ services: environment: - SVC_HOST=gpt_20b_gpu - SVC_PORT=8000 - - DISCOVERY_HOST=redis - - DISCOVERY_PORT=6379 + - DISCOVERY_URL=redis://redis:6379 - TOOL_SUPPORT=true volumes: - hugging_face_models:/root/.cache/huggingface # cache models diff --git a/docker/compose/docker-compose.llama-1b-cpu.yml b/docker/compose/docker-compose.llama-1b-cpu.yml index bc402f01..4e97a31a 100644 --- a/docker/compose/docker-compose.llama-1b-cpu.yml +++ b/docker/compose/docker-compose.llama-1b-cpu.yml @@ -19,8 +19,7 @@ services: environment: - SVC_HOST=llama_1b_cpu - SVC_PORT=8000 - - DISCOVERY_HOST=redis - - DISCOVERY_PORT=6379 + - DISCOVERY_URL=redis://redis:6379 - TOOL_SUPPORT=true volumes: - hugging_face_models:/root/.cache/huggingface diff --git a/docker/compose/docker-compose.llama-1b-gpu.ci.yml b/docker/compose/docker-compose.llama-1b-gpu.ci.yml index eaa9ee33..1b8b242f 100644 --- a/docker/compose/docker-compose.llama-1b-gpu.ci.yml +++ b/docker/compose/docker-compose.llama-1b-gpu.ci.yml @@ -32,8 +32,7 @@ services: environment: - SVC_HOST=llama_1b_gpu - SVC_PORT=8000 - - DISCOVERY_HOST=redis - - DISCOVERY_PORT=6379 + - DISCOVERY_URL=redis://redis:6379 - TOOL_SUPPORT=true - CUDA_LAUNCH_BLOCKING=1 volumes: diff --git a/docker/compose/docker-compose.llama-1b-gpu.yml b/docker/compose/docker-compose.llama-1b-gpu.yml index 356913d0..9da1a810 100644 --- a/docker/compose/docker-compose.llama-1b-gpu.yml +++ b/docker/compose/docker-compose.llama-1b-gpu.yml @@ -30,8 +30,7 @@ services: environment: - SVC_HOST=llama_1b_gpu - SVC_PORT=8000 - - DISCOVERY_HOST=redis - - DISCOVERY_PORT=6379 + - DISCOVERY_URL=redis://redis:6379 - TOOL_SUPPORT=true volumes: - hugging_face_models:/root/.cache/huggingface # cache models diff --git a/docker/compose/docker-compose.llama-3b-gpu.yml b/docker/compose/docker-compose.llama-3b-gpu.yml index 35869ad4..14e85594 100644 --- a/docker/compose/docker-compose.llama-3b-gpu.yml +++ b/docker/compose/docker-compose.llama-3b-gpu.yml @@ -30,8 +30,7 @@ services: environment: - SVC_HOST=llama_3b_gpu - SVC_PORT=8000 - - DISCOVERY_HOST=redis - - DISCOVERY_PORT=6379 + - DISCOVERY_URL=redis://redis:6379 - TOOL_SUPPORT=true volumes: - hugging_face_models:/root/.cache/huggingface # cache models diff --git a/docker/compose/docker-compose.llama-70b-gpu.yml b/docker/compose/docker-compose.llama-70b-gpu.yml index 3a70d49d..b08a733e 100644 --- a/docker/compose/docker-compose.llama-70b-gpu.yml +++ b/docker/compose/docker-compose.llama-70b-gpu.yml @@ -30,8 +30,7 @@ services: environment: - SVC_HOST=llama_70b_gpu - SVC_PORT=8000 - - DISCOVERY_HOST=redis - - DISCOVERY_PORT=6379 + - DISCOVERY_URL=redis://redis:6379 - TOOL_SUPPORT=true volumes: - hugging_face_models:/root/.cache/huggingface # cache models diff --git a/docker/compose/docker-compose.llama-8b-gpu.yml b/docker/compose/docker-compose.llama-8b-gpu.yml index b9d1d00f..f2284c12 100644 --- a/docker/compose/docker-compose.llama-8b-gpu.yml +++ b/docker/compose/docker-compose.llama-8b-gpu.yml @@ -31,8 +31,7 @@ services: environment: - SVC_HOST=llama_8b_gpu - SVC_PORT=8000 - - DISCOVERY_HOST=redis - - DISCOVERY_PORT=6379 + - DISCOVERY_URL=redis://redis:6379 - TOOL_SUPPORT=true volumes: - hugging_face_models:/root/.cache/huggingface diff --git a/docker/compose/docker-compose.lmstudio.yml b/docker/compose/docker-compose.lmstudio.yml index ac01134c..222736d7 100644 --- a/docker/compose/docker-compose.lmstudio.yml +++ b/docker/compose/docker-compose.lmstudio.yml @@ -9,8 +9,7 @@ services: environment: - SVC_HOST=host.docker.internal - SVC_PORT=1234 - - DISCOVERY_HOST=redis - - DISCOVERY_PORT=6379 + - DISCOVERY_URL=redis://redis:6379 - LMSTUDIO_SUPPORTED_FEATURES=chat_completion extra_hosts: - "host.docker.internal:host-gateway" diff --git a/docker/compose/docker-compose.nilai-prod-1.yml b/docker/compose/docker-compose.nilai-prod-1.yml index 10c7c46e..416efa53 100644 --- a/docker/compose/docker-compose.nilai-prod-1.yml +++ b/docker/compose/docker-compose.nilai-prod-1.yml @@ -29,8 +29,7 @@ services: environment: - SVC_HOST=gemma_27b_gpu - SVC_PORT=8000 - - DISCOVERY_HOST=redis - - DISCOVERY_PORT=6379 + - DISCOVERY_URL=redis://redis:6379 - TOOL_SUPPORT=false - MULTIMODAL_SUPPORT=true - MODEL_NUM_RETRIES=60 diff --git a/docker/compose/docker-compose.nilai-prod-2.yml b/docker/compose/docker-compose.nilai-prod-2.yml index e48d266e..ac3e2eb8 100644 --- a/docker/compose/docker-compose.nilai-prod-2.yml +++ b/docker/compose/docker-compose.nilai-prod-2.yml @@ -37,8 +37,7 @@ services: environment: - SVC_HOST=llama_8b_gpu - SVC_PORT=8000 - - DISCOVERY_HOST=redis - - DISCOVERY_PORT=6379 + - DISCOVERY_URL=redis://redis:6379 - TOOL_SUPPORT=true volumes: - hugging_face_models:/root/.cache/huggingface @@ -77,8 +76,7 @@ services: environment: - SVC_HOST=gpt_20b_gpu - SVC_PORT=8000 - - DISCOVERY_HOST=redis - - DISCOVERY_PORT=6379 + - DISCOVERY_URL=redis://redis:6379 - TOOL_SUPPORT=true volumes: - hugging_face_models:/root/.cache/huggingface # cache models diff --git a/docker/compose/docker-compose.qwen-2b-gpu.ci.yml b/docker/compose/docker-compose.qwen-2b-gpu.ci.yml index fad095a5..9573729d 100644 --- a/docker/compose/docker-compose.qwen-2b-gpu.ci.yml +++ b/docker/compose/docker-compose.qwen-2b-gpu.ci.yml @@ -44,8 +44,7 @@ services: environment: SVC_HOST: qwen2vl_2b_gpu SVC_PORT: "8000" - DISCOVERY_HOST: redis - DISCOVERY_PORT: "6379" + DISCOVERY_URL: redis://redis:6379 TOOL_SUPPORT: "true" MULTIMODAL_SUPPORT: "true" CUDA_LAUNCH_BLOCKING: "1"