Skip to content

Noeta compared to other agent frameworks

If you are deciding whether Noeta is the right tool, this page is the honest version of that comparison — including the cases where it is the wrong choice.

Noeta is a runtime for long-horizon, task-oriented agents: it hosts, records, schedules and replays agent execution without prescribing how an agent is written. Every statement about Noeta below is checked against the code in this repository. Statements about other projects are limited to their headline design — for anything finer, read their own documentation.

This page compares designs. For a capability number on public benchmarks — an agent built on Noeta, run on the official Terminal-Bench harness against the field — see Benchmarks.

What Noeta is

  • Two libraries, in-process. noeta-runtime is the kernel and declares no dependencies; noeta-sdk is the only thing you import and carries every capability implementation. There is no CLI and no HTTP server: a host embeds noeta.sdk and drives the loop itself.
  • State is a fold over an event log. Each task owns an append-only EventLog stream; task state is fold(events). Large bodies live in a content-addressed ContentStore (an event payload is capped at 4 KB) and are referenced by ContentRef.
  • Waiting is first class. A task suspends on a WakeCondition (SubtaskCompleted / HumanResponseReceived / TimerFired / ExternalEvent); the Dispatcher matches an incoming wake event against suspended tasks and re-enqueues, and a Worker leases the task to advance it.
  • Compaction is recorded, not destructive. A compaction step emits CompactionRequested plus Compacted; the summary body goes to the ContentStore and the composer swaps the covered prefix at compose time. The original messages stay on the stream, where audit and replay can read them.
  • Provider neutrality is enforced. LLMProvider is the internal protocol; every vendor adapter lives in the providers built-in plugin. The kernel cannot reach an adapter, because nothing may statically import noeta.builtins — the sdk-core-not-builtins import-linter contract fails the build if it does.
  • Sixteen extension surfaces, one loader. Contributions are declared in a static plugin manifest across three planes: identity (tool, agent, content_kind, prompt_fragment, policy, control_tool), wiring (guard, observer, provider, reminder_provider, reminder, tool_result_transform, session_pack), and host (mcp_server, skills, sandbox_provider). A manifest is inert data — a plugin's contributions are listable and collision-checkable before any of its code is imported.
  • Subagents are ordinary tasks. spawn_subtask and spawn_subtasks create independent event-sourced tasks with their own streams; results return through a SubtaskCompleted wake, not a nested call.
  • Governance runs before the act. Guard hooks fire at before_tool_call, before_spawn_subtask, and before_finish, returning allow / deny / require_approval; Observer hooks are read-only and their failure cannot affect the task.

Noeta and the Claude Agent SDK

The Claude Agent SDK is a client library for building agents on Claude. It ships an agent loop, built-in tools, MCP support, subagents, permission modes, and hooks, and it manages the conversation for you.

ConcernClaude Agent SDKNoeta
Who owns the substrateAnthropic hosts the model; the library runs the loop in your processYou own loop, store, and wake machinery; the model is behind an adapter
What is persistedThe conversation, managed for youAn event ledger; state is fold(events), never stored as the primary copy
Suspend / wakeResume a sessionWakeCondition matching + Dispatcher + Lease, delivered exactly once
CompactionAutomatic summarisationCompactionRequested / Compacted events; originals stay on the stream
ToolsBuilt-in tools, @tool, MCP10 built-in tools, @tool (carrying version and risk_level), MCP over stdio and HTTP, plus in-process SDK MCP servers
Permissionspermission_mode, an approval callback, hookspermission_mode (default / acceptEdits / bypassPermissions), can_use_tool, and Guards that rule before the act
ExtensionHooksSixteen manifest-declared surfaces plus the single-writer rule (observers cannot mutate)
ConcurrencyOne client in-processClient.start_workers(n) for a resident pool; multi-host on Postgres
ShapeOne library, TypeScript and PythonTwo Python wheels: noeta-runtime (kernel) and noeta-sdk (what you import)

The two answer different questions. The SDK asks "how do I give my code an agent loop?" Noeta asks "how do I turn an agent's running into a ledger I can replay, audit, and carry elsewhere?"

Noeta and LangGraph

LangGraph expresses an agent as a graph of nodes and edges, with a checkpointer that persists graph state so a thread can be resumed, interrupted for human input, and rewound.

ConcernLangGraphNoeta
Unit of persistenceA checkpoint of graph stateAn append-only event ledger; state is derived, never the stored copy
What history answersWhat the state was at a pointWhat happened — every envelope carries actor / causation_id / trace_id
Control flowA graph you define; the model routes within itNo graph. The Policy decides each step; task structure emerges from decisions
SchedulingThe caller re-invokes the threadDispatcher + Lease + WorkerLoop ship in the library, including stale reclaim
CompactionApplication concernA recorded step; the summary overlays at compose time
EcosystemLarge integration catalogue, mature communitySmall: 18 built-in plugins, no marketplace, young community
Token streamingThrough the graph's event APIThrough a host-supplied HostConfig.delta_sink; deltas are ephemeral and the ledger stays the only durable record

Reach for LangGraph when you want a graph and an integration catalogue. Reach for Noeta when the question is auditability and substrate ownership — which tool ran on whose authority, what was compacted away, what woke a sleeping task — and you want the scheduling machinery in the library rather than in a hosted product.

Noeta and Temporal

Temporal is a durable execution platform: you write workflows and activities in code, and the service durably schedules, retries, and times them.

Noeta is not a workflow engine. The LLM drives control flow, so a task's shape emerges from the model's decisions rather than from a definition written ahead of time. Temporal fits when you know the shape of the work; Noeta fits when the model discovers it as it goes. Noeta keeps Workflow out of its vocabulary — fixed procedures are expressed as a deterministic Policy plus spawn_subtask.

Noeta and Pi Harness

Pi (the "Pi Agent Harness") is a TypeScript monorepo for building terminal agents: a unified multi-provider model API, an agent loop with tool calling and state management, a TUI library, and an interactive coding-agent CLI. It is a harness for agents you drive in a terminal — safety boundaries are delegated to external containerization (Docker or a micro-VM), not built into the harness itself.

ConcernPi HarnessNoeta
DeploymentSingle process in your terminalMulti-worker pool; multi-host on Postgres
What it doesRuns interactive coding/agent CLIsHosts, records, and schedules agent execution
PersistenceEphemeral — session state in memoryEvent-sourced ledger, crash-safe and replayable
Suspend / wakeInterrupt and continue in the TUIFirst-class: human, timer, subtask, external
ModelAny provider behind its unified APIAny provider behind LLMProvider
Safety boundaryExternal containers (Docker / micro-VM)Optional sandbox plugin; guarded tool calls
AuditSession transcriptFull event log

Pi Harness and Noeta answer different questions. Pi Harness is about driving an agent in your terminal. Noeta is about running unattended agents durably on your own infrastructure — and recording what they did. They are complementary: a CLI built with Pi could very well front a task running on a Noeta worker pool.

When Noeta is the wrong choice

You run the infrastructure. Multi-host deployments require the Postgres backend; the SQLite and in-memory backends are single-host. The built-in tool set is small and there is no plugin marketplace. If "it works against a vendor's API with no operational surface" is the requirement, a hosted client library is the lower-friction choice.

Next

Released under the Apache License 2.0.