MemoryPressurePolicy sheds new turns under pressure; this planner reclaims memory from idle warm caches. See Admission Control · Memory-aware admission for the sibling admission-side control.Quick Start
1
On by default on cgroup-aware hosts
No knob to set. When the host can read a cgroup v1/v2 memory limit, the gateway samples RSS and soft-evicts the coldest rebuildable caches under pressure. On a host that can’t report a cgroup limit, the planner returns nothing — the gateway simply never soft-evicts (legacy behaviour).
2
Inspect a plan yourself
Feed
WarmSession facts to the pure planner and read back the coldest-first eviction order:3
Implement your own probe
Satisfy
MemoryPressureProtocol to report the budget + RSS from a custom platform:Which primitive?
Two gateway primitives protect memory from opposite sides — this diagram picks the right one. Use both together for full memory protection: admission gates new work; the planner reclaims from idle warm caches.API Reference
Three symbols export frompraisonaiagents.gateway:
WarmSession
A frozen dataclass carrying a pure fact from the running gateway to the planner.
MemoryPressureProtocol
A @runtime_checkable Protocol the gateway implements over its own process to report the container’s memory ceiling and current RSS.
plan_pressure_evictions
session_ids to soft-evict, coldest (LRU) first, tie-broken by session_id (stable). It never touches the caches — the gateway is the enactor.
Returns
[] when RSS is within budget, the budget is unknown (None / <= 0), the budget or RSS is non-finite (NaN/inf), or nothing evictable remains.
How It Works
The gateway samples its own memory, asks the planner for the order to evict, then enacts it — re-sampling RSS as it goes. The planner returns the full ordered list, not a prefix — the gateway re-samples RSS as it evicts and stops as soon as RSS is back withinheadroom_ratio × budget (default 0.9). It is byte-agnostic by design: it never guesses per-cache sizes, so over-shedding is avoided by the enactor and under-shedding is caught on the next pass.
Guards — a victim is skipped entirely (never evicted) when:
Degraded modes — the planner never crashes the gateway it protects, returning
[] when:
Configuration
The single tunable isheadroom_ratio — the fraction of the budget the gateway sheds back down to.
User Interaction Flow
A Fly machine with a 512 MiB cgroup limit hosts a Telegram bot that has accumulated 60 warm session caches. A burst pushes RSS to 490 MiB — over0.9 × 512 ≈ 460 MiB.
- The sampler reads
cgroup_limit_mb() = 512,anon_rss_mb() = 490. plan_pressure_evictionsnames the 40 evictable sessions LRU-first (in-flight and unflushed ones are skipped).- The gateway evicts down the list, re-sampling RSS, and stops at ~460 MiB.
- Those users get their cache rebuilt transparently on their next turn.
Common Patterns
Combine withMemoryPressurePolicy for full memory protection — admission gates new work, the planner reclaims from idle warm caches:
MemoryPressureProtocol for non-Linux hosts — supply a macOS/Windows probe:
headroom_ratio for hosts with spiky per-turn allocations — drop to 0.8 to leave more headroom:
Best Practices
Never re-implement the planner in an adapter
Never re-implement the planner in an adapter
Call
plan_pressure_evictions and enact the returned list. The decision is pure and unit-tested in isolation — a re-implementation drifts from the guards and degraded-mode returns.The planner is byte-agnostic — re-sample RSS as you evict
The planner is byte-agnostic — re-sample RSS as you evict
It returns the full LRU-ordered list, not a prefix, and never guesses per-cache sizes. Evict down the list and stop as soon as RSS is back within
headroom_ratio × budget. Never guess how much each cache will free.Never evict in_flight=True or flushed=False
Never evict in_flight=True or flushed=False
The planner already skips them — an executing turn would be aborted, and an unflushed transcript isn’t rebuildable yet. Do not override the guards in your enactor.
Trust the degraded-mode returns
Trust the degraded-mode returns
An empty list means “no work to do” — RSS within budget, unknown/
<= 0 budget, non-finite inputs, or nothing evictable. It never means the planner is broken; it never crashes the gateway it protects.Related
Admission Control · Memory-aware
The admission-side sibling — sheds new turns under RSS pressure with
MemoryPressurePolicyGateway Reliability Presets
One switch that composes the gateway’s protective primitives
Gateway Session Persistence
Why evicted caches can be losslessly rebuilt — an unflushed transcript is never evicted
Gateway Graceful Drain
The other “avoid dropping live sessions” primitive
Introduced in PraisonAI PR #3805 (fixes #3804).

