A2A at the core
The runtime is built on A2A primitives — AgentCard, Task, Message, Part, Artifact — so agents communicate through cards, tasks, and artifacts instead of framework-private graph state.
Parley is a Python framework for building agent systems where A2A is the center of gravity, not an afterthought. Pluggable agents, swappable LLMs, tools, transports, and storage behind a small, stable API.

Most agent frameworks bolt communication on top of an internal graph, which means the moment you need two independent agents to talk you are fighting the framework. Parley inverts that: every agent is a complete runtime unit with its own card and capabilities, and the task-based A2A contract is the primary interface between them. That contract holds whether the agents run in one process or across a network.
The design is deliberately local-first and model-agnostic. One-action-at-a-time inference, schema validation, a JSON action fallback, and deterministic flows reduce reliance on hidden prompt behavior, which makes smaller self-hosted models viable. Tool calls, delegation, task state, policy decisions, approvals, runtime events, traces, and reports all have typed representations, so behavior is inspectable instead of implied.
Parley builds on ProtoLink by Nikolaos Maroulis, with a rebranded package and a redesigned developer dashboard; attribution is documented in the repository.
The runtime is built on A2A primitives — AgentCard, Task, Message, Part, Artifact — so agents communicate through cards, tasks, and artifacts instead of framework-private graph state.
Each Agent is a complete runtime unit with its own card, capabilities, tools, and optional LLM. You compose behavior from agents rather than from opaque call chains.
Plug in only what an agent needs: an API or local LLM, RAG knowledge, built-in, native, or MCP tools, a transport, registry, storage and state, telemetry, auth, logging, policy, or durable run records.
Provider-native tool calling is used when available, and a strict JSON action fallback keeps self-hosted models on Ollama, llama.cpp, LM Studio, or vLLM inside the same infer loop.
The base package depends only on Pydantic. HTTP servers, gRPC, hosted model SDKs, MCP, and telemetry providers install as extras, so a minimal install stays minimal.
Develop with no network or provider, then move the same task contract onto HTTP, SSE JSON-RPC, WebSocket, or gRPC. Enable a2a=True for canonical A2A 1.0 JSON-RPC on the wire.
Agent systems become unmaintainable when the model, the tools, and the transport are all entangled in the same code. Keeping A2A types at the boundary means changing the model does not require rewriting the agent, its tools, or its communication layer — simple by default, explicit when it matters.