From 441ac4fdb5f74fc03eaa0b3c9acc616475ff6a38 Mon Sep 17 00:00:00 2001 From: mifth Date: Sat, 20 Dec 2025 00:35:15 +0100 Subject: [PATCH 1/3] Exposed reconnect parameter for ws.run_forever() --- hyperliquid/info.py | 3 ++- hyperliquid/websocket_manager.py | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/hyperliquid/info.py b/hyperliquid/info.py index b59f81e8..ebf188cf 100644 --- a/hyperliquid/info.py +++ b/hyperliquid/info.py @@ -25,11 +25,12 @@ def __init__( # the original dex. perp_dexs: Optional[List[str]] = None, timeout: Optional[float] = None, + reconnect_ws: Optional[int] = None, # Exposed reconnect parameter to auto-reconnect ): # pylint: disable=too-many-locals super().__init__(base_url, timeout) self.ws_manager: Optional[WebsocketManager] = None if not skip_ws: - self.ws_manager = WebsocketManager(self.base_url) + self.ws_manager = WebsocketManager(self.base_url, reconnect_ws=reconnect_ws) self.ws_manager.start() if spot_meta is None: diff --git a/hyperliquid/websocket_manager.py b/hyperliquid/websocket_manager.py index 4c73a688..c947b481 100644 --- a/hyperliquid/websocket_manager.py +++ b/hyperliquid/websocket_manager.py @@ -75,7 +75,7 @@ def ws_msg_to_identifier(ws_msg: WsMsg) -> Optional[str]: class WebsocketManager(threading.Thread): - def __init__(self, base_url): + def __init__(self, base_url, reconnect_ws: int = None): super().__init__() self.subscription_id_counter = 0 self.ws_ready = False @@ -85,10 +85,11 @@ def __init__(self, base_url): self.ws = websocket.WebSocketApp(ws_url, on_message=self.on_message, on_open=self.on_open) self.ping_sender = threading.Thread(target=self.send_ping) self.stop_event = threading.Event() + self.reconnect_ws = reconnect_ws # Exposed reconnect parameter to auto-reconnect def run(self): self.ping_sender.start() - self.ws.run_forever() + self.ws.run_forever(reconnect=self.reconnect_ws) def send_ping(self): while not self.stop_event.wait(50): From ad2387347d2a405baf2e115ff6c7ee7eec606527 Mon Sep 17 00:00:00 2001 From: mifth Date: Sat, 20 Dec 2025 00:48:54 +0100 Subject: [PATCH 2/3] Set some params Optional --- hyperliquid/websocket_manager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hyperliquid/websocket_manager.py b/hyperliquid/websocket_manager.py index c947b481..c7bc5e33 100644 --- a/hyperliquid/websocket_manager.py +++ b/hyperliquid/websocket_manager.py @@ -75,7 +75,7 @@ def ws_msg_to_identifier(ws_msg: WsMsg) -> Optional[str]: class WebsocketManager(threading.Thread): - def __init__(self, base_url, reconnect_ws: int = None): + def __init__(self, base_url, reconnect_ws: Optional[int] = None): super().__init__() self.subscription_id_counter = 0 self.ws_ready = False @@ -85,7 +85,7 @@ def __init__(self, base_url, reconnect_ws: int = None): self.ws = websocket.WebSocketApp(ws_url, on_message=self.on_message, on_open=self.on_open) self.ping_sender = threading.Thread(target=self.send_ping) self.stop_event = threading.Event() - self.reconnect_ws = reconnect_ws # Exposed reconnect parameter to auto-reconnect + self.reconnect_ws: Optional[int] = reconnect_ws # Exposed reconnect parameter to auto-reconnect def run(self): self.ping_sender.start() From 2ddc2a911eac472723e6ecde3dc8240885d345a8 Mon Sep 17 00:00:00 2001 From: mifth Date: Sun, 29 Mar 2026 21:08:16 +0200 Subject: [PATCH 3/3] Add dex parameter to meta_and_asset_ctxs() Issue: https://github.com/hyperliquid-dex/hyperliquid-python-sdk/issues/278 API refererence where the "metaAndAssetCtxs" has the "dex" input: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-perpetuals-asset-contexts-includes-mark-price-current-funding-open-interest-etc --- hyperliquid/info.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hyperliquid/info.py b/hyperliquid/info.py index a86ac807..18d1cc7b 100644 --- a/hyperliquid/info.py +++ b/hyperliquid/info.py @@ -286,7 +286,7 @@ def meta(self, dex: str = "") -> Meta: """ return cast(Meta, self.post("/info", {"type": "meta", "dex": dex})) - def meta_and_asset_ctxs(self) -> Any: + def meta_and_asset_ctxs(self, dex: str = "") -> Any: """Retrieve exchange MetaAndAssetCtxs POST /info @@ -319,7 +319,7 @@ def meta_and_asset_ctxs(self) -> Any: ... ] """ - return self.post("/info", {"type": "metaAndAssetCtxs"}) + return self.post("/info", {"type": "metaAndAssetCtxs", "dex": dex}) def perp_dexs(self) -> Any: return self.post("/info", {"type": "perpDexs"})