mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-29 06:31:32 +00:00
fix(codex): rotate pool on usage limit 429 — port to extracted modules
Original commit e51d74ab9 by Maxim Esipov targeted _extract_api_error_context
and _recover_with_credential_pool in pre-refactor run_agent.py. Both bodies
now live in agent/agent_runtime_helpers.py — re-applied to that module:
- extract_api_error_context: payload.get('type') added to the reason
fallback chain (Codex error bodies use 'type' instead of 'code'/'error')
- recover_with_credential_pool: usage_limit_reached detection in the
rate_limit branch — skip the retry-once-then-rotate dance and rotate
immediately when the body says the per-account usage limit hit.
Co-authored-by: Maxim Esipov <maksesipov@gmail.com>
This commit is contained in:
parent
df22d29522
commit
80fa92a491
1 changed files with 10 additions and 2 deletions
|
|
@ -583,7 +583,15 @@ def recover_with_credential_pool(
|
|||
return False, has_retried_429
|
||||
|
||||
if effective_reason == FailoverReason.rate_limit:
|
||||
if not has_retried_429:
|
||||
usage_limit_reached = False
|
||||
if error_context:
|
||||
context_reason = str(error_context.get("reason") or "").lower()
|
||||
context_message = str(error_context.get("message") or "").lower()
|
||||
usage_limit_reached = (
|
||||
"usage_limit_reached" in context_reason
|
||||
or "usage limit has been reached" in context_message
|
||||
)
|
||||
if not has_retried_429 and not usage_limit_reached:
|
||||
return False, True
|
||||
rotate_status = status_code if status_code is not None else 429
|
||||
next_entry = pool.mark_exhausted_and_rotate(status_code=rotate_status, error_context=error_context)
|
||||
|
|
@ -1910,7 +1918,7 @@ def extract_api_error_context(error: Exception) -> Dict[str, Any]:
|
|||
if isinstance(body, dict):
|
||||
payload = body.get("error") if isinstance(body.get("error"), dict) else body
|
||||
if isinstance(payload, dict):
|
||||
reason = payload.get("code") or payload.get("error")
|
||||
reason = payload.get("code") or payload.get("type") or payload.get("error")
|
||||
if isinstance(reason, str) and reason.strip():
|
||||
context["reason"] = reason.strip()
|
||||
message = payload.get("message") or payload.get("error_description")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue