mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-06-21 10:22:18 +00:00
fix(agent): summarize non-retryable API errors so raw HTML never leaks
When a non-retryable client error aborts the turn (e.g. a Codex/Cloudflare HTTP 403 "managed challenge" page), the conversation loop returned the failure dict with `error: str(api_error)` — the entire ~60KB HTML page. Downstream consumers deliver that field verbatim: a cron job dumped a Cloudflare challenge page to Discord, where it was split into ~31 messages. The sibling "max retries exhausted" path already collapses such bodies via `_summarize_api_error` (which extracts the <title> / status from HTML error pages). This makes the non-retryable path consistent: compute the summary once and use it for both the status emit and the returned `error`.
This commit is contained in:
parent
426f321e84
commit
b892ee2bcf
1 changed files with 10 additions and 3 deletions
|
|
@ -3197,15 +3197,22 @@ def run_conversation(
|
|||
# Terminal — flush buffered context so the user sees
|
||||
# what was tried before the abort.
|
||||
agent._flush_status_buffer()
|
||||
# Summarize once: Cloudflare/proxy HTML challenge pages and
|
||||
# other raw provider bodies must be collapsed to a short
|
||||
# one-liner here, otherwise the full page leaks into the
|
||||
# returned ``error`` field and downstream consumers deliver
|
||||
# it verbatim (e.g. a cron failure notification dumped a
|
||||
# ~60KB Cloudflare challenge page as 31 Discord messages).
|
||||
_nonretryable_summary = agent._summarize_api_error(api_error)
|
||||
if classified.reason == FailoverReason.content_policy_blocked:
|
||||
agent._emit_status(
|
||||
f"❌ Provider safety filter blocked this request: "
|
||||
f"{agent._summarize_api_error(api_error)}"
|
||||
f"{_nonretryable_summary}"
|
||||
)
|
||||
else:
|
||||
agent._emit_status(
|
||||
f"❌ Non-retryable error (HTTP {status_code}): "
|
||||
f"{agent._summarize_api_error(api_error)}"
|
||||
f"{_nonretryable_summary}"
|
||||
)
|
||||
agent._vprint(f"{agent.log_prefix}❌ Non-retryable client error (HTTP {status_code}). Aborting.", force=True)
|
||||
agent._vprint(f"{agent.log_prefix} 🔌 Provider: {_provider} Model: {_model}", force=True)
|
||||
|
|
@ -3309,7 +3316,7 @@ def run_conversation(
|
|||
"api_calls": api_call_count,
|
||||
"completed": False,
|
||||
"failed": True,
|
||||
"error": str(api_error),
|
||||
"error": _nonretryable_summary,
|
||||
}
|
||||
|
||||
if retry_count >= max_retries:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue