Skip to main content

Automatic A2A Protocol Adapter for apcore Module Registry

Project description

apcore-a2a logo

apcore-a2a (Python)

PyPI Python License Coverage

What is apcore-a2a?

apcore-a2a is the A2A (Agent-to-Agent) protocol adapter for the apcore ecosystem.

It solves a common problem: you've built AI capabilities with apcore modules, but you need them to talk to other AI agents over a standard protocol. apcore-a2a bridges that gap — it reads your existing module metadata (schemas, descriptions, examples) and automatically exposes them as a standards-compliant A2A server. No hand-written Agent Cards, no JSON-RPC boilerplate, no manual task lifecycle management.

In short: apcore modules + apcore-a2a = a fully functional A2A agent, ready to be discovered and invoked by any A2A-compatible client.

Also available in TypeScript: apcore-a2a (npm)

Features

  • One-call server — launch a compliant A2A server with serve(registry)
  • Automatic Agent Card/.well-known/agent.json generated from module metadata
  • Skill mapping — apcore modules become A2A Skills with names, descriptions, tags, and examples
  • Full task lifecycle — submitted, working, completed, failed, canceled, input-required
  • SSE streamingmessage/stream with real-time status and artifact updates
  • Push notifications — optional webhook delivery of task state changes
  • JWT authentication — tokens bridged to apcore's Identity context
  • A2A Explorer UI — browser UI for discovering and testing skills
  • Built-in clientA2AClient for calling remote A2A agents
  • Pluggable storage — swap in Redis or PostgreSQL via the TaskStore protocol
  • Observability/health, /metrics endpoints, structured logging
  • Dynamic registration — add/remove modules at runtime without restart

Requirements

  • Python >= 3.11
  • apcore >= 0.7.0

For Users: Getting Started

Installation

pip install apcore-a2a

Expose your modules as an A2A Agent

If you already have apcore modules, three lines turn them into a discoverable agent:

from apcore import Registry
from apcore_a2a import serve

registry = Registry(extensions_dir="./extensions")
registry.discover()

serve(registry)  # Starts on http://0.0.0.0:8000

Your agent is now live at http://localhost:8000/.well-known/agent.json.

Call a remote A2A Agent

Use the built-in client to discover and invoke any A2A-compliant agent:

import asyncio
from apcore_a2a import A2AClient

async def main():
    async with A2AClient("http://remote-agent:8000") as client:
        # Discover what the agent can do
        card = await client.discover()
        print(f"Agent: {card['name']}, Skills: {len(card['skills'])}")

        # Send a message
        task = await client.send_message(
            {"role": "user", "parts": [{"kind": "text", "text": "Hello!"}]},
            skill_id="my.skill",
        )
        print(f"Result: {task['status']['state']}")

        # Or stream the response
        async for event in client.stream_message(...):
            print(event)

asyncio.run(main())

Add authentication

from apcore_a2a import serve
from apcore_a2a.auth.jwt import JWTAuthenticator, ClaimMapping

auth = JWTAuthenticator(
    key="your-secret-key",
    algorithms=["HS256"],
    issuer="https://auth.example.com",
    audience="my-agent",
    claim_mapping=ClaimMapping(
        id_claim="sub",
        type_claim="type",
        roles_claim="roles",
        attrs_claims=["org", "dept"],
    ),
    require_claims=["sub"],
)

serve(registry, auth=auth)

For Developers: API Reference

serve()

Blocking call — starts uvicorn and serves until SIGINT/SIGTERM.

from apcore_a2a import serve

serve(
    registry_or_executor,   # apcore Registry or Executor
    *,
    host="0.0.0.0",
    port=8000,
    name=None,              # Agent name (fallback: registry config)
    description=None,       # Agent description
    version=None,           # Agent version
    url=None,               # Public URL (default: f"http://{host}:{port}")
    auth=None,              # Authenticator instance
    task_store=None,        # TaskStore instance (default: InMemoryTaskStore)
    cors_origins=None,      # List of allowed CORS origins
    push_notifications=False,
    explorer=False,         # Enable A2A Explorer UI
    explorer_prefix="/explorer",
    cancel_on_disconnect=True,
    shutdown_timeout=30,
    execution_timeout=300,
    log_level=None,
    metrics=False,          # Enable /metrics endpoint
)

async_serve()

Returns the ASGI app without starting a server — use for embedding in larger applications.

from apcore_a2a import async_serve

app = await async_serve(registry_or_executor, **kwargs)
# app is a Starlette ASGI application

TaskStore

Default in-memory task store. Implement the TaskStore protocol for persistent backends (Redis, PostgreSQL, etc.).

from apcore_a2a.storage.memory import InMemoryTaskStore

store = InMemoryTaskStore()
serve(registry, task_store=store)

Architecture

apcore-a2a acts as a thin protocol layer on top of apcore. The mapping is straightforward:

A2A Concept apcore Mapping
Agent Card Derived from Registry configuration
Skill Maps 1:1 to an apcore Module
Task Managed execution of Executor.call_async()
Streaming Wrapped Executor.stream() via SSE
Security Bridged to apcore's Identity context

Contributing

git clone https://github.com/aipartnerup/apcore-a2a-python.git
cd apcore-a2a-python
pip install -e ".[dev]"
pytest

Documentation

License

Apache 2.0 — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

apcore_a2a-0.1.0.tar.gz (128.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

apcore_a2a-0.1.0-py3-none-any.whl (39.2 kB view details)

Uploaded Python 3

File details

Details for the file apcore_a2a-0.1.0.tar.gz.

File metadata

  • Download URL: apcore_a2a-0.1.0.tar.gz
  • Upload date:
  • Size: 128.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for apcore_a2a-0.1.0.tar.gz
Algorithm Hash digest
SHA256 69b460318bce514bac96afaff6fe94424d7912037930f1e717a125f9b54b3e3c
MD5 0ac332e30005295df74e58553616d4e9
BLAKE2b-256 4debdd195c01474ffcc7c029c57ab7dc5d36409c0908364884547084b1c1f696

See more details on using hashes here.

File details

Details for the file apcore_a2a-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: apcore_a2a-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 39.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for apcore_a2a-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4a7a093689410b1c33d04d82c6bf7346f0ea6f0805eec48659b56e1b5456d648
MD5 a286b536654b89cb273e9cfb3022522d
BLAKE2b-256 a47907cd9b6627952aff2ff6dc4ec15944803e68a1a419433b7126c9c333601e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page