Skip to content

feat: add proxy support for Discord, Slack, and SMS platform senders#2208

Closed
jhbarnett wants to merge 2 commits into
NousResearch:mainfrom
jhbarnett:fix/fork-conflicts-discord
Closed

feat: add proxy support for Discord, Slack, and SMS platform senders#2208
jhbarnett wants to merge 2 commits into
NousResearch:mainfrom
jhbarnett:fix/fork-conflicts-discord

Conversation

@jhbarnett

@jhbarnett jhbarnett commented Mar 20, 2026

Copy link
Copy Markdown

Summary

Add HTTP proxy support for all aiohttp-based platform connections: Discord gateway (WebSocket), Discord REST API, Slack Web API, and Twilio SMS API.

  • Reads DISCORD_PROXY env var (with HTTPS_PROXY fallback) for Discord connections
  • Reads HTTPS_PROXY for Slack and SMS (Twilio) connections
  • Routes traffic through the proxy when set, no-op when unset (proxy=None)

Motivation

When running hermes-agent behind a forward proxy (e.g. Squid) for egress control, aiohttp-based platform clients bypass the proxy because aiohttp.ClientSession does not read HTTPS_PROXY by default. This causes DNS resolution failures and connection timeouts for cron job delivery and direct message sending.

The Anthropic/GitHub/OpenRouter SDK clients respect HTTPS_PROXY, but Discord, Slack, and SMS connections go direct.

Changes

gateway/platforms/discord.py — two patch points:

  1. Bot constructor (~line 497): read proxy from env and pass to commands.Bot(proxy=...)
  2. Image download (~line 1173): pass proxy= to session.get() in send_image()

tools/send_message_tool.py — three patch points (used by cron delivery and the send_message tool):

  1. _send_discord(): pass proxy= to session.post() for Discord REST API calls
  2. _send_slack(): pass proxy= to session.post() for Slack Web API calls
  3. _send_sms(): pass proxy= to session.post() for Twilio REST API calls

No dependency changes — discord.py >= 2.0 and aiohttp both support the proxy kwarg natively.

Platforms not affected

  • Telegram: uses python-telegram-bot which respects env vars
  • Signal: uses httpx which respects env vars
  • WhatsApp: connects to localhost bridge (no proxy needed)
  • Email: uses smtplib (not HTTP)

Test plan

  • Deployed behind Squid proxy on internal Docker network (internal: true)
  • Discord gateway connects successfully through proxy
  • Cron job delivery to Discord works through proxy (was failing with DNS resolution errors)
  • REST API calls (login, message send) route through proxy
  • Verified via squid access log audit — discord.com CONNECT tunnels visible
  • Without DISCORD_PROXY/HTTPS_PROXY set, behavior is unchanged (proxy=None)

🤖 Generated with Claude Code

@jhbarnett jhbarnett changed the title feat: add proxy support for Discord gateway connections feat: add proxy support for Discord, Slack, and SMS platform senders Mar 23, 2026
jhbarnett and others added 2 commits March 26, 2026 23:42
Read DISCORD_PROXY or HTTPS_PROXY env var and pass to discord.py's
Bot constructor and image download session. This routes both WebSocket
gateway and REST API traffic through an HTTP proxy (e.g. Squid),
enabling network-level egress control.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The cron scheduler delivers via _send_discord/_send_slack/_send_sms in
send_message_tool.py, which create bare aiohttp sessions that ignore
HTTPS_PROXY.  This causes DNS resolution failures when running behind a
forward proxy (e.g. Squid) where direct outbound is blocked.

Pass proxy= to each aiohttp request, matching the pattern already used
in gateway/platforms/discord.py for the bot connection and image downloads.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@jhbarnett jhbarnett force-pushed the fix/fork-conflicts-discord branch from 35f4743 to 9d5ca9a Compare March 27, 2026 05:43
@jhbarnett

Copy link
Copy Markdown
Author

🐢 CodeTrotter Walkthrough

An AI-powered review of this PR is ready on CodeTrotter:

View PR Walkthrough →

Generated by CodeTrotter — understand any PR at a glance.

teknium1 added a commit that referenced this pull request Apr 9, 2026
… proxy coverage

Follow-up improvements on top of the shared resolver from PR #6562:

- Add platform_env_var parameter to resolve_proxy_url() so DISCORD_PROXY
  takes priority over generic HTTPS_PROXY/ALL_PROXY env vars
