Skip to content

Navigation Menu

Sign in
Sign up

Repository files navigation

GraphOS

The Service Mesh for AI Agents.

npm version npm downloads PyPI version PyPI downloads License: MIT Node >= 20 Python >= 3.10

GraphOS is an open-source governance and observability layer for LangGraph.js.

Wrap your compiled graph in one line, get policy enforcement (loops, budgets) and a local-first live dashboard with time-travel replay. No SaaS, no signup, no telemetry leaving your machine.

GraphOS Demo


🧐 Why GraphOS?

As agents move from demos to production, three things bite:

  • Infinite loops β€” the agent ping-pongs between nodes, burning tokens silently.
  • Runaway cost β€” one bad prompt eats your monthly OpenAI budget before you notice.
  • The black-box problem β€” no way to see what happened inside a 20-step run until it's finished.

GraphOS fixes this by wrapping your CompiledGraph with a policy-driven interceptor and streaming every step to a local dashboard.


✨ What you get

Policy enforcement

  • LoopGuard β€” halt when a node revisits with identical state (mode: "state") or simply visits N times (mode: "node", for agents whose state grows on every iteration).
  • BudgetGuard β€” kill the run when cumulative cost exceeds your USD ceiling.
  • MCPGuard β€” allow-list / deny-list MCP servers and tools, and cap MCP call volume before an agent drifts into unsafe tool usage.
  • tokenCost() β€” drop-in cost extractor that reads usage_metadata off LangChain messages and applies a built-in price table for OpenAI + Anthropic models.

Local dashboard

  • Live graph β€” nodes glow as the agent traverses; halted nodes flash red.
  • Per-step detail panel β€” click a step or scrub the timeline to see messages, tool calls, token usage, and the policy halt reason.
  • Session switcher + time-travel β€” every run persists to SQLite (~/.graphos/traces.db); replay any past session step-by-step.

πŸ›  Install

TypeScript / Node:

npm install @graphos-io/sdk
# or
pnpm add @graphos-io/sdk

Python:

pip install graphos-io

πŸš€ Quick start

TypeScript:

import {
 GraphOS,
 LoopGuard,
 BudgetGuard,
 tokenCost,
 createWebSocketTransport,
 PolicyViolationError,
} from "@graphos-io/sdk";
import { myLangGraphApp } from "./agent";
const managed = GraphOS.wrap(myLangGraphApp, {
 projectId: "my-agent",
 policies: [
 new LoopGuard({ mode: "node", maxRepeats: 10 }),
 new BudgetGuard({ usdLimit: 2.0, cost: tokenCost() }),
 ],
 onTrace: createWebSocketTransport(),
});
try {
 const result = await managed.invoke({
 messages: [{ role: "user", content: "Analyze the market." }],
 });
 console.log(result);
} catch (err) {
 if (err instanceof PolicyViolationError) {
 console.log(`halted by ${err.policy}: ${err.reason}`);
 } else {
 throw err;
 }
}

Python:

import asyncio
from graphos_io import (
 wrap, LoopGuard, BudgetGuard, token_cost,
 create_websocket_transport, PolicyViolationError,
)
from my_agent import build_graph # your compiled LangGraph
async def main():
 managed = wrap(
 build_graph(),
 project_id="my-agent",
 policies=[
 LoopGuard(mode="node", max_repeats=10),
 BudgetGuard(usd_limit=2.0, cost=token_cost()),
 ],
 on_trace=create_websocket_transport(),
 )
 try:
 result = await managed.invoke({"messages": [{"role": "user", "content": "Analyze the market."}]})
 print(result)
 except PolicyViolationError as err:
 print(f"halted by {err.policy}: {err.reason}")
asyncio.run(main())

invoke() returns the merged final state. stream() is also available if you want to consume per-step updates yourself.

Both SDKs ship into the same dashboard over the same JSON-over-WebSocket protocol β€” point a Python agent and a TypeScript agent at it and watch both in one UI.


πŸ–₯ Run the dashboard

npx @graphos-io/dashboard graphos dashboard

Open http://localhost:4000. Run anything that calls createWebSocketTransport() and watch the graph execute live.

The dashboard persists every event to ~/.graphos/traces.db. By default it keeps the 200 most-recent sessions and prunes older ones; tune via GRAPHOS_RETENTION_SESSIONS.


πŸ“¦ Packages

Package Language What it does
@graphos-io/core TS Shared types (Policy, NodeExecution, TraceEvent)
@graphos-io/sdk TS GraphOS.wrap(), LoopGuard, BudgetGuard, tokenCost, transports
@graphos-io/dashboard TS Next.js + React Flow dashboard with graphos CLI
@graphos-io/mcp-proxy TS Proxy MCP tool calls, emit GraphOS traces, redact payloads, and enforce MCP allow/deny rules
graphos-io Python wrap(), LoopGuard, BudgetGuard, MCPGuard, token_cost, async-first transport

πŸ— Architecture

GraphOS architecture: your code β†’ @graphos-io/sdk β†’ @graphos-io/dashboard, with SQLite persistence

The SDK runs in your process β€” zero network calls unless you point a transport at one. The dashboard is a separate local process started with graphos dashboard.


πŸ§ͺ Run the demos from the monorepo

pnpm install
pnpm dev # dashboard + WS telemetry
pnpm demo:loop # LoopGuard halts an A↔B cycle
pnpm demo:budget # BudgetGuard halts a 4-node pipeline

Open http://localhost:4000.


πŸ—Ί Roadmap

  • LoopGuard (state + node modes)
  • BudgetGuard + tokenCost() price-table cost extractor
  • WebSocket telemetry transport
  • Live graph view with active / halted node states
  • SQLite persistence + retention
  • Session switcher + time-travel scrubber
  • Per-step detail panel (messages, tool calls, usage)
  • graphos dashboard CLI
  • MCPGuard + MCP proxy
  • Python SDK parity (graphos-io)

🀝 Contributing

Bug reports and PRs welcome at github.com/ahmedbutt2015/graphos.

License

MIT β€” Β© Ahmed Butt

About

GraphOS is an open-source governance and observability layer designed specifically for LangGraph and the Model Context Protocol (MCP).

Topics

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /