Compare commits

...

1 Commits

Author SHA1 Message Date
teknium1
aed17de774 fix: raise session hygiene threshold from 50% to 85% of context
Session hygiene was firing at the same threshold (50%) as the agent's
own context compressor, causing premature compression on every turn
in long gateway sessions (especially Telegram).

Hygiene is a safety net for pathologically large sessions that would
cause API failures — it should NOT be doing normal compression work.
The agent's own compressor handles that during its tool loop with
accurate real token counts from the API.

Changes:
- Default hygiene threshold: 0.50 → 0.85 (fires only when truly large)
- Hygiene threshold is now independent of compression.threshold config
  (that setting controls the agent's compressor, not the pre-agent safety net)
- Removed env var override for hygiene threshold (CONTEXT_COMPRESSION_THRESHOLD
  still controls the agent's own compressor)
2026-03-13 04:17:29 -07:00

View File

@@ -1125,10 +1125,16 @@ class GatewayRunner:
get_model_context_length, get_model_context_length,
) )
# Read model + compression config from config.yaml — same # Read model + compression config from config.yaml.
# source of truth the agent itself uses. # NOTE: hygiene threshold is intentionally HIGHER than the agent's
# own compressor (0.85 vs 0.50). Hygiene is a safety net for
# sessions that grew too large between turns — it fires pre-agent
# to prevent API failures. The agent's own compressor handles
# normal context management during its tool loop with accurate
# real token counts. Having hygiene at 0.50 caused premature
# compression on every turn in long gateway sessions.
_hyg_model = "anthropic/claude-sonnet-4.6" _hyg_model = "anthropic/claude-sonnet-4.6"
_hyg_threshold_pct = 0.50 _hyg_threshold_pct = 0.85
_hyg_compression_enabled = True _hyg_compression_enabled = True
try: try:
_hyg_cfg_path = _hermes_home / "config.yaml" _hyg_cfg_path = _hermes_home / "config.yaml"
@@ -1144,22 +1150,18 @@ class GatewayRunner:
elif isinstance(_model_cfg, dict): elif isinstance(_model_cfg, dict):
_hyg_model = _model_cfg.get("default", _hyg_model) _hyg_model = _model_cfg.get("default", _hyg_model)
# Read compression settings # Read compression settings — only use enabled flag.
# The threshold is intentionally separate from the agent's
# compression.threshold (hygiene runs higher).
_comp_cfg = _hyg_data.get("compression", {}) _comp_cfg = _hyg_data.get("compression", {})
if isinstance(_comp_cfg, dict): if isinstance(_comp_cfg, dict):
_hyg_threshold_pct = float(
_comp_cfg.get("threshold", _hyg_threshold_pct)
)
_hyg_compression_enabled = str( _hyg_compression_enabled = str(
_comp_cfg.get("enabled", True) _comp_cfg.get("enabled", True)
).lower() in ("true", "1", "yes") ).lower() in ("true", "1", "yes")
except Exception: except Exception:
pass pass
# Also check env overrides (same as run_agent.py) # Check env override for disabling compression entirely
_hyg_threshold_pct = float(
os.getenv("CONTEXT_COMPRESSION_THRESHOLD", str(_hyg_threshold_pct))
)
if os.getenv("CONTEXT_COMPRESSION_ENABLED", "").lower() in ("false", "0", "no"): if os.getenv("CONTEXT_COMPRESSION_ENABLED", "").lower() in ("false", "0", "no"):
_hyg_compression_enabled = False _hyg_compression_enabled = False