Observed since 21 Oct, 08:55 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
agentviz
Real-time 3D visualization for multi-agent AI systems
Real-time 3D visualization for multi-agent AI systems. Drop one decorator on your agent functions and watch them appear as robots in a live 3D scene — calls, responses, token streams, errors, and latency all rendered as they happen.
pip install agentviz
agentviz serve
agentviz serve — starts a local FastAPI server + opens the 3D UI in your browser@agentviz.traceThe server can be self-hosted anywhere (Linode, Railway, Docker). Multiple agents on different machines can all connect to the same room.
import agentviz
agentviz.init(server="http://localhost:8000")
@agentviz.trace
async def fetch_data(query: str) -> str:
return await db.query(query)
@agentviz.trace(name="Planner", to="orchestrator", color="#9B59B6")
async def plan(goal: str) -> str:
return await llm.plan(goal)
That's it. Run your agents — they show up in the UI automatically.
export AGENTVIZ_SERVER=http://localhost:8000
export AGENTVIZ_PROJECT=my-team
Then just use @agentviz.trace with no init() call.
from agentviz import AgentVizClient
async with AgentVizClient(
server="ws://localhost:8000/agent-ws",
name="DataFetcher",
color="#E74C3C",
) as client:
call_id = await client.emit_call(to="orchestrator", message="Fetching records…")
result = await do_work()
await client.emit_response(to="orchestrator", call_id=call_id, result=result)
from agentviz import HttpAgentVizClient
client = HttpAgentVizClient(server="https://my-agentviz.railway.app", name="Lambda")
call_id = client.emit_call(to="orchestrator", message="Processing event…")
result = process(event)
client.emit_response(to="orchestrator", call_id=call_id, result=result)
async for chunk in llm.stream(prompt):
await client.emit_token(chunk.delta)
await client.emit_stream_end()
Tokens accumulate in a speech bubble above the robot in real-time.
@agentviz.trace — works on any async or sync function, no boilerplatecontextvars)semicircle, pipeline, star, mesh, grid — switch live from the UI?room=project-name separates teams on the same serverfrom agentviz.integrations.langchain import AgentVizCallbackHandler
from agentviz import HttpAgentVizClient
client = HttpAgentVizClient(server="http://localhost:8000", name="LangChainAgent")
handler = AgentVizCallbackHandler(client)
chain.invoke({"input": "..."}, config={"callbacks": [handler]})
from agentviz.integrations.langgraph import get_langgraph_callbacks
callbacks = get_langgraph_callbacks(client)
graph.invoke(state, config={"callbacks": callbacks})
from agentviz.integrations.openai_agents import patch_openai_agents
import agentviz
agentviz.init(server="http://localhost:8000")
patch_openai_agents() # patches globally — all agents auto-traced from here
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from agentviz.integrations.otel import AgentVizSpanExporter
provider = TracerProvider()
provider.add_span_processor(BatchSpanProcessor(AgentVizSpanExporter()))
Every OTEL span becomes a call/response/error event in the 3D scene automatically.
Add to your MCP host config:
{
"mcpServers": {
"agentviz": {
"command": "python",
"args": ["-m", "agentviz.mcp_server"],
"env": {
"AGENTVIZ_SERVER": "http://localhost:8000"
}
}
}
}
Then use agentviz_emit_call, agentviz_emit_response, agentviz_emit_token etc. as tools from within Claude.
docker build -t agentviz .
docker run -p 8000:8000 agentviz
docker-compose up
Push the repo and set the start command to:
agentviz serve --host 0.0.0.0 --port $PORT --no-browser
agentviz serve # start server, open browser
agentviz serve --port 9000 # custom port
agentviz serve --no-browser # headless (for servers)
agentviz serve --demo # also start demo agents
agentviz --version
Or:
python -m agentviz serve
Each URL ?room=<name> gets its own isolated scene, agent registry, and session history. Share a single deployed server across multiple teams:
https://agentviz.mycompany.com/?room=search-team
https://agentviz.mycompany.com/?room=billing-team
MIT
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
fastapiEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | fastapi>=0.110.0 | runtime |
uvicornEnvironment{
"extras": "standard",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | uvicorn[standard]>=0.29.0 | runtime |
websocketsEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | websockets>=12.0 | runtime |
httpxEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | httpx>=0.27.0 | runtime |
langchain-coreEnvironment{
"extras": "",
"marker": "extra == \"langchain\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | langchain-core>=0.1.0; extra == "langchain" | runtime |
langgraphEnvironment{
"extras": "",
"marker": "extra == \"langgraph\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | langgraph>=0.1.0; extra == "langgraph" | runtime |
crewaiEnvironment{
"extras": "",
"marker": "extra == \"crewai\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | crewai>=0.28.0; extra == "crewai" | runtime |
openai-agentsEnvironment{
"extras": "",
"marker": "extra == \"openai-agents\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | openai-agents>=0.0.3; extra == "openai-agents" | runtime |
opentelemetry-sdkEnvironment{
"extras": "",
"marker": "extra == \"otel\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-sdk>=1.20.0; extra == "otel" | runtime |
langchain-coreEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | langchain-core>=0.1.0; extra == "all" | runtime |
langgraphEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | langgraph>=0.1.0; extra == "all" | runtime |
crewaiEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | crewai>=0.28.0; extra == "all" | runtime |
openai-agentsEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | openai-agents>=0.0.3; extra == "all" | runtime |
opentelemetry-sdkEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-sdk>=1.20.0; extra == "all" | runtime |
bdist_wheel · 78.03 KB · Python py3
sdist · 50.73 KB · Python source
Observed since 21 Oct, 08:55 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:277b1ebca8d497c66bb196c6ee0cd92facd653315603f39d3ec03ef2786e30d2