Skip to main content

Agent Enrollment Protocol for Python

CI Python PyPI Codecov License: MIT

Official Python software development kit for the Agent Enrollment Protocol, the open protocol for Agent enrollment, Service-issued credentials, and authenticated Agent access.

Installation

python -m pip install agent-enrollment-protocol

Python 3.11 or newer is required. The distribution provides one typed package with modules for each integration role:

Goal Module
Use protocol models, validation, identity, and assertions agent_enrollment_protocol.core
Inspect, enroll with, and authenticate to Services agent_enrollment_protocol.agent
Integrate enrollment and authentication into a Service agent_enrollment_protocol.service
Host managed Agent identities and delegated signing agent_enrollment_protocol.platform

Core is synchronous and transport-independent. Agent, Service, Platform, and their integration interfaces are asynchronous. Applications provide durable stores and security policy through typed protocols.

Framework integrations are optional and remain separate from Core and role behavior.

Runnable examples

The repository includes self-contained examples that exercise real signed protocol flows without external infrastructure:

uv run python examples/agent_service.py
uv run python examples/hosted_platform.py

The first example composes an Agent, Service, every built-in credential profile, protected resource, and the framework-neutral ASGI adapter. The second demonstrates hosted identity Platform discovery, Service DID resolution, provisioning, DID publication, delegated signing, and identity listing. See examples/README.md for the integration boundaries and production replacements.

The Service module includes stored credential profiles for each built-in Grant Type:

Grant Type Factory
API key stored_api_key_grant_type()
Basic stored_basic_grant_type()
OAuth Bearer stored_oauth_bearer_grant_type()

Each factory accepts application-owned credential issuance and storage implementations. The included memory store is intended for examples and local development.

Concrete Grant Types and extensions can define additional Grant and Revoke request members. Pass those members through GrantOptions.parameters or RevokeOptions.parameters; the Agent retains control of the standard Grant Type and Revoke selector fields.

Service ASGI integration

agent_enrollment_protocol.adapters provides a framework-neutral ASGI integration with no additional dependency. AepAsgiApplication serves Inspect and every command advertised by the Service. It enforces the command methods, media type, request-body limit, and idempotency header boundary, and supplies cache metadata and conditional requests for Inspect.

AepAuthenticationMiddleware protects a downstream ASGI application and exposes the authenticated Agent principal through principal_from_scope(). Place the protocol application outside the authentication middleware so AEP's own command routes remain directly accessible:

from agent_enrollment_protocol.adapters import (
    AepAsgiApplication,
    AepAuthenticationMiddleware,
    principal_from_scope,
)

protected_application = AepAuthenticationMiddleware(
    application,
    service,
    resource_origin="https://service.example",
)
asgi_application = AepAsgiApplication(service, protected_application)

The downstream application can obtain its immutable principal from the ASGI scope:

principal = principal_from_scope(scope)
if principal is None:
    raise RuntimeError("The route requires AEP authentication")

Use a separate unprotected application branch for public resources. For local development, allow_insecure_loopback=True permits an HTTP localhost or loopback resource origin; production origins require HTTPS.

Agent with a hosted identity Platform

PlatformIdentityProvider lets an Agent use a remote AEP Platform for Service-scoped identity custody and delegated assertion signing. It discovers the Platform, recovers an existing active identity before provisioning one, caches discovery metadata according to HTTP cache directives, and supplies the resulting signer directly to Agent.

import os

from agent_enrollment_protocol.agent import (
    Agent,
    AgentOptions,
    PlatformIdentityProvider,
    PlatformIdentityProviderOptions,
)


async def authentication_headers() -> dict[str, str]:
    return {"Authorization": f"Bearer {os.environ['AEP_PLATFORM_ACCESS_TOKEN']}"}


async with PlatformIdentityProvider(
    PlatformIdentityProviderOptions(
        authentication_headers=authentication_headers,
        platform_url="https://platform.example",
    )
) as identities:
    async with Agent(AgentOptions(identity_provider=identities)) as agent:
        result = await agent.service("https://service.example").enroll()

The Platform authentication callback is evaluated for each private request so applications can refresh short-lived credentials. Supply pending_sign_resolver when the Platform can return 202 Accepted during delegated signing. The resolver receives the immutable retry interval and opaque Platform context; returning updated context starts the next signing stage with a distinct idempotency key. Without a resolver, pending signing raises PlatformSignPendingError for the application to continue explicitly.

