hermes-agent/tests/gateway
Teknium b2a6b012fe
fix(api_server): streaming breaks when agent makes tool calls (#2985)
* fix(run_agent): ensure _fire_first_delta() is called for tool generation events

Added calls to _fire_first_delta() in the AIAgent class to improve the handling of tool generation events, ensuring timely notifications during the processing of function calls and tool usage.

* fix(run_agent): improve timeout handling for chat completions

Enhanced the timeout configuration for chat completions in the AIAgent class by introducing customizable connection, read, and write timeouts using environment variables. This ensures more robust handling of API requests during streaming operations.

* fix(run_agent): reduce default stream read timeout for chat completions

Updated the default stream read timeout from 120 seconds to 60 seconds in the AIAgent class, enhancing the timeout configuration for chat completions. This change aims to improve responsiveness during streaming operations.

* fix(run_agent): enhance streaming error handling and retry logic

Improved the error handling and retry mechanism for streaming requests in the AIAgent class. Introduced a configurable maximum number of stream retries and refined the handling of transient network errors, allowing for retries with fresh connections. Non-transient errors now trigger a fallback to non-streaming only when appropriate, ensuring better resilience during API interactions.

* fix(api_server): streaming breaks when agent makes tool calls

The agent fires stream_delta_callback(None) to signal the CLI display
to close its response box before tool execution begins. The API server's
_on_delta callback was forwarding this None directly into the SSE queue,
where the SSE writer treats it as end-of-stream and terminates the HTTP
response prematurely.

After tool calls complete, the agent streams the final answer through
the same callback, but the SSE response was already closed — so Open
WebUI (and similar frontends) never received the actual answer.

Fix: filter out None in _on_delta so the SSE stream stays open. The SSE
loop already detects completion via agent_task.done(), which handles
stream termination correctly without needing the None sentinel.

Reported by Rohit Paul on X.
2026-03-25 09:56:20 -07:00
..
__init__.py test: reorganize test structure and add missing unit tests 2026-02-26 03:20:08 +03:00
test_agent_cache.py feat(gateway): cache AIAgent per session for prompt caching 2026-03-21 16:21:06 -07:00
test_api_server.py fix(api_server): streaming breaks when agent makes tool calls (#2985) 2026-03-25 09:56:20 -07:00
test_api_server_jobs.py fix(api-server): harden jobs API — input limits, field whitelist, startup check, tests 2026-03-22 04:18:18 -07:00
test_approve_deny_commands.py fix(gateway): replace bare text approval with /approve and /deny commands (#2002) 2026-03-18 16:58:20 -07:00
test_async_memory_flush.py feat(gateway): proactive async memory flush on session expiry 2026-03-07 11:27:50 -08:00
test_background_command.py refactor: centralize slash command registry (#1603) 2026-03-16 23:21:03 -07:00
test_background_process_notifications.py fix(gateway): persist watcher metadata in checkpoint for crash recovery (#1706) 2026-03-17 03:52:15 -07:00
test_base_topic_sessions.py fix(gateway): isolate telegram forum topic sessions 2026-03-11 09:15:34 +01:00
test_channel_directory.py fix: finish HERMES_HOME path cleanup 2026-03-13 21:35:07 -07:00
test_config.py feat: support ignoring unauthorized gateway DMs (#1919) 2026-03-18 04:06:08 -07:00
test_config_cwd_bridge.py refactor(cli): implement approval locking mechanism to serialize concurrent requests 2026-03-13 23:59:18 -07:00
test_delivery.py fix: salvage gateway dedup and executor cleanup from PR #993 2026-03-14 11:03:20 -07:00
test_dingtalk.py feat(gateway): add DingTalk platform adapter (#1685) 2026-03-17 03:04:58 -07:00
test_discord_bot_filter.py feat(discord): add DISCORD_ALLOW_BOTS config for bot message filtering (inspired by openclaw) 2026-03-09 02:20:57 -07:00
test_discord_document_handling.py feat(discord): add document caching and text-file injection (#2503) 2026-03-22 07:38:14 -07:00
test_discord_free_response.py feat(discord): auto-thread on @mention + skip mention in bot threads 2026-03-15 07:59:55 -07:00
test_discord_imports.py fix: defer discord adapter annotations 2026-03-14 09:32:05 -07:00
test_discord_media_metadata.py feat(discord): add /thread command, auto_thread config, and media metadata fix (#1178) 2026-03-13 08:52:54 -07:00
test_discord_opus.py fix: add macOS Homebrew Opus fallback and fix shutdown dict iteration 2026-03-14 14:27:21 +03:00
test_discord_send.py fix: align salvaged Discord send test mock with current slash-command API 2026-03-14 21:44:50 -07:00
test_discord_slash_commands.py fix(discord): properly route slash event handling in threads 2026-03-22 04:25:19 -07:00
test_discord_system_messages.py fix(discord): ignore system messages in on_message handler (#2618) 2026-03-23 06:50:09 -07:00
test_discord_thread_persistence.py fix(discord): persist thread participation across gateway restarts 2026-03-17 02:26:34 -07:00
test_document_cache.py fix(security): patch path traversal, size bypass, and prompt injection in document processing 2026-02-27 11:53:46 -05:00
test_email.py fix: verify SMTP TLS in send_message_tool 2026-03-14 06:31:52 -07:00
test_extract_local_files.py feat: auto-detect local file paths in gateway responses for native media delivery (#1640) 2026-03-17 01:47:34 -07:00
test_flush_memory_stale_guard.py fix(gateway): prevent stale memory overwrites by flush agent (#2670) 2026-03-23 16:08:38 -07:00
test_gateway_shutdown.py fix(gateway): cancel active runs during shutdown 2026-03-15 04:21:50 -07:00
test_homeassistant.py fix: Home Assistant event filtering now closed by default (#1169) 2026-03-13 07:40:38 -07:00
test_honcho_lifecycle.py fix(honcho): isolate session routing for multi-user gateway (#1500) 2026-03-16 00:23:47 -07:00
test_hooks.py test: strengthen assertions across 7 test files (batch 1) 2026-03-05 18:39:37 -08:00
test_interrupt_key_match.py test(gateway): cover photo burst interrupt regressions 2026-03-15 03:50:45 -07:00
test_matrix.py test: add comprehensive tests for Mattermost and Matrix adapters 2026-03-17 03:18:16 -07:00
test_mattermost.py fix(tests): resolve all consistently failing tests 2026-03-22 05:58:26 -07:00
test_media_extraction.py fix(gateway): prevent TTS voice messages from accumulating across turns 2026-02-28 03:38:27 -05:00
test_mirror.py fix(gateway): isolate telegram forum topic sessions 2026-03-11 09:15:34 +01:00
test_pairing.py test: strengthen assertions across 7 test files (batch 1) 2026-03-05 18:39:37 -08:00
test_pii_redaction.py fix(privacy): skip PII redaction on Discord/Slack (mentions need real IDs) 2026-03-16 05:58:34 -07:00
test_plan_command.py fix: save /plan output in workspace (#1381) 2026-03-14 21:28:51 -07:00
test_platform_base.py fix: complete send_message MEDIA delivery salvage 2026-03-14 04:02:03 -07:00
test_platform_reconnect.py feat: auto-reconnect failed gateway platforms with exponential backoff (#2584) 2026-03-22 23:48:24 -07:00
test_queue_consumption.py fix(gateway): process /queue'd messages after agent completion (#2469) 2026-03-22 04:56:13 -07:00
test_reasoning_command.py feat(gateway): add reasoning hot reload 2026-03-14 02:42:47 -07:00
test_resume_command.py fix(honcho): isolate session routing for multi-user gateway (#1500) 2026-03-16 00:23:47 -07:00
test_retry_replacement.py test: lock retry replacement semantics 2026-03-14 21:19:22 -07:00
test_retry_response.py test(gateway): add regression test for /retry response fix 2026-03-10 23:34:52 -07:00
test_run_progress_topics.py feat(gateway): cache AIAgent per session for prompt caching 2026-03-21 16:21:06 -07:00
test_runner_fatal_adapter.py feat: auto-reconnect failed gateway platforms with exponential backoff (#2584) 2026-03-22 23:48:24 -07:00
test_runner_startup_failures.py fix(gateway): restart on retryable startup failures (#1517) 2026-03-16 05:26:31 -07:00
test_send_image_file.py fix(gateway): pass message_thread_id in send_image_file, send_document, send_video 2026-03-21 09:49:33 -07:00
test_session.py fix(session): skip corrupt lines in load_transcript instead of crashing (#1744) 2026-03-17 05:18:12 -07:00
test_session_env.py fix: preserve thread context for cronjob deliver=origin 2026-03-15 06:57:00 -07:00
test_session_hygiene.py refactor(gateway): remove broken 1.4x hygiene multiplier entirely 2026-03-22 15:21:18 -07:00
test_session_race_guard.py fix: harden sentinel guard for /stop during setup and shutdown 2026-03-19 18:26:09 -07:00
test_session_reset_notify.py feat(gateway): notify users when session auto-resets (#2519) 2026-03-22 09:33:39 -07:00
test_signal.py fix(tests): resolve all consistently failing tests 2026-03-22 05:58:26 -07:00
test_slack.py test: fix gateway async test event loop usage 2026-03-14 02:52:47 -07:00
test_sms.py feat: add SMS (Twilio) platform adapter 2026-03-17 03:14:53 -07:00
test_ssl_certs.py fix(gateway): SSL certificate auto-detection for NixOS and non-standard systems 2026-03-15 23:04:34 -07:00
test_status.py fix(gateway): detect script-style gateway processes for --replace 2026-03-18 03:12:59 -07:00
test_status_command.py feat: add route-aware pricing estimates (#1695) 2026-03-17 03:44:44 -07:00
test_sticker_cache.py test: add unit tests for 8 untested modules (batch 3) (#191) 2026-03-01 05:28:12 -08:00
test_stt_config.py fix: restore local STT fallback for gateway voice notes 2026-03-15 21:51:40 -07:00
test_telegram_conflict.py fix(gateway): retry Telegram 409 polling conflicts before giving up 2026-03-21 07:11:06 -07:00
test_telegram_documents.py fix(gateway): pass message_thread_id in send_image_file, send_document, send_video 2026-03-21 09:49:33 -07:00
test_telegram_format.py Merge pull request #2199 from llbn/fix/telegram-markdownv2-features 2026-03-20 12:45:47 -07:00
test_telegram_photo_interrupts.py test(gateway): cover photo burst interrupt regressions 2026-03-15 03:50:45 -07:00
test_telegram_reply_mode.py feat(gateway): configurable Telegram reply threading mode (#2907) 2026-03-24 19:56:00 -07:00
test_telegram_text_batching.py fix(telegram): aggregate split text messages before dispatching (#1674) 2026-03-17 02:49:57 -07:00
test_title_command.py fix(test): add missing _voice_mode attr to GatewayRunner test stubs 2026-03-14 14:27:20 +03:00
test_transcript_offset.py fix(gateway): use filtered history length for transcript message extraction 2026-03-04 21:34:40 +03:00
test_unauthorized_dm_behavior.py feat: support ignoring unauthorized gateway DMs (#1919) 2026-03-18 04:06:08 -07:00
test_update_command.py fix(gateway): fall back to sys.executable -m hermes_cli.main when hermes not on PATH 2026-03-14 12:15:51 -07:00
test_voice_command.py fix(voice): enable TTS voice reply when streaming is active (#2322) 2026-03-21 08:08:37 -07:00
test_webhook_adapter.py feat(gateway): add webhook platform adapter for external event triggers 2026-03-20 06:33:36 -07:00
test_webhook_integration.py feat(gateway): add webhook platform adapter for external event triggers 2026-03-20 06:33:36 -07:00
test_whatsapp_connect.py fix(gateway): restart on whatsapp bridge child exit (#2334) 2026-03-21 09:38:52 -07:00
test_whatsapp_reply_prefix.py feat: OpenAI-compatible API server + WhatsApp configurable reply prefix (#1756) 2026-03-17 10:44:37 -07:00