hermes-agent/tests/gateway
Albert G ad2531be08 feat(telegram): skip-STT audio path + 2GB cap via local Bot API server
Two coordinated changes that unblock downstream audio pipelines
(diarization, custom transcription, archival) on attachments larger
than the public Bot API's 20MB getFile ceiling.

- `stt.enabled: false` no longer drops voice/audio with a generic
  "transcription disabled" note. The gateway probes the cached file's
  duration (wave → mutagen → ffprobe ladder) and surfaces
  `[The user sent a voice message: <abs path> (duration: M:SS)]` to
  the agent so a skill or tool can pick up the raw file. The previous
  placeholder is replaced rather than appended when present.

- `platforms.telegram.extra.base_url` set → adapter auto-lifts its
  document size cap from 20MB to 2GB (the local telegram-bot-api
  `--local` ceiling) and the "too large" reply reports the active
  limit dynamically. No new config knob; presence of `base_url` is the
  opt-in.

- `platforms.telegram.extra.local_mode: true` wires
  `Application.builder().local_mode(True)` on the python-telegram-bot
  builder. PTB then reads files from disk instead of HTTP, which is
  required when telegram-bot-api runs in `--local` mode (the server
  returns absolute filesystem paths, not `/file/bot...` URLs).

- gateway/run.py: rewrites the `stt.enabled: false` branch of
  `_enrich_message_with_transcription`. New `_format_duration` +
  `_probe_audio_duration` helpers.
- gateway/platforms/telegram.py: `_max_doc_bytes` instance attribute
  derived from `extra.base_url`; `local_mode` builder wiring;
  dynamic "too large" message.
- tests/gateway/test_stt_config.py: covers path-surfacing with and
  without an existing user message, and placeholder replacement.
- tests/gateway/test_telegram_max_doc_bytes.py: 3 cases — default 20MB
  without base_url, 2GB when set, empty-string base_url keeps default.
- website/docs/user-guide/messaging/telegram.md: new "Skipping STT"
  subsection under Voice Messages and a full "Large Files (>20MB) via
  Local Bot API Server" walkthrough (api_id/api_hash, docker-compose,
  one-time `logOut` migration, `platforms.telegram.extra` config, the
  `local_mode` disk-access requirement, the silent HTTP-fallback 404).
- website/docs/user-guide/features/voice-mode.md: documents the
  `stt.enabled` knob in the config reference.

- `pytest tests/gateway/test_telegram_max_doc_bytes.py
  tests/gateway/test_stt_config.py` → 9/9 passing.
- Verified end-to-end on a live deployment: gateway log shows
  `Using custom Telegram base_url: http://...` and
  `Using Telegram local_mode (read files from disk)` on startup;
  voice messages above 20MB cache to disk and surface their path to
  the agent.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 22:59:40 -07:00
