Academy-Dashboard
Observability and Oversight for Academy Agents
As agents act autonomously, the ability to observe what they are doing and intervene
when appropriate becomes a critical capability. academy-dashboard addresses these
challenges in agentic deployments through the following extensions for Academy:
UserAgent: Specialized Academy agents that 1. accepts information from MonitoredAgents
and 2. presents this information over a web based dashboard.MonitoredAgent: Extends academy'sAgentclass to support observability and control features.
Here are some of the supported capabilities:
- Logging: Live log stream from
MonitoredAgentsis presented via theUserAgent - Human-in-the-loop:
MonitoredAgentscan send user prompts to theUserAgentwhere a user can respond over a webpage - Performance Stats: Dashboard presents performance stats collected from
MonitoredAgents - Shutdown:
MonitoredAgents can be terminated from the dashboard provided byUserAgents - Location: Locate your agents on a map
Using the UserAgent
There are two supported modes for using starting a UserAgent:
Hosted UserAgent
1) Login with Globus Auth \
2) Click the `[+]` button to launch a new `UserAgent` \
3) Copy the agent UUID and plug this back into your scripts \
Local Deployment:
Launch locally with: user-agent-launcher,
:>user-agent-launcher
User Agent UUID >>>>
a9337401-3d22-4205-923a-0040bb8d3a7b
* Serving Flask app 'academy_dashboard.user_agent.dashboard'
* Debug mode: off
NOTE: MonitoredAgents need the User Agent's UUID (printed above) to establish a connection.
:> user-agent-launcher -h
usage: user-agent-launcher [-h] [-p PORT] [-r REGISTRATION_FILE] [-l {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
options:
-h, --help show this help message and exit
-p, --port PORT Port at which the flask service is listening
-r, --registration_file REGISTRATION_FILE
UserAgent registration file
-l, --log_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
Log level
Using the MonitoredAgent
NOTE: Use
export USER_AGENT_ID=<USER_AGENT_UUID_FROM_ABOVE_STEPS>for examples in the examples directory.
NOTE: This document is in development.
NOTE: The example below is trimmed for brevity. Refer examples for complete code.
from academy_dashboard import MonitoredAgent
from academy_dashboard import UserAgent
class Sleeper(MonitoredAgent):
def __init__(self, user_agent_handle: Handle[UserAgent]) -> None:
super().__init__(user_agent_handle=user_agent_handle)
print('Spinner init done')
@loop
async def cycle(self, shutdown: asyncio.Event) -> None:
"""Log and sleep in loop."""
counter = 0
while not shutdown.is_set():
await asyncio.sleep(2)
logging.info('Sleeper iteration %d', counter)
counter += 1
logging.info('Sleeper exiting!!!! ')
async def main(user_agent_id: UUID) -> None:
async with await Manager.from_exchange_factory(
factory=HttpExchangeFactory(),
executors=ProcessPoolExecutor(max_workers=2),
) as manager:
# 1. Get Handle to UserAgent
agent_id = AgentId(uid=user_agent_id, name='UserAgent')
user_agent_handle = manager.get_handle(agent_id)
# 2. Launch a single agent:
sleeper = await manager.launch(
Sleeper,
kwargs={'user_agent_handle': user_agent_handle}, # <-- Pass handle to UserAgent
)
# 3. Wait for the sleeper agent, which will go on until cancelled
# with a ctrl+c
await manager.wait([sleeper])
logging.info('All done!')
if __name__ == '__main__':
user_agent_id = os.environ['USER_AGENT_ID']
raise SystemExit(asyncio.run(main(UUID(user_agent_id))))
Metadata
Release files for academy-dashboard 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| academy_dashboard-1.0.0.tar.gz | 1.6 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| academy_dashboard-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 3.2 MB
Release files / academy_dashboard-1.0.0.tar.gz
| Download URL | academy_dashboard-1.0.0.tar.gz |
|---|---|
| Size | 1.6 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
feb6da9cd1bcf703eafe3a1409b662a95eab9ca93feffb4bc7ff35f877a0bade
|
|
BLAKE2b-256 checksum How to use checksums |
d27b88c70e9fd054eadf58881ae4cb4c345550ba1f085837a6d2585189569fc2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.
Transparency logRelease files / academy_dashboard-1.0.0-py3-none-any.whl
| Download URL | academy_dashboard-1.0.0-py3-none-any.whl |
|---|---|
| Size | 1.6 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7edddafe2535ce2efcc87d4346d9e5833df1c3b688ca1a946d895e05b66a3489
|
|
BLAKE2b-256 checksum How to use checksums |
bb14412605c425e36c83d999df21c3a4f4a8955e1d2dd6d46e034a6915dd7f00
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.
Transparency log