Files
SciMesh/scimesh/worker/config.py
T

47 lines
1.8 KiB
Python

"""Configuration parsing for the worker command."""
from __future__ import annotations
from dataclasses import dataclass
from pathlib import Path
import os
@dataclass(frozen=True)
class WorkerConfig:
coordinator_url: str
worker_id: str
work_dir: Path
poll_interval: float = 2.0
request_timeout: float = 30.0
heartbeat_interval: float = 15.0
bearer_token: str | None = None
cleanup_after_seconds: float | None = None
capabilities: tuple[str, ...] = ("similarity-search", "similarity-graph")
def __post_init__(self) -> None:
if self.poll_interval <= 0:
raise ValueError("poll_interval must be positive")
if self.request_timeout <= 0:
raise ValueError("request_timeout must be positive")
if self.heartbeat_interval <= 0:
raise ValueError("heartbeat_interval must be positive")
@classmethod
def from_environment(cls) -> "WorkerConfig":
url = os.getenv("SCIMESH_COORDINATOR_URL")
worker_id = os.getenv("SCIMESH_WORKER_ID")
if not url or not worker_id:
raise ValueError("SCIMESH_COORDINATOR_URL and SCIMESH_WORKER_ID are required")
cleanup = os.getenv("SCIMESH_CLEANUP_AFTER_SECONDS")
return cls(
coordinator_url=url.rstrip("/"),
worker_id=worker_id,
work_dir=Path(os.getenv("SCIMESH_WORK_DIR", "./scimesh-worker-data")),
poll_interval=float(os.getenv("SCIMESH_POLL_INTERVAL", "2")),
request_timeout=float(os.getenv("SCIMESH_REQUEST_TIMEOUT", "30")),
heartbeat_interval=float(os.getenv("SCIMESH_HEARTBEAT_INTERVAL", "15")),
bearer_token=os.getenv("SCIMESH_BEARER_TOKEN"),
cleanup_after_seconds=float(cleanup) if cleanup else None,
)