How It Works
Quick Start
Simple Usage
What’s Bounded by Default
| Resource | Default limit | When it cleans up |
|---|---|---|
| Per-user lock cache | 10,000 entries, 1 hour TTL | Idle, unlocked entries evict automatically |
| Agent locks | One per agent instance | Removed when the agent is garbage-collected |
| Session histories | Opt-in via session_ttl | See Session Persistence |
Recreating agents per request is safe. Agent locks no longer reuse stale
id(agent) keys, so unrelated users cannot share locks or swap histories.Operational Knobs
For mid-run cancellation and stale session cleanup, see Bot Run Control —SessionRunControl.cleanup_stale_sessions(max_age_seconds=3600) removes abandoned run-control state.
Multi-Agent Safety
Earlier releases keyed agent locks onid(agent). CPython may reuse that integer after garbage collection, so long-running gateways that recreated agents per request could silently mix up two users’ histories. Agent locks now follow agent lifetime via WeakKeyDictionary; per-user locks stay bounded even if you never call cleanup helpers.
Released in PR #1972 — Upgrade to pick up the fix. See Session Persistence → Bounded lock caches for details.
Best Practices
Reuse one agent instance per bot
Reuse one agent instance per bot
Create the agent once at startup — agent locks follow instance lifetime via
WeakKeyDictionary, so recreating agents per request is safe but wasteful.Set session_ttl for busy channels
Set session_ttl for busy channels
Default lock caches evict after 1 hour; set
BotConfig(session_ttl=…) when conversations stay idle longer than your support SLA.Run cleanup_stale_sessions periodically
Run cleanup_stale_sessions periodically
Call
SessionRunControl.cleanup_stale_sessions on a schedule in long-lived gateways to drop abandoned run-control state.Upgrade after PR #1972
Upgrade after PR #1972
Ensure you are on a release that includes bounded agent locks — earlier builds could mix histories when
id(agent) was reused.Related
Session Persistence
Bot session storage and bounded lock behaviour
Messaging Bots
Platform setup, debounce, and chunking
Inbound DLQ
Persist failed messages for replay
Cross-Platform Mirror
One conversation across every channel

