- ้กน็ฎๆฆ่ฟฐ
- ๆถๆ่ฎพ่ฎก2.1 ๆดไฝๆถๆ2.2 ็ปไปถๅ ณ็ณป
- ๆฐๅขๅ่ฝ
- ๅฎ็ฐ็ป่4.1 WebSocket ้้ ๅจๅฎ็ฐ4.2 ้ ็ฝฎ็ณป็ป้ๆ4.3 ็ฝๅ ณ้ๆ
- ๆต่ฏ้ช่ฏ
- ไฝฟ็จๆๅ
- ๆไปถๅๆดๆธ ๅ
ๆฌ้กน็ฎๅฐ WebSocket ไปฃ็ๅ่ฝ้ๆๅฐ Hermes Agent Gateway ไธญ๏ผๅ ่ฎธ Web ๅฎขๆท็ซฏ๏ผๅฆๆต่งๅจใ่ชๅฎไนๅบ็จ๏ผ้่ฟ WebSocket ๅ่ฎฎไธ Hermes Agent ่ฟ่กๅฎๆถไบคไบใ
- ๆไพๅบไบ WebSocket ็ๅฎๆถๆถๆฏ้้
- ๆฏๆ token ่ฎค่ฏๆบๅถ
- ้ๆๅฐ็ฐๆ็ Hermes Gateway ๅนณๅฐ้้ ๅจ็ณป็ป
- ๆฏๆ่ทจๅนณๅฐๆถๆฏ่ทฏ็ฑ
้็จ ๆนๆก3๏ผ้ๆๅฐ Hermes Gateway๏ผๅฐ WebSocket ไฝไธบไธไธชๆฐ็ๅนณๅฐ้้ ๅจๅฎ็ฐใ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Hermes Agent Gateway โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Platform โ โ Platform โ โ WebSocket โ โ
โ โ Adapters โ โ Adapters โ โ Platform Adapter โ โ
โ โ (Telegram, โ โ (Discord, โ โ โ โ
โ โ Slack, โ โ WhatsApp, โ โ โโโโโโโโโโโโโโโโโโ โ โ
โ โ ...) โ โ ...) โ โ โ WebSocket โ โ โ
โ โโโโโโโโฌโโโโโโโโ โโโโโโโโฌโโโโโโโโ โ โ Server โ โ โ
โ โ โ โ โ (aiohttp) โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโผโโโค โ โ โ
โ โ โ โโโโโโโโโโโโโโ โ โ โ
โ โ โ โ Client โ โ โ โ
โ โ โ โ Manager โ โ โ โ
โ โ โ โโโโโโโโโโโโโโ โ โ โ
โ โ โโโโโโโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโ โ
โ โ Message Router โ โ
โ โ (็ปไธๆถๆฏ่ทฏ็ฑ) โ โ
โ โโโโโโโโโโฌโโโโโโโโโ โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโ โ
โ โ Session Store โ โ
โ โโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Web Clients โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ Browser โ โ Custom App โ โ IoT Device โ โ
โ โ WebSocket โ โ WebSocket โ โ WebSocket โ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| ็ปไปถ | ่่ดฃ | ็ถๆ |
|---|---|---|
| WebSocketAdapter | ๅนณๅฐ้้ ๅจไธป็ฑป๏ผ็ฎก็ WebSocket ๆๅกๅจ็ๅฝๅจๆ | ๆฐๅข |
| WebSocketClient | ๅฎขๆท็ซฏ่ฟๆฅๅฐ่ฃ ๏ผๅค็ๅไธช่ฟๆฅ็็ถๆ็ฎก็ | ๆฐๅข |
| GatewayRunner | ็ฝๅ ณ่ฟ่กๅจ๏ผๅ่ฐๆๆๅนณๅฐ้้ ๅจ | ไฟฎๆน |
| GatewayConfig | ็ฝๅ ณ้ ็ฝฎ็ณป็ป๏ผ็ฎก็ๅนณๅฐ้ ็ฝฎ | ไฟฎๆน |
| Platform | ๅนณๅฐๆไธพ๏ผๅฎไนๆฏๆ็ๆถๆฏๅนณๅฐ | ไฟฎๆน |
ๅฎขๆท็ซฏๆถๆฏ โ WebSocket Server โ WebSocketAdapter โ Message Router โ Agent
โ
Agent ๅๅบ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| ๅ่ฝ | ๆ่ฟฐ | ๅฎ็ฐๆนๅผ |
|---|---|---|
| WebSocket ๆๅกๅจ | ๅบไบ aiohttp ็ WebSocket ๆๅก | aiohttp.web.Application |
| Token ่ฎค่ฏ | ่ฟๆฅๆถ็ token ้ช่ฏๆบๅถ | URL ๅๆฐ + ็ฏๅขๅ้ |
| ๅฎขๆท็ซฏ็ฎก็ | ่ฟๆฅ็ถๆใๆถๆฏ่ฎกๆฐใ้็้ๅถ | WebSocketClient ็ฑป |
| ๆถๆฏ่ทฏ็ฑ | ้ๆๅฐ Gateway ๆถๆฏ่ทฏ็ฑ็ณป็ป | BasePlatformAdapter ็ปงๆฟ |
| ๅฅๅบทๆฃๆฅ | HTTP ๅฅๅบทๆฃๆฅ็ซฏ็น | /health ่ทฏ็ฑ |
| ่ทจๅนณๅฐๆถๆฏๆ้ | ๆฏๆๅๅ ถไปๅนณๅฐๅ้ๆถๆฏ | gateway_runner ๅผ็จ |
| ็นๆง | ๅฎ็ฐ |
|---|---|
| Token ่ฎค่ฏ | ๆๆ่ฟๆฅๅฟ ้กปๆบๅธฆๆๆ token |
| ้็้ๅถ | ๆฏๅ้ๆๅค 60 ๆกๆถๆฏ |
| ่ฟๆฅ้ๅถ | ๆๅคงๅนถๅ่ฟๆฅๆฐๅฏ้ ็ฝฎ |
| ่ฟๆฅ่ถ ๆถ | 5 ๅ้ๆ ๆดปๅจ่ชๅจๆญๅผ |
| ๅๆฐ | ็ฑปๅ | ้ป่ฎคๅผ | ่ฏดๆ |
|---|---|---|---|
host |
string | 127.0.0.1 |
็ปๅฎๅฐๅ |
port |
int | 8765 |
็ปๅฎ็ซฏๅฃ |
token |
string | - | ่ฎค่ฏไปค็ |
max_connections |
int | 10 |
ๆๅคง่ฟๆฅๆฐ |
ๆไปถ: gateway/platforms/websocket.py
class WebSocketAdapter(BasePlatformAdapter):
"""WebSocket ๅนณๅฐ้้
ๅจ"""
def __init__(self, config: PlatformConfig):
# ๅๅงๅ้
็ฝฎๅๆฐ
self._host = config.extra.get("host", "127.0.0.1")
self._port = config.extra.get("port", 8765)
self._token = config.extra.get("token", "") or os.getenv("WEBSOCKET_TOKEN", "")
self._max_connections = config.extra.get("max_connections", 10)
self._clients: Dict[str, WebSocketClient] = {}
| ๆนๆณ | ๅ่ฝ |
|---|---|
connect() |
ๅฏๅจ WebSocket ๆๅกๅจ |
disconnect() |
ๅๆญขๆๅกๅจๅนถๆญๅผๆๆ่ฟๆฅ |
send() |
ๅๆๅฎๅฎขๆท็ซฏๅ้ๆถๆฏ |
get_chat_info() |
่ทๅไผ่ฏไฟกๆฏ |
_handle_websocket() |
WebSocket ่ฟๆฅๅค็ๅ็จ |
_authenticate() |
Token ่ฎค่ฏ้ช่ฏ |
class WebSocketClient:
"""ๅไธช WebSocket ๅฎขๆท็ซฏ็็ถๆ็ฎก็"""
client_id: str # ๅฎขๆท็ซฏๅฏไธๆ ่ฏ
connected_at: float # ่ฟๆฅๆถ้ด
last_message_at: float # ๆๅๆถๆฏๆถ้ด
authenticated: bool # ่ฎค่ฏ็ถๆ
rate_counts: list # ้็้ๅถ่ฎกๆฐๅจ
ๆไปถ: gateway/config.py
class Platform(Enum):
# ... ๅ
ถไปๅนณๅฐ ...
WEBSOCKET = "websocket" # ๆฐๅข
_PLATFORM_CONNECTED_CHECKERS = {
# ... ๅ
ถไปๅนณๅฐ ...
Platform.WEBSOCKET: lambda cfg: bool(
cfg.token or cfg.extra.get("token") or os.getenv("WEBSOCKET_TOKEN")
),
}
ๆไปถ: gateway/run.py
def _create_adapter(self, platform: Platform, config: Any) -> Optional[BasePlatformAdapter]:
# ... ๅ
ถไปๅนณๅฐๅค็ ...
elif platform == Platform.WEBSOCKET:
from gateway.platforms.websocket import WebSocketAdapter, check_websocket_requirements
if not check_websocket_requirements():
logger.warning("WebSocket: aiohttp not installed")
return None
adapter = WebSocketAdapter(config)
adapter.gateway_runner = self # ็จไบ่ทจๅนณๅฐๆถๆฏๆ้
return adapter
# WebSocket ๅนณๅฐๅ
ๆๆ๏ผ้่ฟ token ่ช่ก่ฎค่ฏ๏ผ
if source.platform in {Platform.HOMEASSISTANT, Platform.WEBHOOK, Platform.WEBSOCKET}:
return True
# ๆๆๆ ๅฐ
platform_env_map = {
# ... ๅ
ถไปๅนณๅฐ ...
Platform.WEBSOCKET: "WEBSOCKET_ALLOWED_USERS",
}
ๆไปถ: test_websocket.py
| ๆต่ฏ้กน | ่ฏดๆ |
|---|---|
| ๅฅๅบทๆฃๆฅ | ้ช่ฏๆๅกๅจๆฏๅฆๆญฃๅธธ่ฟ่ก |
| ่ฟๆฅๆต่ฏ | ๅปบ็ซ WebSocket ่ฟๆฅ |
| ่ฎค่ฏๆต่ฏ | ้ช่ฏ token ่ฎค่ฏ |
| ๆถๆฏๆต่ฏ | ๅ้/ๆฅๆถๆถๆฏ |
โ
WebSocket server is healthy:
Status: ok
Platform: websocket
Clients: 0/10
โ
Connected successfully!
๐ก Connection confirmed
Client ID: 1778810189796-1
Authenticated: True
๐ Pong received
๐ค Hermes response received
โ
Test completed!
# ๅฏๅจ็ฝๅ
ณ
$env:HERMES_HOME="C:\Users\a\Desktop\hermes-agent-main\hermes-agent-main\.hermes"
$env:WEBSOCKET_TOKEN="my-secret-token"
python -c "from hermes_cli.gateway import run_gateway; run_gateway(verbose=2)"
# ๆต่ฏ่ฟๆฅ
python test_websocket.py my-secret-token
้
็ฝฎๆไปถ: .hermes/config.yaml
platforms:
websocket:
enabled: true
extra:
host: "127.0.0.1"
port: 8765
token: "my-secret-token"
max_connections: 10
็ฏๅขๅ้ๆนๅผ:
$env:WEBSOCKET_TOKEN="my-secret-token"
WebSocket URL:
ws://127.0.0.1:8765/ws?token=my-secret-token
ๅฅๅบทๆฃๆฅ:
http://127.0.0.1:8765/health
ๅฎขๆท็ซฏๅ้:
{
"type": "message",
"content": "Hello, Hermes!",
"session_id": "optional-session-id"
}
ๆๅก็ซฏๅๅบ:
{
"type": "response",
"content": "Hi there!",
"session_id": "session-id"
}
| ๆไปถ | ่ทฏๅพ | ่ฏดๆ |
|---|---|---|
websocket.py |
gateway/platforms/websocket.py |
WebSocket ๅนณๅฐ้้ ๅจ |
test_websocket.py |
test_websocket.py |
ๆต่ฏ่ๆฌ |
config.yaml |
.hermes/config.yaml |
ๆต่ฏ้ ็ฝฎๆไปถ |
WEBSOCKET_PLATFORM_DOCUMENTATION.md |
WEBSOCKET_PLATFORM_DOCUMENTATION.md |
ๆฌๆๆกฃ |
| ๆไปถ | ่ทฏๅพ | ไฟฎๆนๅ ๅฎน |
|---|---|---|
config.py |
gateway/config.py |
ๆทปๅ Platform.WEBSOCKET ๆไธพ |
config.py |
gateway/config.py |
ๆทปๅ ่ฟๆฅๆฃๆฅๅจ |
run.py |
gateway/run.py |
ๆทปๅ ้้ ๅจๅทฅๅ้ป่พ |
run.py |
gateway/run.py |
ๆทปๅ ๆๆ้ ็ฝฎ |
| ๆๆฏ | ็ๆฌ | ็จ้ |
|---|---|---|
| Python | 3.11+ | ไธป่ฏญ่จ |
| aiohttp | ^3.9 | WebSocket ๆๅกๅจ |
| Hermes Agent | - | ๅบ็กๆกๆถ |
# ๅผๅ็ฏๅขๅฏๅจ
cd C:\Users\a\Desktop\hermes-agent-main\hermes-agent-main
$env:HERMES_HOME="C:\Users\a\Desktop\hermes-agent-main\hermes-agent-main\.hermes"
python -c "from hermes_cli.gateway import run_gateway; run_gateway(verbose=2)"
# ็ไบง็ฏๅขๅฏๅจ๏ผไฝฟ็จ้ป่ฎค HERMES_HOME๏ผ
python -c "from hermes_cli.gateway import run_gateway; run_gateway()"
# ๆต่ฏ WebSocket ่ฟๆฅ
python test_websocket.py <your-token>
ๆๆกฃ็ๆฌ: v1.0ๅๅปบๆฅๆ: 2026-05-15ไฝ่ : Hermes Agent Development Team