..
__init__.py
_plugin_adapter_loader.py
conftest.py chore: ruff auto-fix PLR6201 resweep — tuple → set in membership tests (#27355) 2026-05-17 02:29:41 -07:00
feishu_helpers.py
restart_test_helpers.py
test_7100_transient_failure_transcript.py
test_active_session_text_merge.py fix(gateway): merge rapid TEXT follow-ups during active sessions (#4469) (#26822) 2026-05-16 02:25:41 -07:00
test_agent_cache.py
test_allowed_channels_widening.py
test_allowlist_startup_check.py chore: ruff auto-fix PLR6201 resweep — tuple → set in membership tests (#27355) 2026-05-17 02:29:41 -07:00
test_api_server.py [agent] fix: harden api server response headers 2026-05-16 23:11:43 -07:00
test_api_server_bind_guard.py
test_api_server_jobs.py
test_api_server_multimodal.py
test_api_server_normalize.py
test_api_server_runs.py fix(api_server): coerce stringified booleans in request payloads 2026-05-16 23:02:02 -07:00
test_api_server_toolset.py
test_approve_deny_commands.py
test_auth_fallback.py
test_auto_continue.py
test_background_command.py test(gateway): include direct_messages_topic_id in telegram DM metadata assertions 2026-05-17 12:44:48 -07:00
test_background_process_notifications.py fix(gateway): route background-process notifications into Telegram DM topics 2026-05-18 22:03:12 -07:00
test_base_topic_sessions.py fix(gateway): avoid duplicate Telegram text after auto-TTS voice replies 2026-05-18 22:27:40 -07:00
test_bluebubbles.py fix(gateway): preserve underscores in plain-text identifiers 2026-05-16 23:11:43 -07:00
test_bundles_command.py feat(skills): add skill bundles — alias /<name> loads multiple skills (#28373) 2026-05-18 21:38:05 -07:00
test_busy_session_ack.py
test_busy_session_auth_bypass.py
test_cancel_background_drain.py
test_channel_directory.py
test_clean_shutdown_marker.py
test_command_bypass_active_session.py
test_complete_path_at_filter.py
test_compress_command.py fix(compress): abort instead of dropping messages when summary LLM fails (#28102) 2026-05-18 10:19:40 -07:00
test_compress_focus.py
test_compress_plugin_engine.py
test_config.py feat(telegram): support quick-command-only menus 2026-05-18 22:48:42 -07:00
test_config_cwd_bridge.py chore: ruff auto-fix PLR6201 resweep — tuple → set in membership tests (#27355) 2026-05-17 02:29:41 -07:00
test_config_env_bridge_authority.py
test_debug_command.py
test_delivery.py
test_destructive_slash_confirm.py
test_dingtalk.py
test_discord_allowed_channels.py
test_discord_allowed_mentions.py
test_discord_attachment_download.py
test_discord_bot_auth_bypass.py
test_discord_bot_filter.py
test_discord_channel_controls.py
test_discord_channel_prompts.py
test_discord_channel_skills.py
test_discord_clarify_buttons.py
test_discord_component_auth.py
test_discord_connect.py
test_discord_document_handling.py feat(discord): allow_any_attachment config to accept arbitrary file types 2026-05-16 20:26:18 -07:00
test_discord_free_response.py feat(discord): default history backfill on, expand to per-user + threads 2026-05-14 15:50:57 -07:00
test_discord_imports.py
test_discord_media_metadata.py
test_discord_model_picker.py
test_discord_opus.py
test_discord_race_polish.py
test_discord_reactions.py
test_discord_reply_mode.py
test_discord_roles_dm_scope.py
test_discord_send.py
test_discord_slash_auth.py
test_discord_slash_commands.py
test_discord_system_messages.py chore: ruff auto-fix PLR6201 resweep — tuple → set in membership tests (#27355) 2026-05-17 02:29:41 -07:00
test_discord_thread_persistence.py
test_display_config.py
test_dm_topics.py fix: avoid Telegram group reply thread session splits 2026-05-18 22:25:53 -07:00
test_document_cache.py
test_duplicate_reply_suppression.py
test_email.py
test_ephemeral_reply.py
test_extract_local_files.py feat(gateway): deliverable mode — ship artifacts as native uploads from any agent surface (#27813) 2026-05-18 02:14:43 -07:00
test_fallback_eviction.py
test_fast_command.py
test_feishu.py
test_feishu_approval_buttons.py
test_feishu_bot_admission.py
test_feishu_bot_auth_bypass.py
test_feishu_comment.py
test_feishu_comment_rules.py
test_feishu_onboard.py
test_fresh_reset_skill_injection.py
test_gateway_command_help.py
test_gateway_inactivity_timeout.py
test_gateway_shutdown.py
test_goal_max_turns_config.py
test_goal_status_notice.py
test_goal_verdict_send.py
test_google_chat.py test(gateway): accept trust_env in fake aiohttp ClientSession lambdas 2026-05-17 12:44:48 -07:00
test_home_target_env_var.py
test_homeassistant.py
test_hooks.py
test_insights_unicode_flags.py
test_internal_event_bypass_pairing.py
test_interrupt_key_match.py
test_irc_adapter.py
test_kanban_notifier.py
test_keep_typing_timeout.py
test_line_plugin.py
test_matrix.py fix(matrix): warn on clock-skew silent message drops (#12614) (#27330) 2026-05-17 00:28:24 -07:00
test_matrix_exec_approval.py
test_matrix_mention.py
test_matrix_voice.py
test_mattermost.py
test_media_download_retry.py
test_media_extraction.py
test_memory_monitor.py Port from cline/cline#10343: periodic gateway memory logging (#27102) 2026-05-16 12:55:23 -07:00
test_message_deduplicator.py
test_mirror.py
test_model_command_custom_providers.py
test_model_switch_persistence.py
test_msgraph_webhook.py
test_native_image_buffer_isolation.py
test_notice_delivery.py
test_pairing.py
test_pending_drain_no_recursion.py
test_pending_drain_race.py
test_pending_event_none.py
test_pii_redaction.py
test_platform_base.py
test_platform_connected_checkers.py chore: ruff auto-fix PLR6201 resweep — tuple → set in membership tests (#27355) 2026-05-17 02:29:41 -07:00
test_platform_http_client_limits.py
test_platform_reconnect.py fix(gateway): keep running when platforms fail; add per-platform circuit breaker + /platform (#26600) 2026-05-15 14:32:14 -07:00
test_platform_registry.py
test_plugin_platform_interface.py
test_post_delivery_callback_chaining.py
test_pre_gateway_dispatch.py
test_proxy_mode.py
test_qqbot.py chore: ruff auto-fix PLR6201 resweep — tuple → set in membership tests (#27355) 2026-05-17 02:29:41 -07:00
test_queue_consumption.py
test_reasoning_command.py
test_reload_skills_command.py
test_reload_skills_discord_resync.py
test_replay_entry_fields.py
test_reply_to_injection.py
test_restart_drain.py test(restart_drain): assert i18n catalog resolved (#22266) 2026-05-17 02:31:18 -07:00
test_restart_notification.py
test_restart_redelivery_dedup.py
test_restart_resume_pending.py chore: ruff auto-fix PLR6201 resweep — tuple → set in membership tests (#27355) 2026-05-17 02:29:41 -07:00
test_resume_command.py
test_retry_replacement.py
test_retry_response.py
test_run_cleanup_progress.py
test_run_progress_interrupt.py
test_run_progress_topics.py fix(telegram): preserve topic metadata on overflow edits 2026-05-18 22:40:03 -07:00
test_runner_fatal_adapter.py fix(gateway): keep running when platforms fail; add per-platform circuit breaker + /platform (#26600) 2026-05-15 14:32:14 -07:00
test_runner_startup_failures.py fix(gateway): keep running when platforms fail; add per-platform circuit breaker + /platform (#26600) 2026-05-15 14:32:14 -07:00
test_running_agent_session_toggles.py
test_runtime_env_reload_config_authority.py
test_runtime_footer.py
test_safe_adapter_disconnect.py
test_send_image_file.py
test_send_multiple_images.py
test_send_retry.py
test_send_voice_reply_notify.py fix(gateway): mark final voice reply as notify-worthy so Telegram delivers it audibly 2026-05-18 22:25:15 -07:00
test_session.py feat(discord): channel history backfill for multi-user sessions 2026-05-14 15:50:57 -07:00
test_session_boundary_hooks.py chore: ruff auto-fix PLR6201 resweep — tuple → set in membership tests (#27355) 2026-05-17 02:29:41 -07:00
test_session_boundary_security_state.py
test_session_dm_thread_seeding.py
test_session_env.py
test_session_hygiene.py fix(compress): abort instead of dropping messages when summary LLM fails (#28102) 2026-05-18 10:19:40 -07:00
test_session_info.py
test_session_list_allowed_sources.py
test_session_model_override_routing.py chore: ruff auto-fix PLR6201 resweep — tuple → set in membership tests (#27355) 2026-05-17 02:29:41 -07:00
test_session_model_reset.py
test_session_race_guard.py
test_session_reset_notify.py fix(session): persist auto-reset state across gateway restarts 2026-05-15 01:25:42 -07:00
test_session_split_brain_11016.py
test_session_state_cleanup.py
test_session_store_prune.py
test_setup_feishu.py
test_shared_group_sender_prefix.py
test_shutdown_cache_cleanup.py
test_shutdown_forensics.py
test_shutdown_memory_provider_messages.py
test_signal.py fix(signal): read groupV2.id in envelope, fall back to legacy groupInfo (#27051) 2026-05-16 11:53:57 -07:00
test_signal_format.py
test_signal_rate_limit.py
test_simplex_plugin.py feat(gateway): add SimpleX Chat platform plugin 2026-05-15 01:41:30 -07:00
test_slack.py
test_slack_approval_buttons.py
test_slack_channel_skills.py
test_slack_mention.py
test_slash_access.py
test_slash_access_dispatch.py
test_sms.py
test_sse_agent_cancel.py
test_ssl_certs.py
test_status.py
test_status_command.py
test_steer_command.py
test_step_callback_compat.py
test_sticker_cache.py
test_stream_consumer.py
test_stream_consumer_draft.py fix(telegram): default streaming transport to edit 2026-05-18 21:51:39 -07:00
test_stream_consumer_fresh_final.py
test_stream_consumer_thread_routing.py
test_stt_config.py feat(telegram): skip-STT audio path + 2GB cap via local Bot API server 2026-05-18 22:59:40 -07:00
test_stuck_loop.py
test_teams.py test(gateway): accept trust_env in fake aiohttp ClientSession lambdas 2026-05-17 12:44:48 -07:00
test_teams_pipeline_runtime_wiring.py
test_telegram_approval_buttons.py fix(telegram): resume typing indicator after inline approval click (#27853) 2026-05-18 22:20:57 -07:00
test_telegram_audio_vs_voice.py fix(gateway): route Telegram audio file attachments away from STT pipeline (#24870) 2026-05-18 21:53:57 -07:00
test_telegram_callback_auth_fail_closed.py fix(telegram): fail-closed auth fallback when TELEGRAM_ALLOWED_USERS is empty 2026-05-18 22:08:08 -07:00
test_telegram_caption_merge.py
test_telegram_channel_posts.py test+release: stub auth in channel_posts fixture; map @brndnsvr 2026-05-18 22:51:35 -07:00
test_telegram_clarify_buttons.py fix(telegram): render full clarify choice text in message body, use short button labels 2026-05-18 21:49:19 -07:00
test_telegram_conflict.py fix(test+release): update conflict retry count for MAX=5; map @CryptoByz 2026-05-18 22:01:31 -07:00
test_telegram_documents.py test+release: stub auth in test_telegram_documents fixture; map @kiranvk-2011 2026-05-18 22:37:28 -07:00
test_telegram_format.py fix(telegram): preserve topic metadata on overflow edits 2026-05-18 22:40:03 -07:00
test_telegram_forum_commands.py test+release: fix test fixture for forum_commands; map @chromalinx 2026-05-18 22:34:48 -07:00
test_telegram_group_gating.py fix: ignore Telegram messages for other bots 2026-05-18 22:54:15 -07:00
test_telegram_max_doc_bytes.py feat(telegram): skip-STT audio path + 2GB cap via local Bot API server 2026-05-18 22:59:40 -07:00
test_telegram_mention_boundaries.py
test_telegram_model_picker.py
test_telegram_network.py test+release: align stale sticky-IP test for #24511; map @falconexe 2026-05-18 22:14:45 -07:00
test_telegram_network_reconnect.py
test_telegram_noise_filter.py Quiet noisy Telegram gateway errors 2026-05-18 22:53:01 -07:00
test_telegram_photo_interrupts.py
test_telegram_progress_edit_transient.py fix(telegram): preserve can_edit after transient network errors in progress edits (#27828) 2026-05-18 21:59:40 -07:00
test_telegram_reactions.py
test_telegram_reply_mode.py fix(telegram): respect reply_to_mode for DM topic reply fallback 2026-05-18 21:52:39 -07:00
test_telegram_reply_quote.py
test_telegram_slash_confirm.py fix(telegram): escape send_slash_confirm preview with format_message 2026-05-18 22:28:21 -07:00
test_telegram_text_batch_perf.py
test_telegram_text_batching.py
test_telegram_thread_fallback.py fix(telegram): report cron topic fallback 2026-05-18 22:45:05 -07:00
test_telegram_topic_mode.py fix(gateway): restore Telegram DM topic thread_id after session split (#27166) 2026-05-18 22:42:28 -07:00
test_telegram_webhook_secret.py
test_text_batching.py
test_title_command.py
test_transcript_offset.py chore: ruff auto-fix PLR6201 resweep — tuple → set in membership tests (#27355) 2026-05-17 02:29:41 -07:00
test_tts_media_routing.py
test_unauthorized_dm_behavior.py fix(gateway): allow chat-scoped telegram auth without sender user_id 2026-05-18 22:43:14 -07:00
test_unavailable_skill_hint.py
test_unknown_command.py
test_update_command.py
test_update_streaming.py fix(gateway): avoid zsh status variable in update wrapper 2026-05-16 23:11:43 -07:00
test_usage_command.py
test_verbose_command.py
test_vision_memory_leak.py
test_voice_command.py fix(gateway): mark final voice reply as notify-worthy so Telegram delivers it audibly 2026-05-18 22:25:15 -07:00
test_voice_mode_platform_isolation.py
test_weak_credential_guard.py
test_webhook_adapter.py
test_webhook_deliver_only.py
test_webhook_dynamic_routes.py
test_webhook_integration.py
test_webhook_signature_rate_limit.py
test_wecom.py
test_wecom_callback.py
test_weixin.py
test_whatsapp_connect.py fix(gateway): keep running when platforms fail; add per-platform circuit breaker + /platform (#26600) 2026-05-15 14:32:14 -07:00
test_whatsapp_formatting.py
test_whatsapp_group_gating.py
test_whatsapp_reply_prefix.py
test_ws_auth_retry.py
test_yolo_command.py