Hybro Hub — daemon and Gateway client for connecting local and cloud A2A agents on hybro.ai.
Project description
Hybro Hub
Your local & remote AI agents — private, powerful, unified.
Hybro Hub is a lightweight daemon that connects your local AI agents to hybro.ai — so you can use local and cloud agents side by side in one portal, with full control over where your data goes.
pip install hybro-hub
The Problem
AI agents today force a choice:
- Cloud platforms (ChatGPT, Devin, Cursor Cloud) are powerful but require sending your data to third-party servers.
- Local runtimes (Ollama, LM Studio) keep data private but are isolated — no access to specialized cloud agents, no shared UI.
You shouldn't have to choose between privacy and power.
The Solution
Hybro Hub bridges local and cloud. Open hybro.ai, see your local Ollama model next to cloud agents like a legal reviewer or code analyst. Chat with any of them. Your local agents process on your machine — your data never leaves. Cloud agents are there when you need more capability.
One portal. Your choice, per conversation.
Get Started in 5 Minutes
1. Install
pip install hybro-hub
2. Get your API key
Go to hybro.ai/d/discovery-api-keys → API Keys → Generate New Key. Copy the key (starts with hybro_).
3. Start the hub
hybro-hub start --api-key hybro_your_key_here
The hub starts as a background daemon and returns you to the prompt immediately. Logs are written to ~/.hybro/hub.log. The API key is saved to ~/.hybro/config.yaml — subsequent starts don't need it.
hybro-hub status # check local daemon state and cloud connection
hybro-hub stop # stop the daemon gracefully
4. Launch a local agent
Start a local LLM as an A2A agent (requires Ollama installed):
hybro-hub agent start ollama --model llama3.2
You'll see:
🔗 Connected to hybro.ai
📡 Found 1 local agent:
• My Ollama Chat (llama3.2) — localhost:10010
Agents synced to hybro.ai. Open hybro.ai to start chatting.
5. Open hybro.ai
Refresh hybro.ai. Your local agent appears alongside cloud agents:
☁️ Legal Contract Reviewer (cloud)
☁️ Code Review Pro (cloud)
🏠 My Ollama Chat (llama3.2) (local · online)
Add it to a room, send a message. The response streams back with a 🏠 Local badge — your data never left your machine.
How It Works
┌─────────────────────────────────────────────────┐
│ Your Machine │
│ │
│ Hybro Hub (background daemon) │
│ ├── Your local agents (Ollama, custom, etc.) │
│ ├── Privacy router │
│ └── Relay client ──outbound HTTPS only──┐ │
│ │ │
└───────────────────────────────────────────┼─────┘
│
▼
┌─────────────────────────────────────────────────┐
│ hybro.ai Cloud │
│ │
│ ├── Web portal (your browser) │
│ ├── Cloud agents (marketplace) │
│ ├── Relay service (routes to your hub) │
│ └── Message history & rooms │
└─────────────────────────────────────────────────┘
Key properties:
- Outbound-only — the hub initiates all connections. No inbound ports, no firewall changes, works behind NAT.
- Portal-first — you always use hybro.ai. No localhost URLs, no mode switching. Local agents just appear as more agents in the same portal.
- A2A protocol — local and cloud agents speak the same Agent-to-Agent protocol. Any A2A-compatible agent works.
- Graceful degradation — if the hub is offline, cloud agents still work. Local agents show as "offline" and messages queue until the hub reconnects.
Privacy by Architecture
Hybro Hub doesn't just promise privacy — the architecture enforces it.
Your data stays local when you use local agents. Messages to local agents route through the relay to your hub, get processed entirely on your machine, and only the response travels back. The cloud relay sees message metadata (routing info), not your content.
Privacy indicators in the UI
Every message in hybro.ai shows where it was processed:
- 🏠 Local (green) — processed on your machine, data did not leave
- ☁️ Cloud (blue) — processed by a cloud agent via hybro.ai
Sensitivity detection
The hub scans outbound messages for sensitive content before they reach cloud agents:
- PII detection — emails, phone numbers, SSNs, credit cards, API keys
- Custom keywords — configure terms like "medical", "financial", "confidential"
- Custom patterns — add regex rules for project-specific data (e.g.,
PROJ-\d{4})
Currently logs detections only. Active blocking and anonymization are planned for a future release.
CLI Reference
hybro-hub start
Start the hub daemon. Connects to hybro.ai, discovers local agents, and syncs them to the cloud. The process detaches immediately and runs in the background.
hybro-hub start --api-key hybro_...
The API key is saved to ~/.hybro/config.yaml after first use — subsequent starts don't need it. Only one instance can run per machine; a second start will exit with an error if the daemon is already running.
Options:
| Option | Description |
|---|---|
--api-key |
Hybro API key (also saves to ~/.hybro/config.yaml) |
--foreground, -f |
Run in the foreground instead of daemonizing (useful for debugging) |
Daemon logs are written to ~/.hybro/hub.log (rotating, max 10 MB × 3 files).
hybro-hub stop
Gracefully stop the background daemon. Sends SIGTERM and waits up to 10 seconds before sending SIGKILL. Removes the PID lock file on success so that hybro-hub status correctly shows "Stopped".
hybro-hub stop
hybro-hub status
Show the state of the local daemon and its connection to the cloud relay.
hybro-hub status
Example output when running:
Local daemon: Running (PID 12345)
Log file: /Users/you/.hybro/hub.log
Cloud relay: Online (hub abc123...)
Agents: 3 total (3 active, 0 inactive)
Example output when stopped:
Local daemon: Stopped
Cloud relay: Online (hub abc123...)
Agents: 4 total (3 active, 1 inactive)
The cloud relay section queries hybro.ai directly, so it reflects the last known state even when the local daemon is not running.
hybro-hub agents
List all discovered local agents and their health status.
hybro-hub agents
hybro-hub agent start
Launch a local A2A agent from a bundled adapter. Supported adapters: ollama, openclaw, n8n.
Ollama — local LLM (requires Ollama):
hybro-hub agent start ollama
hybro-hub agent start ollama --model mistral:7b --port 10020 --system-prompt "You are a helpful assistant"
OpenClaw — AI coding agent (requires OpenClaw):
hybro-hub agent start openclaw
hybro-hub agent start openclaw --thinking medium --agent-id main
n8n — workflow automation (requires a running n8n instance):
hybro-hub agent start n8n --webhook-url http://localhost:5678/webhook/my-agent
Common options:
| Option | Default | Description |
|---|---|---|
--port |
10010 |
Port for the A2A agent server |
--name |
auto | Agent display name |
--timeout |
varies | Request timeout in seconds |
Adapter-specific options:
| Option | Adapter | Description |
|---|---|---|
--model |
ollama | Ollama model (default: llama3.2) |
--system-prompt |
ollama | Custom system prompt |
--thinking |
openclaw | Thinking level: off/minimal/low/medium/high/xhigh |
--agent-id |
openclaw | OpenClaw agent ID |
--openclaw-path |
openclaw | Path to the openclaw binary |
--webhook-url |
n8n | Webhook URL (required) |
Requires the
a2a-adapterpackage:pip install a2a-adapter
Configuration
The hub reads from ~/.hybro/config.yaml. A minimal working example:
cloud:
api_key: ${HYBRO_API_KEY} # or paste directly: "hybro_your_key_here"
A fully-annotated template is available in config.yaml.example. Below is a representative example covering all sections:
# Cloud connection
cloud:
api_key: ${HYBRO_API_KEY} # or ${HYBRO_API_KEY:-} to allow unset
gateway_url: "https://api.hybro.ai"
# Agent discovery
agents:
auto_discover: true # probe localhost ports for A2A agents
auto_discover_exclude_ports: # skip non-agent ports (built-in defaults shown)
- 22 # SSH
- 53 # DNS
- 80 # HTTP
- 443 # HTTPS
- 3306 # MySQL
- 5432 # PostgreSQL
- 6379 # Redis
- 27017 # MongoDB
# auto_discover_scan_range: [10000, 11000] # restrict scan to a port range
local: # always-registered agents
- name: "My Custom Agent"
url: "http://localhost:9001"
# Privacy (classification is logging-only; messages are not blocked or rerouted)
privacy:
sensitive_keywords: ["medical", "financial", "confidential"]
sensitive_patterns: ["PROJ-\\d{4}"]
# Offline resilience — events that fail delivery are queued to disk and retried
publish_queue:
enabled: true
max_size_mb: 50
ttl_hours: 24
drain_interval: 30 # seconds between retry cycles
drain_batch_size: 20
max_retries_critical: 20 # agent_response, agent_error, processing_status
max_retries_normal: 5 # task_submitted, artifact_update, task_status
# Heartbeat interval (seconds)
heartbeat_interval: 30
The config file supports ${VAR}, ${VAR:-default}, and $${VAR} (literal) environment variable references (expanded before parsing, matching the OTel Collector convention). To set the API key via a shell environment variable without editing the file, add to your shell profile:
export HYBRO_API_KEY="hybro_..."
Or set it once via the CLI (saves the literal key to the config file):
hybro-hub start --api-key hybro_...
Bring Your Own Agent
Any agent that speaks the A2A protocol works with Hybro Hub.
Auto-discovery
With auto_discover: true (the default), the hub automatically finds A2A agents running on localhost by probing listening TCP ports for agent cards at /.well-known/agent.json or /.well-known/agent-card.json. Just start your agent — the hub will find it.
Manual registration
Add agents to ~/.hybro/config.yaml:
agents:
local:
- name: "My Research Agent"
url: "http://localhost:8001"
- name: "Team Agent"
url: "http://192.168.1.50:8080" # LAN agents work too
Building an A2A agent
Use the a2a-python SDK to build a compatible agent:
from a2a.server.apps import A2AStarletteApplication
from a2a.server.request_handlers import DefaultRequestHandler
app = A2AStarletteApplication(
agent_card=my_card,
http_handler=DefaultRequestHandler(agent_executor=my_executor),
)
The hub discovers it automatically and syncs it to hybro.ai.
Hybro SDK (Python Client)
The repo also ships hybro_hub — a Python client for calling cloud agents programmatically via the Hybro Gateway API. Use this when you want to integrate cloud agents into your own code, outside of the hub.
Quickstart
import asyncio
from hybro_hub import HybroGateway
async def main():
async with HybroGateway(api_key="hybro_...") as gw:
agents = await gw.discover("legal contract review")
async for event in gw.stream(agents[0].agent_id, "Review this NDA"):
print(event.data)
asyncio.run(main())
Methods
| Method | Description |
|---|---|
discover(query, *, limit=None) |
Search for agents by natural language. Returns list[AgentInfo]. |
send(agent_id, text, *, context_id=None) |
Send a message, get the full response. Returns dict. |
stream(agent_id, text, *, context_id=None) |
Stream a response via SSE. Yields StreamEvent. |
get_card(agent_id) |
Fetch an agent's A2A card. Returns dict. |
Error handling
from hybro_hub import AuthError, RateLimitError, AgentNotFoundError
try:
result = await gw.send(agent_id, "Hello")
except AuthError:
print("Invalid API key")
except AgentNotFoundError:
print("Agent not found")
except RateLimitError as e:
print(f"Rate limited — retry after {e.retry_after}s")
| Exception | Status | Cause |
|---|---|---|
AuthError |
401 | Invalid API key |
AccessDeniedError |
403 | No access to agent |
AgentNotFoundError |
404 | Agent not found / inactive |
RateLimitError |
429 | Rate limit exceeded |
AgentCommunicationError |
502 | Upstream agent error |
GatewayError |
any | Base class |
Requirements
Development
git clone https://github.com/hybro-ai/hybro-hub.git
cd hybro-hub
pip install -e ".[dev]"
pytest
License
Apache License 2.0 — see LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hybro_hub-0.1.16.tar.gz.
File metadata
- Download URL: hybro_hub-0.1.16.tar.gz
- Upload date:
- Size: 141.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f7e0880114d8e0e4c6255a39f4d4b4a9bcc5b4f5a13ffc966c0a3ebb94cd6299
|
|
| MD5 |
56201891bb4fb2b3875fe128a4ff8abf
|
|
| BLAKE2b-256 |
d1a36e0444a81ad0b67e709a993a127f6a664ee3b5362e752c2968f694007407
|
Provenance
The following attestation bundles were made for hybro_hub-0.1.16.tar.gz:
Publisher:
publish.yml on hybroai/hybro-hub
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hybro_hub-0.1.16.tar.gz -
Subject digest:
f7e0880114d8e0e4c6255a39f4d4b4a9bcc5b4f5a13ffc966c0a3ebb94cd6299 - Sigstore transparency entry: 1259390291
- Sigstore integration time:
-
Permalink:
hybroai/hybro-hub@dfc04c5c6066b1d791c7c3e5e4fa154627bf6d88 -
Branch / Tag:
refs/tags/v0.1.16 - Owner: https://github.com/hybroai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@dfc04c5c6066b1d791c7c3e5e4fa154627bf6d88 -
Trigger Event:
release
-
Statement type:
File details
Details for the file hybro_hub-0.1.16-py3-none-any.whl.
File metadata
- Download URL: hybro_hub-0.1.16-py3-none-any.whl
- Upload date:
- Size: 54.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f280a84a1062ca1be903c3cb1e5542bf53bc9b4c456cda23fcf3840df51ba1a6
|
|
| MD5 |
e73606881d02b8f198a801ff7385f1b0
|
|
| BLAKE2b-256 |
3cc5c413bd908ac32becca41e48d3c695df579781eba14356621ccb0b43a27f2
|
Provenance
The following attestation bundles were made for hybro_hub-0.1.16-py3-none-any.whl:
Publisher:
publish.yml on hybroai/hybro-hub
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hybro_hub-0.1.16-py3-none-any.whl -
Subject digest:
f280a84a1062ca1be903c3cb1e5542bf53bc9b4c456cda23fcf3840df51ba1a6 - Sigstore transparency entry: 1259390339
- Sigstore integration time:
-
Permalink:
hybroai/hybro-hub@dfc04c5c6066b1d791c7c3e5e4fa154627bf6d88 -
Branch / Tag:
refs/tags/v0.1.16 - Owner: https://github.com/hybroai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@dfc04c5c6066b1d791c7c3e5e4fa154627bf6d88 -
Trigger Event:
release
-
Statement type: