What's live today
Both halves of the A2A surface are live:
- The agent-native discovery card —
GET /.well-known/agent.json(and its/agent-card.jsonaliases) — is live and unauthenticated. It lets an external agent find Paseo and machine-read its capabilities and endpoints without a credential. - The A2A task adapter —
POST /v1/a2aJSON-RPC (tasks/send+tasks/sendSubscribe) — is live, gated by your federation key. It translates an inbound A2A task into a Paseo dispatch job and returns an A2ATaskwith a PoTE acceptance receipt as an artifact.
pamk_ federation key (require_federation_key), not the paseo_dp_ agent key or the Developer JWT. Self-mint a federation key first. Submitting a task spends against that key's mandatory cap.The agent card
An A2A-style card describing Paseo's capabilities and endpoints. Capability + endpoint discovery only — it deliberately makes no quality or accuracy claims. It is served with a strong ETag and honors If-None-Match (304). Fetch it with no auth:
Response 200
| Field | Notes |
|---|---|
schema_version | 0.1. |
name / description | Paseo and a one-line summary. |
provider | { organization, url } — AugmentEV. |
url | Public base URL (overridable via PASEO_PUBLIC_BASE_URL; defaults to https://api.augmentev.ai). |
authentication | schemes: ["apiKey"], the Authorization: Bearer <key> shape, and the signup URL. |
interfaces | { mcp, rest } — absolute URLs for the MCP and REST surfaces. |
pricing | Per-call usage metering, plus a rate-card URL. |
capabilities.pote | The PoTE advertisement: enabled (true only when the gateway holds a configured signing key), algorithm (ML-DSA-65), a description, and the public verify_endpoint. |
agents[] | Each agent's id, summary, and REST endpoints — khanoor, resolve, docflow. |
The task adapter
A single JSON-RPC 2.0 endpoint. The method is chosen by the method field in the body, not the URL: tasks/send (synchronous) or tasks/sendSubscribe (SSE). The adapter validates the envelope, translates the A2A task into a Paseo dispatch job through the shared submit_job core (the same validation + billing path the job surface uses), and returns the resulting A2A Task.
This adapter implements a deliberately small, typed subset of A2A: tasks/send and tasks/sendSubscribe only. tasks/get, tasks/cancel, and push-notification config are not routed. Message parts are text and data only — an inbound file part is rejected with a typed INVALID_PARAMS error.
Params (both methods)
| Field | Type | Notes |
|---|---|---|
id | string? | Client-chosen task id for correlation. Minted server-side when omitted. |
sessionId | string? | Optional A2A session id, echoed onto the Task. Not used for routing in v1. |
message | object | { role, parts[] }. The compose target is read from a data part's container_image (or image alias), or from a single-token text part treated as a bare image ref. Optional typed knobs in the data part pass through: gpu_type, gpu_count, max_runtime_seconds, max_price_usd, input_refs, output_destination. |
metadata | object? | Opaque client metadata, echoed back on the Task. Never interpreted for auth or tenant — those come from the federation key, not the body. |
SPEND_CAP_EXCEEDED error (code -32010, data.status_hint: 402) and no job is submitted; a submit that fails after the debit is refunded.tasks/send
Submit a task and receive the A2A Task object synchronously. Because the gateway dispatches the job (the container runs off-process on a fleet agent), the returned Task is in a non-terminal state (submitted/working) carrying the assigned job id, with the PoTE acceptance receipt attached as an artifact. Per JSON-RPC, the HTTP status stays 200 even for errors — the failure rides in the error member.
Response — a JSON-RPC result carrying the Task:
tasks/sendSubscribe (SSE)
The streaming variant: send Accept: text/event-stream and set method to tasks/sendSubscribe. The adapter dispatches synchronously, so the stream is a finite, pre-computed sequence — a submitted status update, the resolved status update carrying the dispatch message, a TaskArtifactUpdateEvent delivering the PoTE receipt, and a closing event with final: true.
Event frames — each event: line names the A2A event type and the data: line carries the typed JSON:
PoTE as a task artifact
A completed Task carries a PoTE receipt as an artifact named pote-receipt — a single data part holding a self-contained, ML-DSA-65-signed record you can lift out and verify unchanged at POST /v1/evidence/verify.