- Add SOCKS proxy support via aiohttp_socks.ProxyConnector with rdns=True
  (critical for GFW/Shadowrocket/Clash users — issue #6649)
- proxy_kwargs_for_bot() returns connector= for SOCKS, proxy= for HTTP
- proxy_kwargs_for_aiohttp() returns split (session_kw, request_kw) for
  standalone aiohttp sessions
- Add proxy support to send_message_tool.py (Discord REST, Slack, SMS)
  for cron job delivery behind proxies (from PR #2208)
- Add proxy support to Discord image/document downloads
- Fix duplicate import sys in base.py
teknium1 added a commit that referenced this pull request Apr 9, 2026
… proxy coverage

Follow-up improvements on top of the shared resolver from PR #6562:

- Add platform_env_var parameter to resolve_proxy_url() so DISCORD_PROXY
  takes priority over generic HTTPS_PROXY/ALL_PROXY env vars
- Add SOCKS proxy support via aiohttp_socks.ProxyConnector with rdns=True
  (critical for GFW/Shadowrocket/Clash users — issue #6649)
- proxy_kwargs_for_bot() returns connector= for SOCKS, proxy= for HTTP
- proxy_kwargs_for_aiohttp() returns split (session_kw, request_kw) for
  standalone aiohttp sessions
- Add proxy support to send_message_tool.py (Discord REST, Slack, SMS)
  for cron job delivery behind proxies (from PR #2208)
- Add proxy support to Discord image/document downloads
- Fix duplicate import sys in base.py
@teknium1

teknium1 commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

Superseded by PR #6814 which includes your send_message_tool.py proxy coverage pattern (Discord REST, Slack, SMS) along with unified resolver and SOCKS support. Thanks for the multi-platform proxy work @jhbarnett!

@teknium1 teknium1 closed this Apr 9, 2026
Tommyeds pushed a commit to Tommyeds/hermes-agent that referenced this pull request Apr 12, 2026
… proxy coverage

Follow-up improvements on top of the shared resolver from PR NousResearch#6562:

- Add platform_env_var parameter to resolve_proxy_url() so DISCORD_PROXY
  takes priority over generic HTTPS_PROXY/ALL_PROXY env vars
- Add SOCKS proxy support via aiohttp_socks.ProxyConnector with rdns=True
  (critical for GFW/Shadowrocket/Clash users — issue NousResearch#6649)
- proxy_kwargs_for_bot() returns connector= for SOCKS, proxy= for HTTP
- proxy_kwargs_for_aiohttp() returns split (session_kw, request_kw) for
  standalone aiohttp sessions
- Add proxy support to send_message_tool.py (Discord REST, Slack, SMS)
  for cron job delivery behind proxies (from PR NousResearch#2208)
- Add proxy support to Discord image/document downloads
- Fix duplicate import sys in base.py
angelburgosrosado pushed a commit to angelburgosrosado/hermes-agent that referenced this pull request Apr 28, 2026
… proxy coverage

Follow-up improvements on top of the shared resolver from PR NousResearch#6562:

- Add platform_env_var parameter to resolve_proxy_url() so DISCORD_PROXY
  takes priority over generic HTTPS_PROXY/ALL_PROXY env vars
- Add SOCKS proxy support via aiohttp_socks.ProxyConnector with rdns=True
  (critical for GFW/Shadowrocket/Clash users — issue NousResearch#6649)
- proxy_kwargs_for_bot() returns connector= for SOCKS, proxy= for HTTP
- proxy_kwargs_for_aiohttp() returns split (session_kw, request_kw) for
  standalone aiohttp sessions
- Add proxy support to send_message_tool.py (Discord REST, Slack, SMS)
  for cron job delivery behind proxies (from PR NousResearch#2208)
- Add proxy support to Discord image/document downloads
- Fix duplicate import sys in base.py
ulasbilgen pushed a commit to ulasbilgen/hermes-adhd-agent that referenced this pull request May 1, 2026
… proxy coverage

Follow-up improvements on top of the shared resolver from PR NousResearch#6562:

- Add platform_env_var parameter to resolve_proxy_url() so DISCORD_PROXY
  takes priority over generic HTTPS_PROXY/ALL_PROXY env vars
- Add SOCKS proxy support via aiohttp_socks.ProxyConnector with rdns=True
  (critical for GFW/Shadowrocket/Clash users — issue NousResearch#6649)
- proxy_kwargs_for_bot() returns connector= for SOCKS, proxy= for HTTP
- proxy_kwargs_for_aiohttp() returns split (session_kw, request_kw) for
  standalone aiohttp sessions
- Add proxy support to send_message_tool.py (Discord REST, Slack, SMS)
  for cron job delivery behind proxies (from PR NousResearch#2208)
- Add proxy support to Discord image/document downloads
- Fix duplicate import sys in base.py
02356abc pushed a commit to 02356abc/hermes-agent that referenced this pull request May 14, 2026
… proxy coverage

Follow-up improvements on top of the shared resolver from PR NousResearch#6562:

- Add platform_env_var parameter to resolve_proxy_url() so DISCORD_PROXY
  takes priority over generic HTTPS_PROXY/ALL_PROXY env vars
- Add SOCKS proxy support via aiohttp_socks.ProxyConnector with rdns=True
  (critical for GFW/Shadowrocket/Clash users — issue NousResearch#6649)
- proxy_kwargs_for_bot() returns connector= for SOCKS, proxy= for HTTP
- proxy_kwargs_for_aiohttp() returns split (session_kw, request_kw) for
  standalone aiohttp sessions
- Add proxy support to send_message_tool.py (Discord REST, Slack, SMS)
  for cron job delivery behind proxies (from PR NousResearch#2208)
- Add proxy support to Discord image/document downloads
- Fix duplicate import sys in base.py
olympus-terminal pushed a commit to olympus-terminal/hermes-agent that referenced this pull request May 16, 2026
… proxy coverage

Follow-up improvements on top of the shared resolver from PR NousResearch#6562:

- Add platform_env_var parameter to resolve_proxy_url() so DISCORD_PROXY
  takes priority over generic HTTPS_PROXY/ALL_PROXY env vars
- Add SOCKS proxy support via aiohttp_socks.ProxyConnector with rdns=True
  (critical for GFW/Shadowrocket/Clash users — issue NousResearch#6649)
- proxy_kwargs_for_bot() returns connector= for SOCKS, proxy= for HTTP
- proxy_kwargs_for_aiohttp() returns split (session_kw, request_kw) for
  standalone aiohttp sessions
- Add proxy support to send_message_tool.py (Discord REST, Slack, SMS)
  for cron job delivery behind proxies (from PR NousResearch#2208)
- Add proxy support to Discord image/document downloads
- Fix duplicate import sys in base.py
gweeteve pushed a commit to gweeteve/hermes-agent that referenced this pull request Jun 2, 2026
… proxy coverage

Follow-up improvements on top of the shared resolver from PR NousResearch#6562:

- Add platform_env_var parameter to resolve_proxy_url() so DISCORD_PROXY
  takes priority over generic HTTPS_PROXY/ALL_PROXY env vars
- Add SOCKS proxy support via aiohttp_socks.ProxyConnector with rdns=True
  (critical for GFW/Shadowrocket/Clash users — issue NousResearch#6649)
- proxy_kwargs_for_bot() returns connector= for SOCKS, proxy= for HTTP
- proxy_kwargs_for_aiohttp() returns split (session_kw, request_kw) for
  standalone aiohttp sessions
- Add proxy support to send_message_tool.py (Discord REST, Slack, SMS)
  for cron job delivery behind proxies (from PR NousResearch#2208)
- Add proxy support to Discord image/document downloads
- Fix duplicate import sys in base.py
Egavasyug pushed a commit to Egavasyug/hermes-agent that referenced this pull request Jun 10, 2026
… proxy coverage

Follow-up improvements on top of the shared resolver from PR NousResearch#6562:

- Add platform_env_var parameter to resolve_proxy_url() so DISCORD_PROXY
  takes priority over generic HTTPS_PROXY/ALL_PROXY env vars
- Add SOCKS proxy support via aiohttp_socks.ProxyConnector with rdns=True
  (critical for GFW/Shadowrocket/Clash users — issue NousResearch#6649)
- proxy_kwargs_for_bot() returns connector= for SOCKS, proxy= for HTTP
- proxy_kwargs_for_aiohttp() returns split (session_kw, request_kw) for
  standalone aiohttp sessions
- Add proxy support to send_message_tool.py (Discord REST, Slack, SMS)
  for cron job delivery behind proxies (from PR NousResearch#2208)
- Add proxy support to Discord image/document downloads
- Fix duplicate import sys in base.py
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants