entorin

Control plane for agent harnesses.

Observability, budget, sandbox, auth, HITL — under whatever loop you already use. Claude Agent SDK, Codex, LangGraph, or even bare while loop.

What is Entorin

Every team building an agentic product ends up rebuilding the same operational layer: execution durability, policy enforcement, budget control, orchestration, and observability. Existing frameworks bundle some of this, but tie it to their workflow model. Adopt the framework or write it yourself. Teams either accept the lock-in or inherit the fragility.

Entorin exposes this layer as composable primitives that integrate with any framework. Bring Claude Agent SDK, OpenAI Agents SDK, LangChain, CrewAI — or plain Python. Your agent loop stays simple, but the operational layer is handled for you.

Why Entorin

Entorin enables teams to define their own harness without reimplementing the infrastructure behind it. Different teams, domains, and budget models can share the same control plane while keeping their workflows fully customizable.

What Entorin provides

No vendor lock-in

Bring your harness, your framework, your model. Adapters for Claude Agent SDK, LangGraph, CrewAI, Google ADK, LlamaIndex, or a bare loop. Keys flow as Capability — never read from os.environ.

Budget control with overflow

Per-principal and per-bucket caps with three OverflowPolicy modes: abort, finish_step, finish_run. BudgetGate.check runs before every wire call; strictest cap wins.

One OTel trace per run

Every node, LLM call, tool call, sandbox exec, checkpoint, and handoff is a span carrying entorin.run_id, entorin.principal_id, tokens, and cost.

Quick start

Install the package, mint a RunContext, drop into a bare loop. The control plane emits trace, budget, and audit because its primitives emit them — the loop never has to know.

# install
uv add entorin

# run
from adapters.bare_loop import run_qa

answer = await run_qa(
    model=anthropic_model,
    ctx=ctx, bus=bus,
    question="how many roads must a man walk down?",
    tool_clients={"fs": fs_client},
    max_turns=6,
)

Pick your path

Join the waitlist

Paid tiers and managed offerings aren't ready yet. Drop your email and we'll let you know when early access opens!