Observed since 20 Oct, 22:44 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
A rendering convention for AI agents — append /agents to any FastAPI route and get a fully structured agent workspace with state, capabilities, RBAC, and navigation.
AgentML is a universal rendering convention for AI agents. The same way browsers render HTML into a visual experience for humans, AgentML renders a complete agent-page/workspace for AI — context, state, permissions, actions, guidance, navigation — everything an agent needs to understand where it is and what it can do, in one response.
pip install agentml
from fastapi import FastAPI
from agentML import AgentML
app = FastAPI()
agent = AgentML(app)
agent.add_middleware() # Enables mutation response semantics
When an agent performs an action (e.g. POST /patients) and sends the header Accept: application/vnd.agentml+json, AgentML intercepts the response to tell the agent exactly what changed (delta), where the resource now lives (agent_resource), and what it can do next (actions) and where it can go (navigation):
POST /patients
Accept: application/vnd.agentml+json
Content-Type: application/json
{
"name": "Aanya Sharma",
"age": 34
}
Response:
{
"result": {
"id": 42,
"name": "Aanya Sharma",
"age": 34
},
"delta": {
"name": "Aanya Sharma",
"age": 34
},
"agent_resource": "/patients/42/agents",
"actions": [
{
"name": "UpdatePatientDetails",
"agent_endpoint": "/patients/42/agents"
},
{
"name": "ViewPatientDetails",
"agent_endpoint": "/patients/42/agents"
},
{
"name": "ArchivePatient",
"agent_endpoint": "/patients/42/agents"
}
],
"navigation": [
{
"label": "Appointments",
"agent_endpoint": "/patients/42/appointments/agents"
},
{
"label": "Billing",
"agent_endpoint": "/billing/agents"
},
{
"label": "Home",
"agent_endpoint": "/agents"
}
]
}
When an agent navigates to the resulting agent_resource, they receive a complete state-aware workspace:
GET /patients/42/agents
Response:
{
"agentML": "0.1",
"workspace": {
"title": "Patients Instance Agent Workspace",
"resource": "/patients/42",
"agent_resource": "/patients/42/agents",
"breadcrumb": ["Home", "Patients", "Patient 42"]
},
"identity": {
"role": "doctor",
"user_id": "doc_88"
},
"state": {
"id": 42,
"name": "Aanya Sharma",
"age": 34,
"archived": false
},
"capabilities": [
{
"name": "UpdatePatientDetails",
"description": "Modify name or age of an existing patient",
"fields": [
{
"name": "name",
"type": "string",
"required": true,
"current": "Aanya Sharma"
},
{
"name": "age",
"type": "integer",
"required": true,
"current": 34,
"constraints": {
"ge": 0,
"le": 120
}
}
]
}
],
"unavailable": [],
"navigation": [
{
"label": "Appointments",
"agent_endpoint": "/patients/42/appointments/agents"
},
{
"label": "Billing",
"agent_endpoint": "/billing/agents"
},
{
"label": "Home",
"agent_endpoint": "/agents"
}
],
"alerts": [],
"guidance": []
}
workspace: Native location context containing the human URL, the agent URL, and path breadcrumbs.identity: The dynamic security credentials and role context for the current request.state: The serialized current resource state fetched in-process.capabilities: Permitted business-language actions (never HTTP verbs) with dynamic schema validation rules and pre-filled current values.unavailable: Actions that are temporarily disabled due to the current resource state, complete with explanations.navigation: Context-aware sibling and sub-resource links matching the instance's active ID.alerts: Banner notifications or warning details generated dynamically based on state.The web was built for human eyes. AI agents are currently forced to parse layout-heavy HTML, guess dynamic form flows, and reverse-engineer endpoints.
AgentML introduces a simple, universal web rendering convention: append /agents to any HTTP resource.
A browser requests a resource and gets human-friendly HTML. An AI agent requests the same resource + /agents (or issues mutations requesting the vnd.agentml+json payload) and gets a structured, action-ready Agent Workspace.
/patients/42/agents links to /patients/42/appointments/agents substituting the identifier automatically).RegisterPatient instead of POST /patients).unavailable_fn) default to blocked state on exceptions.ge, le, patterns, enums) and pre-fills current state values.pypistats · 45 observations shown. Missing days are unknown. Source category: overall: without mirrors.
| Date / source period | Value | Observed at |
|---|---|---|
| 2026-10-18 – 2026-10-18 | 2 | 2026-10-20T22:47:47.3699901Z |
| 2026-10-17 – 2026-10-17 | 7 | 2026-10-20T22:47:47.3699901Z |
| 2026-10-16 – 2026-10-16 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-10-15 – 2026-10-15 | 3 | 2026-10-20T22:47:47.3699901Z |
| 2026-10-14 – 2026-10-14 | 3 | 2026-10-20T22:47:47.3699901Z |
| 2026-10-13 – 2026-10-13 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-10-12 – 2026-10-12 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-10-09 – 2026-10-09 | 3 | 2026-10-20T22:47:47.3699901Z |
| 2026-10-08 – 2026-10-08 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-10-06 – 2026-10-06 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-10-02 – 2026-10-02 | 2 | 2026-10-20T22:47:47.3699901Z |
| 2026-09-30 – 2026-09-30 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-09-27 – 2026-09-27 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-09-26 – 2026-09-26 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-09-23 – 2026-09-23 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-09-22 – 2026-09-22 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-09-20 – 2026-09-20 | 4 | 2026-10-20T22:47:47.3699901Z |
| 2026-09-16 – 2026-09-16 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-09-14 – 2026-09-14 | 2 | 2026-10-20T22:47:47.3699901Z |
| 2026-09-10 – 2026-09-10 | 2 | 2026-10-20T22:47:47.3699901Z |
| 2026-09-07 – 2026-09-07 | 3 | 2026-10-20T22:47:47.3699901Z |
| 2026-09-06 – 2026-09-06 | 2 | 2026-10-20T22:47:47.3699901Z |
| 2026-09-04 – 2026-09-04 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-09-03 – 2026-09-03 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-09-01 – 2026-09-01 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-08-31 – 2026-08-31 | 3 | 2026-10-20T22:47:47.3699901Z |
| 2026-08-28 – 2026-08-28 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-08-25 – 2026-08-25 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-08-24 – 2026-08-24 | 4 | 2026-10-20T22:47:47.3699901Z |
| 2026-08-23 – 2026-08-23 | 4 | 2026-10-20T22:47:47.3699901Z |
| 2026-08-17 – 2026-08-17 | 2 | 2026-10-20T22:47:47.3699901Z |
| 2026-08-15 – 2026-08-15 | 2 | 2026-10-20T22:47:47.3699901Z |
| 2026-08-14 – 2026-08-14 | 2 | 2026-10-20T22:47:47.3699901Z |
| 2026-08-09 – 2026-08-09 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-08-07 – 2026-08-07 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-08-05 – 2026-08-05 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-08-03 – 2026-08-03 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-08-02 – 2026-08-02 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-08-01 – 2026-08-01 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-07-28 – 2026-07-28 | 2 | 2026-10-20T22:47:47.3699901Z |
| 2026-07-27 – 2026-07-27 | 3 | 2026-10-20T22:47:47.3699901Z |
| 2026-07-24 – 2026-07-24 | 2 | 2026-10-20T22:47:47.3699901Z |
| 2026-07-23 – 2026-07-23 | 2 | 2026-10-20T22:47:47.3699901Z |
| 2026-07-22 – 2026-07-22 | 1 | 2026-10-20T22:47:47.3699901Z |
| 2026-07-21 – 2026-07-21 | 2 | 2026-10-20T22:47:47.3699901Z |
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.0 | 16 Jun 2026 | 6 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 22:44 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:25f8e5ac881d4ef903b0c11907035ccf2ab19bdb11f5b87806b1d8f115981507