# NousResearch/hermes-agent · Fix false context overflow errors in large sessions

## Open now

- Nothing open on GitHub.

These issues and fixes address a bug where generic 400/disconnect errors were incorrectly classified as context overflow in large-context (e.g. 1M-token) sessions. The fixes gate absolute message and token heuristics to small context windows to avoid false positives.

## 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 #19723. Verify it addresses your case.
- **Recommended:** read PR #19723 (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

- #16351: Generic 400/disconnect errors misclassified as context_overflow in 1M-context sessions

## Prior & competing PRs

- **#19723: fix(error_classifier): avoid large-context false overflow heuristics**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`
  - files: `agent/error_classifier.py`, `tests/agent/test_error_classifier.py`
  - fix hunks:
  - `agent/error_classifier.py`

    ```diff
    @@ -520,7 +520,12 @@ def _result(reason: FailoverReason, **overrides) -> ClassifiedError:
     
         is_disconnect = any(p in error_msg for p in _SERVER_DISCONNECT_PATTERNS)
         if is_disconnect and not status_code:
    -        is_large = approx_tokens > context_length * 0.6 or approx_tokens > 120000 or num_messages > 200
    +        # Absolute token/message-count thresholds are only a proxy for smaller
    +        # context windows.  Large-context sessions can have hundreds of
    +        # messages while still being far below their actual token budget.
    +        is_large = approx_tokens > context_length * 0.6 or (
    +            context_length <= 256000 and (approx_tokens > 120000 or num_messages > 200)
    +        )
             if is_large:
                 return _result(
                     FailoverReason.context_overflow,
    ```

    ```diff
    @@ -766,7 +771,12 @@ def _classify_400(
             if not err_body_msg:
                 err_body_msg = str(body.get("message") or "").strip().lower()
         is_generic = len(err_body_msg) < 30 or err_body_msg in ("error", "")
    -    is_large = approx_tokens > context_length * 0.4 or approx_tokens > 80000 or num_messages > 80
    +    # Absolute token/message-count thresholds are only a proxy for smaller
    +    # context windows.  Large-context sessions can have many messages while
    +    # still being far below their actual token budget.
    +    is_large = approx_tokens > context_length * 0.4 or (
    +        context_length <= 256000 and (approx_tokens > 80000 or num_messages > 80)
    +    )
     
         if is_generic and is_large:
             return result_fn(
    ```
  - `tests/agent/test_error_classifier.py`

    ```diff
    @@ -410,6 +410,24 @@ def test_400_generic_small_session_is_format_error(self):
             result = classify_api_error(e, approx_tokens=1000, context_length=200000)
             assert result.reason == FailoverReason.format_error
     
    +    def test_400_generic_many_messages_below_large_context_pressure_is_format_error(self):
    +        """Large-context sessions should not overflow solely due to message count."""
    +        e = MockAPIError(
    +            "Error",
    +            status_code=400,
    +            body={"error": {"message": "Error"}},
    +        )
    +        result = classify_api_error(
    +            e,
    +            provider="openai-codex",
    +            model="gpt-5.5",
    +            approx_tokens=[redacted:secret-assignment]
    +            context_length=1_000_000,
    +            num_messages=432,
    +        )
    +        assert result.reason == FailoverReason.format_error
    +        assert result.should_compress is False
    +
         # ── Server disconnect + large session ──
     
         def test_disconnect_large_session_context_overflow(self):
    ```

    ```diff
    @@ -425,6 +443,20 @@ def test_disconnect_small_session_timeout(self):
             result = classify_api_error(e, approx_tokens=5000, context_length=200000)
             assert result.reason == FailoverReason.timeout
     
    +    def test_disconnect_many_messages_below_large_context_pressure_is_timeout(self):
    +        """Large-context disconnects should not overflow solely due to message count."""
    +        e = Exception("server disconnected without sending complete message")
    +        result = classify_api_error(
    +            e,
    +            provider="openai-codex",
    +            model="gpt-5.5",
    +            approx_tokens=[redacted:secret-assignment]
    +            context_length=1_000_000,
    +            num_messages=432,
    +        )
    +        assert result.reason == FailoverReason.timeout
    +        assert result.should_compress is False
    +
         # ── Provider-specific: Anthropic thinking signature ──
     
         def test_anthropic_thinking_signature(self):
    ```
- **#16352: fix(error_classifier): avoid large-context false overflow heuristics**. closed without merge
  - maintainer direction: category `merged_via`; implication `superseded`; refs `#19723`
- **#16380: fix(error_classifier): gate absolute msg/token heuristics to small context windows**. closed without merge
  - maintainer direction: category `merged_via`; implication `superseded`; refs `d29f90e89d0263d390a71b359e1afa4f5a91e1e9`, `#19723`

## Fix status

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