Middleware¶
Pipeline stages wrapping AgentRuntime.run per agent call. Each
implements the Stage Protocol — __call__(context, next_stage) —
and can be composed via RuntimeOptions.
from murmur.middleware import (
DepthLimitMiddleware,
RetryMiddleware,
TimeoutMiddleware,
)
from murmur.middleware.cost_tracking import CostTrackingMiddleware, TokenBudget
RetryMiddleware¶
RetryMiddleware
¶
Retry on :class:SpawnError with multiplicative backoff.
Source code in src/murmur/middleware/retry.py
TimeoutMiddleware¶
TimeoutMiddleware
¶
DepthLimitMiddleware¶
DepthLimitMiddleware
¶
CostTrackingMiddleware¶
Pre-check + post-charge token enforcement. See Cost tracking for semantics.
CostTrackingMiddleware
¶
CostTrackingMiddleware(
budget: TokenBudget, *, event_emitter: EventEmitter | None = None
)
Pipeline :class:Stage that gates and charges a :class:TokenBudget.
Built fresh per spawn by :meth:AgentRuntime.run — the per-spawn
instance closes over the runtime's :class:EventEmitter so a
BUDGET_EXCEEDED emission flows through the same sink as every
other runtime event.
Source code in src/murmur/middleware/cost_tracking.py
TokenBudget¶
TokenBudget
¶
Mutable token-cost ceiling.
Construct with a positive limit. Wire via
:class:murmur.RuntimeOptions(token_budget=...). The runtime's
:class:CostTrackingMiddleware decrements remaining after each
agent run; once it hits 0 or below, subsequent runs raise
:class:BudgetExceededError before dispatch.
Concurrency: an :class:asyncio.Lock guards :meth:consume against
same-loop interleavings. Cross-process workers sharing one publisher-
side budget will race; budget is a soft cap in distributed mode.