Wrap an existing Google ADK / OpenAI Agents SDK / Claude Agent SDK agent and make it talk A2A in one or two lines of code.
Project description
Bridge ADK
Wrap an existing Google ADK / OpenAI Agents SDK / Claude Agent SDK agent and make it talk A2A — in one or two lines of code.
import bridge_adk
bridge_adk.serve(my_agent, port=9000) # any supported framework — that's it
remote = bridge_adk.connect("http://localhost:9000")
answer = await remote.ask("Summarize the latest sales report")
A2A (Agent2Agent, now a Linux Foundation project) is the open standard for agent-to-agent interoperability. Every major vendor ships its own agent SDK, but getting agents from different SDKs to call each other still means hand-writing protocol plumbing. Bridge ADK is that plumbing, done once.
Documentation
Full guides live in docs/: installation, 5-minute quickstart, serving each SDK, client usage, orchestration walkthrough, custom adapters, deployment, API reference, and troubleshooting.
Why this exists (the gap)
| Existing option | What it covers | What's missing |
|---|---|---|
Google ADK to_a2a() |
ADK agents only | Nothing for OpenAI / Claude agents |
Pydantic FastA2A |
Pydantic AI agents only | Other frameworks |
a2a-adapter |
n8n, LangGraph, CrewAI, Claude Code CLI, Codex, Ollama | The three big vendor agent SDKs |
python-a2a |
Its own agent framework | Wrapping existing SDK agents |
Official a2a-sdk |
Full protocol implementation | ~50 lines of executor/card/handler boilerplate per agent |
Bridge ADK fills the hole in the middle: one library, one call, the three major vendor agent SDKs — plus plain Python callables and a registry for anything else.
Install
pip install bridge-adk # core (a2a-sdk, uvicorn, httpx)
pip install bridge-adk[openai] # + OpenAI Agents SDK support
pip install bridge-adk[adk] # + Google ADK support
pip install bridge-adk[claude] # + Claude Agent SDK support
pip install bridge-adk[all]
Serve an agent (server side)
The framework is auto-detected — no flags, no subclassing.
OpenAI Agents SDK
from agents import Agent
import bridge_adk
triage = Agent(name="triage", instructions="Route customer questions.")
bridge_adk.serve(triage, port=9001)
Google ADK
from google.adk.agents import Agent
import bridge_adk
researcher = Agent(name="researcher", model="gemini-2.0-flash",
description="Finds and summarizes information.")
bridge_adk.serve(researcher, port=9002)
Claude Agent SDK (an agent here is a ClaudeAgentOptions)
from claude_agent_sdk import ClaudeAgentOptions
import bridge_adk
coder = ClaudeAgentOptions(system_prompt="You are a careful Python reviewer.")
bridge_adk.serve(coder, name="reviewer", port=9003)
Plain function (escape hatch / testing)
async def echo(prompt: str) -> str:
"Echoes the prompt."
return f"echo: {prompt}"
bridge_adk.serve(echo, port=9000)
Each server exposes a spec-compliant agent card at
/.well-known/agent-card.json, JSON-RPC at /, and the A2A REST binding —
all generated from the agent's own name/description/instructions.
Need the ASGI app instead of a blocking server (e.g. for gunicorn/deployment)?
app = bridge_adk.to_a2a(my_agent, url="https://agents.example.com/reviewer/")
Talk to an agent (client side)
remote = bridge_adk.connect("http://localhost:9002")
answer = await remote.ask("What changed in the A2A 1.0 spec?")
answer = remote.ask_sync("...") # blocking variant
answer = await remote.ask("follow-up", context_id="conv-1") # multi-turn
Cross-framework: drop a remote agent into another SDK as a tool
This is the part that makes agents talk to each other:
remote = bridge_adk.connect("http://localhost:9002") # a Google ADK agent
# ...inside an OpenAI Agents SDK agent:
from agents import Agent
boss = Agent(name="boss", instructions="Delegate research.",
tools=[remote.as_openai_tool()])
# ...inside a Google ADK agent:
from google.adk.agents import Agent
boss = Agent(name="boss", model="gemini-2.0-flash",
tools=[remote.as_adk_tool()])
# ...inside a Claude Agent SDK agent:
from claude_agent_sdk import ClaudeAgentOptions
options = ClaudeAgentOptions(
mcp_servers={"research": remote.as_claude_mcp_server()},
allowed_tools=["mcp__research"],
)
The tool name and description come from the remote agent card, so the calling LLM knows what the remote agent is good at. Any A2A server works — not just ones served by Bridge ADK.
Extending to other frameworks
from bridge_adk import BridgeAdapter, AgentMeta, register_adapter
class MyFrameworkAdapter(BridgeAdapter):
name = "my-framework"
def matches(self, agent): ...
def metadata(self, agent): return AgentMeta(name=..., description=...)
async def stream(self, agent, prompt, context_id):
yield await agent.do_the_thing(prompt)
register_adapter(MyFrameworkAdapter())
How it works
your agent ──► adapter (auto-detected) ──► BridgeExecutor ──► a2a-sdk v1 runtime
├─ agent card route
├─ JSON-RPC binding
└─ REST binding
remote A2A agent ──► connect() ──► RemoteAgent.ask() / .as_<framework>_tool()
Built on the official a2a-sdk
(v1.1+, A2A spec 1.0). Framework SDKs are imported lazily — Bridge ADK itself
only depends on the A2A SDK, uvicorn, and httpx.
Session mapping: each A2A context_id maps to a session in the wrapped
framework where the framework supports it (Google ADK sessions today; OpenAI
Agents SDK sessions are on the roadmap — calls are currently stateless there).
Limitations (v0.1)
- Text in / text out. File and structured-data parts are not yet mapped.
- Token-level streaming is aggregated into a single artifact (the A2A task lifecycle events still stream).
- No auth on the served endpoints — put it behind your gateway, or use a2a-sdk interceptors via a custom build for now.
Running the tests
pip install -e .[dev]
pytest
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 bridge_adk-0.1.0.tar.gz.
File metadata
- Download URL: bridge_adk-0.1.0.tar.gz
- Upload date:
- Size: 18.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a31cdac76ffdf1546f7d846caec0c5945c4ea83476c7b08ba01fd64b648a4751
|
|
| MD5 |
fa44bbf10f212462b4f636e0680bf3d6
|
|
| BLAKE2b-256 |
57322f06798fe3a9383d97b5ba29f71ccd3bcdc31bc848aebfe780b0abbeba54
|
File details
Details for the file bridge_adk-0.1.0-py3-none-any.whl.
File metadata
- Download URL: bridge_adk-0.1.0-py3-none-any.whl
- Upload date:
- Size: 17.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
08ec010f95cfcfc0c605a45a193ac73566c481146bdfe646a89582c2a101b144
|
|
| MD5 |
a5c43c495e39b00ba97efe87bb3e8ac6
|
|
| BLAKE2b-256 |
d8c4f5598996fe78203ab9686a7b82c8d9ca15f81a75887d2d49e6efdeb7e9bd
|