hermes-agent/agent
Teknium 4a15d26801
Port from block/buzz#4959: classify transport timeouts distinctly in API error summaries
httpx timeout exceptions (ReadTimeout/ConnectTimeout/PoolTimeout/WriteTimeout)
stringify to an EMPTY string, so when one survived the retry loop the user saw
'API call failed after 6 retries: ' with nothing after the colon — a TLS
abort, a reset connection, and a deterministic read-timeout fire were all
indistinguishable (and invisible).

Ported Buzz's pure timeout_message classifier (crates/buzz-agent/src/llm.rs,
block/buzz#4959) to hermes-agent:

- agent/timeout_error_summary.py: pure classifier over the exception type —
  connect-phase timeouts ('no connection established, check base_url') vs
  read-phase timeouts ('no response received within <N>s — consider raising
  providers.<provider>.request_timeout_seconds in ~/.hermes/config.yaml'),
  embedding the configured timeout value (per-model/per-provider config
  first, HERMES_API_TIMEOUT fallback) and the exact config knob.
- run_agent.py: _summarize_api_error() checks the timeout classifier first
  (all later branches produce blank output for message-less exceptions);
  gains optional provider/model kwargs, backward compatible.
- agent/conversation_loop.py: the three retry-loop summary sites pass
  provider/model context.

Tests: 12 new (pure classifier + AIAgent integration + empty-str
precondition pin). Sabotage-verified: disabling the classifier fails the
regression tests with the historical blank summary (assert '').
2026-08-06 23:59:15 -07:00
..
lsp
monitoring
pet
proxy_sources
secret_sources
transports
__init__.py
account_usage.py
agent_init.py
agent_runtime_helpers.py
anthropic_adapter.py
async_utils.py
aux_accounting.py
auxiliary_client.py
azure_identity_adapter.py
backend_identity.py
background_review.py feat: /refine — run the memory/skill self-improvement review on demand 2026-08-05 22:40:51 -07:00
battery.py
bedrock_adapter.py
billing_links.py
billing_usage.py
billing_view.py chore: remove unused imports and dead locals (ruff F401/F841 sweep) 2026-07-29 11:53:39 -07:00
bounded_response.py
browser_provider.py
browser_registry.py
chat_completion_helpers.py Merge pull request #80770 from NousResearch/bb/desktop-session-integrity 2026-08-06 22:12:22 -06:00
codex_responses_adapter.py
codex_runtime.py fix(codex): split reasoning summary parts on summary_index 2026-08-06 22:02:46 -05:00
coding_context.py
context_breakdown.py
context_compressor.py
context_engine.py
context_references.py
conversation_compression.py feat: /heartbeat — recurring session re-entry prompt fired when idle 2026-08-05 22:32:55 -07:00
conversation_loop.py Port from block/buzz#4959: classify transport timeouts distinctly in API error summaries 2026-08-06 23:59:15 -07:00
copilot_acp_client.py
credential_persistence.py
credential_pool.py fix(credential-pool): bench a billing 403 fully, even as the sole key 2026-08-04 23:33:39 +05:30
credential_sources.py
credits_tracker.py
curator.py
curator_backup.py
delegation_context.py fix(cron): don't let a cron job inherit a kanban worker's dispatcher identity 2026-08-06 03:16:26 +05:30
display.py
error_classifier.py
errors.py
file_safety.py
gemini_native_adapter.py fix(gemini): interpose placeholder model turn between tool result and user text 2026-08-05 17:21:01 -07:00
gemini_schema.py
i18n.py
image_gen_provider.py
image_gen_registry.py
image_routing.py
insights.py
interrupt_compat.py
iteration_budget.py
jiter_preload.py fix(agent): preload jiter native parser 2026-05-28 00:20:11 -07:00
kanban_stop.py
learn_prompt.py feat(/learn): expansive knowledge-base skills for books and large corpora 2026-08-06 22:14:52 -07:00
learning_graph.py
learning_graph_render.py
learning_mutations.py
lmstudio_reasoning.py
manual_compression_feedback.py
markdown_tables.py
memory_manager.py
memory_provider.py
message_content.py
message_sanitization.py
moa_loop.py
moa_trace.py
model_metadata.py fix(model_metadata): read llama.cpp context from meta.n_ctx + accept sole model 2026-08-04 11:08:32 +05:30
models_dev.py
moonshot_schema.py
nous_rate_guard.py
onboarding.py feat(surfaces): route busy-input corrections through active-turn redirect 2026-07-22 12:10:58 -05:00
oneshot.py
outbound_webhooks.py fix(hooks): flush outbound queue at interpreter exit 2026-08-02 15:01:11 -07:00
plugin_llm.py
portal_tags.py
process_bootstrap.py
prompt_builder.py
prompt_caching.py
rate_limit_tracker.py
reactions.py
reasoning_summaries.py fix(reasoning): keep gpt-5.x summary parts as separate blocks on the chat wire 2026-08-06 22:02:37 -05:00
reasoning_timeouts.py
redact.py
relay_llm.py
relay_runtime.py
relay_tools.py
replay_cleanup.py
retry_utils.py
runtime_cwd.py
secret_scope.py
session_activity.py
shell_hooks.py
skill_bundles.py
skill_commands.py feat(observability): add Relay skill metrics 2026-07-29 12:20:34 -07:00
skill_preprocessing.py
skill_utils.py
ssl_guard.py
ssl_verify.py
stream_diag.py
stream_single_writer.py
subagent_lifecycle.py
subdirectory_hints.py
subscription_view.py
system_prompt.py
think_scrubber.py
thinking_timeout_guidance.py
thread_scoped_output.py fix: preserve session history when a turn crashes 2026-08-06 23:08:23 -05:00
timeout_error_summary.py Port from block/buzz#4959: classify transport timeouts distinctly in API error summaries 2026-08-06 23:59:15 -07:00
title_generator.py
tool_dispatch_helpers.py
tool_executor.py refactor: fold /simplify-code findings 2026-08-06 17:03:10 +05:30
tool_guardrails.py
tool_result_classification.py
trace_upload.py
trajectory.py
transcription_provider.py
transcription_registry.py
tts_provider.py
tts_registry.py
turn_context.py
turn_finalizer.py fix: preserve session history when a turn crashes 2026-08-06 23:08:23 -05:00
turn_retry_state.py
turn_summary.py
usage_pricing.py
verification_evidence.py
verification_stop.py
verify_hooks.py
vertex_adapter.py
video_gen_provider.py
video_gen_registry.py
web_search_provider.py
web_search_registry.py