# NousResearch/hermes-agent · Compression fallback behavior on timeout errors

## Open now

- Nothing open on GitHub.

These issues and PRs address how the context compressor handles timeout and model-unavailable errors, specifically improving fallback and retry logic instead of permanently failing.

## TL;DR

- 4 member(s): 0 open issue(s), 1 closed issue(s), 0 open PR(s), 1 merged PR(s), 2 PR(s) closed without merging.
- A fix was merged to main in PR #19665. Verify it addresses your case.
- **Recommended:** read PR #19665 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `unresolved`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_SPANNING`): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
- Pairwise link density `0.50`: the share of member pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. `1.00` means every pair is linked.

## Closed / duplicate issues

- #15935: bug(compression): context compression fails permanently when summary model times out

## Prior & competing PRs

- **#19665: fix(compressor): trigger fallback on timeout errors alongside model-unavailable errors**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`
  - files: `agent/context_compressor.py`
  - fix hunks:
  - `agent/context_compressor.py`

    ```diff
    @@ -906,15 +906,19 @@ def _generate_summary(self, turns_to_summarize: List[Dict[str, Any]], focus_topi
                     or "does not exist" in _err_str
                     or "no available channel" in _err_str
                 )
    +            _is_timeout = (
    +                _status in (408, 429, 502, 504)
    +                or "timeout" in _err_str
    +            )
                 if (
    -                _is_model_not_found
    +                (_is_model_not_found or _is_timeout)
                     and self.summary_model
                     and self.summary_model != self.model
                     and not getattr(self, "_summary_model_fallen_back", False)
                 ):
                     self._summary_model_fallen_back = True
                     logging.warning(
    -                    "Summary model '%s' not available (%s). "
    +                    "Summary model '%s' unavailable (%s). "
                         "Falling back to main model '%s' for compression.",
                         self.summary_model, e, self.model,
                     )
    ```
- **#15924: fix(compression): fallback to main model on timeout errors**. closed without merge
  - maintainer direction: category `silent_close`; implication `active`
- **#16126: fix(compressor): trigger fallback on timeout errors alongside model-not-found**. closed without merge
  - maintainer direction: category `merged_via`; implication `superseded`; refs `#19665`

## Fix status

- Merged to main in PR #19665 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-05-04`.
