From fdecdfe77189b5efd09de6c63944781162343157 Mon Sep 17 00:00:00 2001 From: Tim Huff Date: Wed, 10 Jun 2026 15:53:28 -0700 Subject: [PATCH 1/4] Make GlobalConfig.refresh_rate Optional with 1-day cap - Change refresh_rate from float to Optional[float] with gt=0 and le=86400. Values above 86400s (1 day) are rejected at construction time; use None to disable refresh polling entirely. - Previously, values like 9999999999999 were accepted and silently caused time.sleep() to raise OverflowError in the inference-model-updater container, crashing it into CrashLoopBackOff. Co-authored-by: Cursor --- src/groundlight/edge/config.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/groundlight/edge/config.py b/src/groundlight/edge/config.py index 88678cec..a38e93e7 100644 --- a/src/groundlight/edge/config.py +++ b/src/groundlight/edge/config.py @@ -11,10 +11,16 @@ class GlobalConfig(BaseModel): # pylint: disable=too-few-public-methods model_config = ConfigDict(extra="ignore") - refresh_rate: float = Field( + refresh_rate: Optional[float] = Field( default=60.0, gt=0, - description="The interval (in seconds) at which the inference server checks for a new model binary update.", + le=86400, + description=( + "Interval (seconds) at which the model-updater polls for new model binaries. " + "Must be between 0 (exclusive) and 86400 (1 day). " + "Set to None to disable refresh polling entirely; detector add/remove from " + "set_config still takes effect immediately regardless of this setting." + ), ) confident_audit_rate: float = Field( default=1e-5, # A detector running at 1 FPS = ~100,000 IQ/day, so 1e-5 is ~1 confident IQ/day audited From a6186013b1ac9afd550cddb5271c4bed82ed2d6a Mon Sep 17 00:00:00 2001 From: Tim Huff Date: Wed, 10 Jun 2026 16:01:48 -0700 Subject: [PATCH 2/4] simplifying Pydantic object description. --- src/groundlight/edge/config.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/groundlight/edge/config.py b/src/groundlight/edge/config.py index a38e93e7..c5703bd1 100644 --- a/src/groundlight/edge/config.py +++ b/src/groundlight/edge/config.py @@ -18,8 +18,7 @@ class GlobalConfig(BaseModel): # pylint: disable=too-few-public-methods description=( "Interval (seconds) at which the model-updater polls for new model binaries. " "Must be between 0 (exclusive) and 86400 (1 day). " - "Set to None to disable refresh polling entirely; detector add/remove from " - "set_config still takes effect immediately regardless of this setting." + "Set to None to disable refresh polling entirely." ), ) confident_audit_rate: float = Field( From fb33eb3f227d7d93ebcbe05a5160354b2810b44e Mon Sep 17 00:00:00 2001 From: Tim Huff Date: Wed, 10 Jun 2026 16:06:11 -0700 Subject: [PATCH 3/4] bumping version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2623d6a3..a62070be 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ packages = [ {include = "**/*.py", from = "src"}, ] readme = "README.md" -version = "0.29.0" +version = "0.30.0" [tool.poetry.dependencies] # For certifi, use ">=" instead of "^" since it upgrades its "major version" every year, not really following semver From 3bab93e20306f7b6a122dc2a10ea10e21c78febb Mon Sep 17 00:00:00 2001 From: Tim Huff Date: Wed, 10 Jun 2026 16:23:27 -0700 Subject: [PATCH 4/4] removing unneeded descriptor --- src/groundlight/edge/config.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/groundlight/edge/config.py b/src/groundlight/edge/config.py index c5703bd1..9f29f4c4 100644 --- a/src/groundlight/edge/config.py +++ b/src/groundlight/edge/config.py @@ -17,7 +17,6 @@ class GlobalConfig(BaseModel): # pylint: disable=too-few-public-methods le=86400, description=( "Interval (seconds) at which the model-updater polls for new model binaries. " - "Must be between 0 (exclusive) and 86400 (1 day). " "Set to None to disable refresh polling entirely." ), )