Skip to main content

Data Agent Tunnel Client

Proxy local web services to the public network through Data Agent Tunnel.

Installation

pip install data-agent-tunnel-client

# or with uv
uv add data-agent-tunnel-client

Quick Start

Option 1: Simple Integration (Recommended)

The easiest way to connect - runs in a background thread, perfect for Flask/Django:

from flask import Flask
from data_agent_tunnel_client import connect_tunnel

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello from Flask!"

if __name__ == "__main__":
    # Start tunnel in background (auto prints connection info)
    connect_tunnel(
        tunnel_url="wss://...",
        local_url="http://localhost:5000",
        secret_key="your-secret-key",
        home_path="/initial_path",     # optional
    )

    # Start Flask
    app.run(port=5000)

Sync wait for connection (get return value yourself):

# Wait for connection and handle the result yourself
runner = connect_tunnel(
    tunnel_url="wss://...",
    local_url="http://localhost:5000",
    secret_key="your-secret-key",
    wait_for_connect=30,  # Wait up to 30 seconds, auto enables silent mode
)

if runner.is_connected:
    print(f"Public URL: {runner.public_url}")
    print(f"Session ID: {runner.connected_session_id}")
else:
    print("Connection failed or timeout")

app.run(port=5000)

Option 2: FastAPI Integration

For FastAPI, use create_tunnel_lifespan():

from fastapi import FastAPI
from data_agent_tunnel_client import create_tunnel_lifespan, get_tunnel_client

lifespan=create_tunnel_lifespan(
    tunnel_url="wss://...",
    local_url="http://localhost:8000",
    secret_key="your-secret-key",
    home_path="/dashboard",        # optional
)

app = FastAPI(lifespan=lifespan)

@app.get("/")
async def root():
    return {"message": "Hello from FastAPI!"}

@app.get("/tunnel-info")
async def tunnel_info():
    client = get_tunnel_client()
    return {"public_url": client.public_url if client else None}

API Reference

connect_tunnel()

Quick start function for synchronous frameworks:

from data_agent_tunnel_client import connect_tunnel

runner = connect_tunnel(
    tunnel_url="wss://...",          # Tunnel WebSocket URL
    local_url="http://...",          # Local service URL
    secret_key="your-secret-key",    # Auth key (required)
    home_path="/dashboard",          # Initial path appended to public URL (optional)
    wait_for_connect=None,           # Sync wait timeout in seconds (optional)
    silent=False,                    # Suppress default output (optional)
)

# Access connection info
print(runner.public_url)
print(runner.connected_session_id)
print(runner.is_connected)

home_path parameter:

The home_path parameter specifies the initial path to display after tunnel connection. This is useful when your app's entry point is not the root path.

# Example: If public_url is https://xxx.com?session=abc123&_tunnel_path=,
# With home_path="/dashboard", the displayed URL will be:
# https://xxx.com?session=abc123&_tunnel_path=/dashboard

create_tunnel_lifespan()

Create a lifespan context manager for FastAPI:

from data_agent_tunnel_client import create_tunnel_lifespan

lifespan = create_tunnel_lifespan(
    tunnel_url="wss://...",          # Tunnel WebSocket URL
    local_url="http://...",          # Local service URL
    secret_key="your-secret-key",    # Auth key (required)
    home_path="/",                   # Home path for display (optional)
    on_connect=None,                 # Connect callback (async or sync)
    on_disconnect=None,              # Disconnect callback (async or sync)
)

app = FastAPI(lifespan=lifespan)

Use get_tunnel_client() to access the client instance in your routes.

TunnelRunner

For more control over the background runner:

from data_agent_tunnel_client import TunnelRunner

runner = TunnelRunner(
    tunnel_url="wss://...",
    local_url="http://...",
    secret_key="your-secret-key",
    home_path="/",
    silent=False,  # Set True to suppress default output
    on_connect=lambda client: print(f"Connected: {client.public_url}"),
    on_disconnect=lambda client: print("Disconnected"),
)

runner.start()  # Non-blocking

# Sync wait for connection
if runner.wait_for_connect(timeout=30):
    print(f"Public URL: {runner.public_url}")
else:
    print("Connection failed")

TunnelClient

Low-level async client:

from data_agent_tunnel_client import TunnelClient

client = TunnelClient(
    tunnel_url="wss://...",             # Tunnel WebSocket URL
    local_url="http://...",             # Local service URL
    secret_key="your-secret-key",       # Auth key (required)
    session_id="",                      # Session ID (optional)
    reconnect=True,                     # Auto reconnect on disconnect
    reconnect_interval=5.0,             # Reconnect interval (seconds)
    ping_interval=30.0,                 # Heartbeat interval (seconds)
    request_timeout=300.0,              # Request timeout (seconds)
    max_concurrent_requests=100,        # Max concurrent requests
    on_connect=None,                    # Connect callback (async)
    on_disconnect=None,                 # Disconnect callback (async)
)

# Properties
client.public_url           # Public URL
client.connected_session_id # Session ID
client.is_connected         # Connection status

# Methods
await client.connect()      # Connect and start proxying
await client.disconnect()   # Disconnect

Proxy Support

The client automatically detects and uses system proxy settings (http_proxy, https_proxy, socks_proxy, etc.).

  • If proxy is configured, it tries to connect via proxy first
  • If proxy connection fails, it falls back to direct connection
  • Use disable_proxy=True to skip proxy entirely

License

MIT

Metadata

Release files for data-agent-tunnel-client 0.1.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for data-agent-tunnel-client 0.1.8
File Size Uploaded
data_agent_tunnel_client-0.1.8.tar.gz 23.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for data-agent-tunnel-client 0.1.8
File Interpreter ABI Platform
data_agent_tunnel_client-0.1.8-py3-none-any.whl Python 3 none any Details

Total release size: 41.5 kB

Release files / data_agent_tunnel_client-0.1.8.tar.gz

Download URL data_agent_tunnel_client-0.1.8.tar.gz
Size 23.1 kB
Tags Source
SHA-256 checksum
How to use checksums
92ffac56d51799b76cbdcd6d7a0cc1f801266ffefdc2b53baedb5cf6e4423453
BLAKE2b-256 checksum
How to use checksums
4ad1e050bbbb80ae0cf4a5f2bde760ce0aabe9af7108c04854b798662fa87f00
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / data_agent_tunnel_client-0.1.8-py3-none-any.whl

Download URL data_agent_tunnel_client-0.1.8-py3-none-any.whl
Size 18.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1b838fac6aeb7b428f34501a89e790539a3fb77abe5237d672345ae25279c85b
BLAKE2b-256 checksum
How to use checksums
e5113caaa7731eeec975e8f6fe5fde1d688608faf36c4917060096bdfebf6d86
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release history Release notifications | RSS feed

This release

0.1.8 This release

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page