hyperliquid.session
Documentation for eth_defi.hyperliquid.session Python module.
HTTP session management for Hyperliquid API.
This module provides session creation with retry logic and rate limiting for Hyperliquid API requests.
Rate limiting is thread-safe using SQLite backend, so the session can be
shared across multiple threads when using joblib.Parallel or similar.
The HyperliquidSession carries the API URL so that downstream
functions do not need a separate server_url argument.
Proxy support
When a ProxyRotator is configured
(via HyperliquidSession.configure_rotator() or the rotator
parameter to create_hyperliquid_session()), the session automatically
routes API requests through proxies. post_info()
rotates to the next proxy on connection failures or rate-limit responses, and
records failures via the rotator’s
ProxyStateManager so that
persistently bad proxies are skipped in future runs.
Rate limiting with proxies
Hyperliquid rate limits are per IP. When proxies are used, each worker
thread gets its own session clone (via HyperliquidSession.clone_for_worker())
with an independent rate limiter so that each proxy IP can use its full
rate allowance independently.
Functions
|
Create a |
Classes
A |
- class HyperliquidSession
Bases:
requests.sessions.SessionA
requests.Sessionsubclass that carries the Hyperliquid API URL.All Hyperliquid API functions accept a
HyperliquidSessionand readapi_urlfrom it, removing the need for a separateserver_urlargument on every call.The session optionally manages a
ProxyRotatorfor automatic proxy rotation on failure. Useconfigure_rotator()or passrotatortocreate_hyperliquid_session().Use
create_hyperliquid_session()to create instances.- property active_proxy_url: Optional[str]
Currently active proxy URL, or None if proxies are disabled.
- clone_for_worker(proxy_start_index=0)
Create a lightweight clone for a worker thread.
The clone shares the same API URL. When proxies are configured, the clone gets its own
ProxyRotatorstarting atproxy_start_indexso that each worker hits a different proxy. The underlyingProxyStateManageris shared, so failures recorded by any worker are persisted globally.Each clone gets its own independent rate limiter because Hyperliquid rate limits are per IP. When workers use different proxies, each proxy IP gets its full rate allowance.
- Parameters
proxy_start_index (int) – Starting proxy index for this worker (typically the worker ordinal: 0, 1, 2, …).
- Returns
A new
HyperliquidSessionwith its own proxy rotation state and rate limiter.- Return type
- close()
Closes all adapters and as such the session
- configure_rotator(rotator)
Configure proxy rotation using a
ProxyRotator.The rotator provides thread-safe proxy selection and persistent failure tracking via its optional
ProxyStateManager.- Parameters
rotator (eth_defi.event_reader.webshare.ProxyRotator) – A
ProxyRotator(typically fromload_proxy_rotator()).- Return type
None
- delete(url, **kwargs)
Sends a DELETE request. Returns
Responseobject.- Parameters
url – URL for the new
Requestobject.**kwargs – Optional arguments that
requesttakes.
- Return type
requests.Response
- get(url, **kwargs)
Sends a GET request. Returns
Responseobject.- Parameters
url – URL for the new
Requestobject.**kwargs – Optional arguments that
requesttakes.
- Return type
requests.Response
- get_adapter(url)
Returns the appropriate connection adapter for the given URL.
- Return type
requests.adapters.BaseAdapter
- get_redirect_target(resp)
Receives a Response. Returns a redirect URI or
None
- head(url, **kwargs)
Sends a HEAD request. Returns
Responseobject.- Parameters
url – URL for the new
Requestobject.**kwargs – Optional arguments that
requesttakes.
- Return type
requests.Response
- merge_environment_settings(url, proxies, stream, verify, cert)
Check the environment and merge it with some settings.
- Return type
- mount(prefix, adapter)
Registers a connection adapter to a prefix.
Adapters are sorted in descending order by prefix length.
- options(url, **kwargs)
Sends a OPTIONS request. Returns
Responseobject.- Parameters
url – URL for the new
Requestobject.**kwargs – Optional arguments that
requesttakes.
- Return type
requests.Response
- patch(url, data=None, **kwargs)
Sends a PATCH request. Returns
Responseobject.- Parameters
url – URL for the new
Requestobject.data – (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the
Request.**kwargs – Optional arguments that
requesttakes.
- Return type
requests.Response
- post(url, data=None, json=None, **kwargs)
Sends a POST request. Returns
Responseobject.- Parameters
url – URL for the new
Requestobject.data – (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the
Request.json – (optional) json to send in the body of the
Request.**kwargs – Optional arguments that
requesttakes.
- Return type
requests.Response
- post_info(payload, timeout=30.0)
POST to the Hyperliquid
/infoendpoint with graceful proxy rotation.Uses the session’s configured proxy (if any). Rotation policy:
Rate-limit / backend overload responses (HTTP 429, 500, 502, 503, 504): rotate to the next proxy but do NOT record the current proxy as dead — it is only throttled, and will recover within minutes. This avoids shrinking the working pool across runs via the
ProxyStateManager14-day grace period.Connection errors (
requests.ConnectionError,requests.Timeout,OSError): rotate AND record the current proxy as dead via the state manager, because the proxy itself is unreachable.
After
MAX_PROXY_ROTATIONSconsecutive rotations in a single call, returns whatever response comes back (or re-raises the last exception) rather than continuing to rotate.- Parameters
- Returns
The
requests.Responseobject.- Raises
requests.ConnectionError – If the request fails and no proxy rotation is available.
requests.Timeout – If the request times out and no proxy rotation is available.
- Return type
requests.models.Response
- prepare_request(request)
Constructs a
PreparedRequestfor transmission and returns it. ThePreparedRequesthas settings merged from theRequestinstance and those of theSession.- Parameters
request –
Requestinstance to prepare with this session’s settings.- Return type
requests.PreparedRequest
- put(url, data=None, **kwargs)
Sends a PUT request. Returns
Responseobject.- Parameters
url – URL for the new
Requestobject.data – (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the
Request.**kwargs – Optional arguments that
requesttakes.
- Return type
requests.Response
- rebuild_auth(prepared_request, response)
When being redirected we may want to strip authentication from the request to avoid leaking credentials. This method intelligently removes and reapplies authentication where possible to avoid credential loss.
- rebuild_method(prepared_request, response)
When being redirected we may want to change the method of the request based on certain specs or browser behavior.
- rebuild_proxies(prepared_request, proxies)
This method re-evaluates the proxy configuration by considering the environment variables. If we are redirected to a URL covered by NO_PROXY, we strip the proxy configuration. Otherwise, we set missing proxy keys for this URL (in case they were stripped by a previous redirect).
This method also replaces the Proxy-Authorization header where necessary.
- Return type
- request(method, url, params=None, data=None, headers=None, cookies=None, files=None, auth=None, timeout=None, allow_redirects=True, proxies=None, hooks=None, stream=None, verify=None, cert=None, json=None)
Constructs a
Request, prepares it and sends it. ReturnsResponseobject.- Parameters
method – method for the new
Requestobject.url – URL for the new
Requestobject.params – (optional) Dictionary or bytes to be sent in the query string for the
Request.data – (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the
Request.json – (optional) json to send in the body of the
Request.headers – (optional) Dictionary of HTTP Headers to send with the
Request.cookies – (optional) Dict or CookieJar object to send with the
Request.files – (optional) Dictionary of
'filename': file-like-objectsfor multipart encoding upload.auth – (optional) Auth tuple or callable to enable Basic/Digest/Custom HTTP Auth.
timeout (float or tuple) – (optional) How many seconds to wait for the server to send data before giving up, as a float, or a (connect timeout, read timeout) tuple.
allow_redirects (bool) – (optional) Set to True by default.
proxies – (optional) Dictionary mapping protocol or protocol and hostname to the URL of the proxy.
hooks – (optional) Dictionary mapping hook name to one event or list of events, event must be callable.
stream – (optional) whether to immediately download the response content. Defaults to
False.verify – (optional) Either a boolean, in which case it controls whether we verify the server’s TLS certificate, or a string, in which case it must be a path to a CA bundle to use. Defaults to
True. When set toFalse, requests will accept any TLS certificate presented by the server, and will ignore hostname mismatches and/or expired certificates, which will make your application vulnerable to man-in-the-middle (MitM) attacks. Setting verify toFalsemay be useful during local development or testing.cert – (optional) if String, path to ssl client cert file (.pem). If Tuple, (‘cert’, ‘key’) pair.
- Return type
requests.Response
- property request_count: int
Total HTTP requests made via
post_info().
- resolve_redirects(resp, req, stream=False, timeout=None, verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs)
Receives a Response. Returns a generator of Responses or Requests.
- property rotation_count: int
Total proxy rotations triggered by failures in
post_info().
- property rotator: Optional[eth_defi.event_reader.webshare.ProxyRotator]
The configured
ProxyRotator, or None if proxies are disabled.
- send(request, **kwargs)
Send a given PreparedRequest.
- Return type
requests.Response
- should_strip_auth(old_url, new_url)
Decide whether Authorization header should be removed when redirecting
- create_hyperliquid_session(api_url='https://api.hyperliquid.xyz', retries=5, backoff_factor=0.5, requests_per_second=1.0, pool_maxsize=32, rate_limit_db_path=PosixPath('/home/runner/.tradingstrategy/hyperliquid/rate-limit.sqlite'), rotator=None, verbose_throttling=None, proxy_failure_log_level=None)
Create a
HyperliquidSessionconfigured for Hyperliquid API.The session is configured with:
The API URL stored in
HyperliquidSession.api_urlRate limiting to respect Hyperliquid API throttling (thread-safe via SQLite)
Retry logic for handling transient errors using exponential backoff
Optional proxy support with automatic rotation on failure
The rate limiter uses SQLite backend for thread-safe coordination across multiple threads (e.g., when using
joblib.Parallelwith threading backend).When proxies are configured and workers are cloned via
HyperliquidSession.clone_for_worker(), each worker gets its own rate limiter because Hyperliquid rate limits are per IP.Example:
from eth_defi.hyperliquid.session import create_hyperliquid_session, HYPERLIQUID_TESTNET_API_URL # Mainnet (default) session = create_hyperliquid_session() # Testnet session = create_hyperliquid_session(api_url=HYPERLIQUID_TESTNET_API_URL) # With Webshare rotator (persistent failure tracking via ProxyStateManager) from eth_defi.event_reader.webshare import load_proxy_rotator rotator = load_proxy_rotator() session = create_hyperliquid_session(rotator=rotator)
- Parameters
api_url (str) – Hyperliquid API base URL. Defaults to mainnet (
HYPERLIQUID_API_URL). PassHYPERLIQUID_TESTNET_API_URLfor testnet.retries (int) – Maximum number of retry attempts for failed requests
backoff_factor (float) – Backoff factor for exponential retry delays
requests_per_second (float) – Maximum requests per second to avoid rate limiting. Defaults to 1.0 based on Hyperliquid’s 1200 weight/minute limit with most info endpoints having weight 20.
pool_maxsize (int) – Maximum number of connections to keep in the connection pool. Should be at least as large as max_workers when using parallel requests. Defaults to 32.
rate_limit_db_path (pathlib.Path) – Path to SQLite database for storing rate limit state. Using SQLite ensures thread-safe rate limiting across multiple threads. Defaults to
~/.tradingstrategy/hyperliquid/rate-limit.sqlite.rotator (Optional[eth_defi.event_reader.webshare.ProxyRotator]) – Optional
ProxyRotator(typically fromload_proxy_rotator()). Provides proxy rotation with persistent failure tracking viaProxyStateManager.verbose_throttling (Optional[bool]) –
Control rate-limit / throttling log messages.
None(default): off when proxies are used, on otherwise. With proxies, every worker thread hits the rate limiter independently and the resulting log spam is not useful.True: always log throttling messages.False: always suppress throttling messages.
proxy_failure_log_level (Optional[int]) –
Log level for proxy failure/rotation messages (from
ProxyRotator,ProxyStateManager, andLoggingRetry).None(default):logging.DEBUGwhen proxies are used,logging.WARNINGotherwise.Pass e.g.
logging.DEBUGto suppress orlogging.WARNINGto always show.
- Returns
Configured
HyperliquidSessionwith rate limiting and retry logic- Return type