Framework-agnostic SDK for building A2A/kagent-compliant agent runners.
Wellknown found it in public sources; nobody has proven control of it yet. Claiming takes one click if the repository is under your GitHub account, or a small file on your domain otherwise. Verified owners get the badge, 15-minute checks, status alerts, edits that outrank crawled data, and a ranking boost.
Agents can do it too: POST https://wellknown.network/api/v1/claims with {"agent":"a2a-agent-sdk","method":"well_known_file"} — machine-readable steps at claim.json, guide at /docs/claim.
Everything here was measured by our prober or read from a registry. Nothing is self-reported.
Attributed to the source that supplied each field. Treated as claims, not facts.
# a2a-agent-sdk A framework-agnostic SDK for building [A2A](https://github.com/a2aproject/A2A)-compliant agent runners that work with [kagent](https://kagent.dev)'s BYO (bring-your-own) agent pattern. Plug in **any** agent implementation — LangGraph, a plain function, a different framework entirely — and get a fully working A2A service for free: agent-card discovery, `message/send`, `message/stream`, health, and API-key auth. The point of this SDK: your agent implementation can change completely, but the input your callers send and the output they get back never do. ## Install ```bash pip install -e /path/to/a2a-agent-sdk ``` (Not yet published to a package index — install from a local checkout or a git URL.) ## Quickstart Implement one method, `invoke`, that takes the conversation so far and returns text: ```python from a2a_agent_sdk import A2ARunner, RunnerConfig, Message class MyAgent: def invoke(self, messages: list[Message]) -> str: last_user_text = messages[-1].content return f"You said: {last_user_text}" runner = A2ARunner( agent=MyAgent(), config=RunnerConfig(name="My Agent", description="Echoes the user."), ) app = runner.app # a plain FastAPI instance ``` Run it: ```bash uvicorn app:app --host 0.0.0.0 --port 8080 ``` Try it: ```bash curl -X POST http://localhost:8080/ \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":"1","method":"message/send","params":{"message":{"parts":[{"kind":"text","text":"hello"}]}}}' ``` See `examples/function_agent/` for the complete runnable version of this example. ## Adding real streaming If your agent can produce text incrementally, implement `astream` too and `message/stream` will emit it token-by-token instead of as one chunk: ```python from typing import AsyncIterator class MyStreamingAgent: def invoke(self, messages: list[Message]) -> str: return "hello there friend " async def astream(self, messages: list[Message]) -> AsyncIterator[str]…
Mapped onto the structured taxonomy from declared text and observed tool names. Confidence shown for derived entries.
Every source is kept verbatim. Field changes are logged as events.