Skip to content

Commit b8ca3e4

Browse files
committed
fix: add safe env-var parsing helpers for all TOKEN_OPTIMIZER_* int/float configs
Bare int(os.environ.get(...)) crashes at module load with ValueError on empty or non-numeric env var values. Added _int_env/_float_env helpers that log a warning and fall back to default. Covers all 11 configurable thresholds (tool-call warn/critical, checkpoint limits, quality window, relevance, edit batch sizes).
1 parent a0a3b18 commit b8ca3e4

1 file changed

Lines changed: 33 additions & 11 deletions

File tree

skills/token-optimizer/scripts/measure.py

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11401,11 +11401,33 @@ def setup_daemon(dry_run=False, uninstall=False):
1140111401
"agent_efficiency": 0.20,
1140211402
}
1140311403

11404+
def _int_env(key: str, default: int) -> int:
11405+
raw = os.environ.get(key, "").strip()
11406+
if not raw:
11407+
return default
11408+
try:
11409+
return int(raw)
11410+
except ValueError:
11411+
print(f"[Token Optimizer] Warning: invalid {key}={raw!r}, using default {default}", file=sys.stderr)
11412+
return default
11413+
11414+
11415+
def _float_env(key: str, default: float) -> float:
11416+
raw = os.environ.get(key, "").strip()
11417+
if not raw:
11418+
return default
11419+
try:
11420+
return float(raw)
11421+
except ValueError:
11422+
print(f"[Token Optimizer] Warning: invalid {key}={raw!r}, using default {default}", file=sys.stderr)
11423+
return default
11424+
11425+
1140411426
# Rolling window size for ratio-based signals.
1140511427
# Ratio signals (stale_reads, bloated_results, decision_density, agent_efficiency)
1140611428
# use only the last N operations to prevent denominator-expansion bias where
1140711429
# scores climb as the session progresses even though context health is degrading.
11408-
_QUALITY_ROLLING_WINDOW = int(os.environ.get("TOKEN_OPTIMIZER_QUALITY_WINDOW", "20"))
11430+
_QUALITY_ROLLING_WINDOW = _int_env("TOKEN_OPTIMIZER_QUALITY_WINDOW", 20)
1140911431

1141011432
# Fill-based warning thresholds that fire independently of the composite score.
1141111433
# These cannot be masked by improving ratio signals.
@@ -11419,27 +11441,27 @@ def setup_daemon(dry_run=False, uninstall=False):
1141911441
# Configurable via TOKEN_OPTIMIZER_TOOL_CALL_WARN / _CRITICAL env vars to suit
1142011442
# longer-context models (e.g. Claude Opus 4.7 1M). Defaults are unchanged from the
1142111443
# original literal — opt-in override only.
11422-
_TOOL_CALL_WARN = int(os.environ.get("TOKEN_OPTIMIZER_TOOL_CALL_WARN", "25"))
11423-
_TOOL_CALL_CRITICAL = int(os.environ.get("TOKEN_OPTIMIZER_TOOL_CALL_CRITICAL", "40"))
11444+
_TOOL_CALL_WARN = _int_env("TOKEN_OPTIMIZER_TOOL_CALL_WARN", 25)
11445+
_TOOL_CALL_CRITICAL = _int_env("TOKEN_OPTIMIZER_TOOL_CALL_CRITICAL", 40)
1142411446
_TOOL_CALL_WARN_THRESHOLDS = [
1142511447
(_TOOL_CALL_CRITICAL, "CRITICAL", f"{_TOOL_CALL_CRITICAL}+ tool calls, instruction adherence severely degraded"),
1142611448
(_TOOL_CALL_WARN, "WARNING", f"{_TOOL_CALL_WARN}+ tool calls, consider a fresh session"),
1142711449
]
1142811450

1142911451
# Configurable via env vars
11430-
_CHECKPOINT_MAX_FILES = int(os.environ.get("TOKEN_OPTIMIZER_CHECKPOINT_FILES", "10"))
11431-
_CHECKPOINT_TTL_SECONDS = int(os.environ.get("TOKEN_OPTIMIZER_CHECKPOINT_TTL", "300"))
11432-
_CHECKPOINT_RETENTION_DAYS = int(os.environ.get("TOKEN_OPTIMIZER_CHECKPOINT_RETENTION_DAYS", "7"))
11433-
_CHECKPOINT_RETENTION_MAX = int(os.environ.get("TOKEN_OPTIMIZER_CHECKPOINT_RETENTION_MAX", "50"))
11434-
_RELEVANCE_THRESHOLD = float(os.environ.get("TOKEN_OPTIMIZER_RELEVANCE_THRESHOLD", "0.3"))
11452+
_CHECKPOINT_MAX_FILES = _int_env("TOKEN_OPTIMIZER_CHECKPOINT_FILES", 10)
11453+
_CHECKPOINT_TTL_SECONDS = _int_env("TOKEN_OPTIMIZER_CHECKPOINT_TTL", 300)
11454+
_CHECKPOINT_RETENTION_DAYS = _int_env("TOKEN_OPTIMIZER_CHECKPOINT_RETENTION_DAYS", 7)
11455+
_CHECKPOINT_RETENTION_MAX = _int_env("TOKEN_OPTIMIZER_CHECKPOINT_RETENTION_MAX", 50)
11456+
_RELEVANCE_THRESHOLD = _float_env("TOKEN_OPTIMIZER_RELEVANCE_THRESHOLD", 0.3)
1143511457

1143611458
# Progressive checkpoint thresholds (% fill, fires once each per session)
1143711459
_PROGRESSIVE_BANDS = [20, 35, 50, 65, 80]
1143811460
_PROGRESSIVE_ENABLED = os.environ.get("TOKEN_OPTIMIZER_PROGRESSIVE_CHECKPOINTS", "1") not in ("0", "false", "no", "off")
1143911461
_QUALITY_CHECKPOINT_THRESHOLDS = [80, 70, 50, 40]
11440-
_CHECKPOINT_COOLDOWN_SECONDS = int(os.environ.get("TOKEN_OPTIMIZER_CHECKPOINT_COOLDOWN_SECONDS", "90"))
11441-
_EDIT_BATCH_WRITE_THRESHOLD = int(os.environ.get("TOKEN_OPTIMIZER_EDIT_BATCH_WRITE_THRESHOLD", "4"))
11442-
_EDIT_BATCH_FILE_THRESHOLD = int(os.environ.get("TOKEN_OPTIMIZER_EDIT_BATCH_FILE_THRESHOLD", "3"))
11462+
_CHECKPOINT_COOLDOWN_SECONDS = _int_env("TOKEN_OPTIMIZER_CHECKPOINT_COOLDOWN_SECONDS", 90)
11463+
_EDIT_BATCH_WRITE_THRESHOLD = _int_env("TOKEN_OPTIMIZER_EDIT_BATCH_WRITE_THRESHOLD", 4)
11464+
_EDIT_BATCH_FILE_THRESHOLD = _int_env("TOKEN_OPTIMIZER_EDIT_BATCH_FILE_THRESHOLD", 3)
1144311465
_CHECKPOINT_TELEMETRY_ENABLED = os.environ.get("TOKEN_OPTIMIZER_CHECKPOINT_TELEMETRY", "0").lower() in ("1", "true", "yes", "on")
1144411466

1144511467
# Shared decision-detection regex (used by both quality analyzer and state extractor)

0 commit comments

Comments
 (0)