Hosted identity Platform

agent_enrollment_protocol.platform implements discovery, Service-scoped Agent identity provisioning, DID document publication, identity listing and lifecycle, delegated signing, and optional hosted verification.

Applications supply caller authorization, Service DID resolution, key custody, and durable stores. The included memory stores are suitable for local development, not production key custody or durable idempotency.

from datetime import timedelta

from agent_enrollment_protocol.core import SigningAlgorithm
from agent_enrollment_protocol.platform import DiscoveryOptions, Platform, PlatformOptions

platform = Platform(
    PlatformOptions(
        authorizer=authorizer,
        did_host="platform.example",
        did_url_template="https://platform.example/agents/{agent_did_id}/did.json",
        discovery=DiscoveryOptions(
            endpoint_base="/v1/aep",
            lifecycle_endpoint="/v1/aep/agent-identities/{agent_identity_id}",
            list_endpoint="/v1/aep/agent-identities",
            platform_name="Example Platform",
            provision_endpoint="/v1/aep/agent-identities",
            sign_endpoint="/v1/aep/agent-identities/{agent_identity_id}/sign",
        ),
        key_store=key_store,
        maximum_lifetime=timedelta(minutes=5),
        service_did_resolver=service_did_resolver,
        signing_algorithms=(SigningAlgorithm.ES256,),
    )
)

Map platform.discovery() to /.well-known/aep-platform and the remaining methods to the paths advertised by DiscoveryOptions. Authenticate private Platform routes before constructing their RequestContext; the Platform also invokes the supplied authorizer for every private operation. Enable hosted verification only with a replay store.

Development

Install the locked development environment and run the complete merge gate:

uv sync --all-groups --locked
make verify

Run the shared Agent, Service, and Platform conformance suites against the public Python APIs:

make conformance

The command reads the adjacent ../aep-specs checkout by default and writes role reports to .conformance/reports/. Set AEP_SPECS_DIR when the specifications are checked out elsewhere.

Run bidirectional Agent, Service, and Platform interoperability against the Node.js SDK:

make interoperability

The command reads the adjacent ../aep-node checkout by default and writes a four-row evidence report to .interop/reports/aep-python-node-interoperability.json. Set AEP_NODE_DIR when the Node.js SDK is checked out elsewhere.

See aep-specs for the normative drafts, schemas, registries, examples, and test vectors.

Releases

Maintainers run the Release workflow from main. It verifies the package and a clean consumer, runs shared conformance and Node.js interoperability, publishes through PyPI Trusted Publishing, attests the distributions, and creates the matching tag and GitHub release with the verification reports.

Security

See SECURITY.md for vulnerability reporting.

License

MIT.

Download files

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

Source Distribution

agent_enrollment_protocol-0.1.1.tar.gz (64.7 kB view details)

Uploaded Source

Built Distribution

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

agent_enrollment_protocol-0.1.1-py3-none-any.whl (78.3 kB view details)

Uploaded Python 3

File details

Details for the file agent_enrollment_protocol-0.1.1.tar.gz.

File metadata

File hashes

Hashes for agent_enrollment_protocol-0.1.1.tar.gz
Algorithm Hash digest
SHA256 5f6ebaa37ec4e7f9ad81eb418b32be24e57fa77e3380b91129b63537f9a74f82
MD5 89ac31e02327cbb12e1797b0c48cd40d
BLAKE2b-256 fef9c8d5c1dd0b14e16811063aac9de6c09315f543757485d0b64ae910526f02

See more details on using hashes here.

Provenance

The following attestation bundles were made for agent_enrollment_protocol-0.1.1.tar.gz:

Publisher: release.yml on aep-foundation/aep-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file agent_enrollment_protocol-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for agent_enrollment_protocol-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 0ec84a6d4adfed3b1b1f3827ade2873532c397254fc273e0a66b847124de1fe5
MD5 f209ece525034d44a7431fa2384236fe
BLAKE2b-256 b682c07a775485c52a523340d0b4ee829960caf102cdf3f5c24b235f7176836c

See more details on using hashes here.

Provenance

The following attestation bundles were made for agent_enrollment_protocol-0.1.1-py3-none-any.whl:

Publisher: release.yml on aep-foundation/aep-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 files

0.1.0

2 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