infra: agent backend cannot scale beyond a few concurrent users
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 30/100
- Tipo di issue
- Funzionalità
- Chiarezza
- Da chiarire
- Stato di attività
- Tranquilla
- Stack tecnologico
- postgresql, python, redis, sqlite, typescript
Direzione di ricerca
Start with apps/agent/main.py, apps/agent/src/bounded_memory_saver.py, render.yaml, and apps/app/src/app/api/copilotkit/route.ts; reproduce the concurrency failure described in #63 before choosing a phase. The work is done only when the selected scaling, persistence, backpressure, or load-testing goals are implemented and verified at the stated target concurrency.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Problem
The agent backend runs on a single uvicorn worker process with an in-memory checkpointer on a 512MB Render starter instance. This is a global bottleneck — not per-user. All concurrent users share the same event loop, the same memory pool, and the same 200-thread checkpoint limit.
Currently the app breaks at ~3 concurrent connections (#63). At production scale (100-1000 users), it would be effectively unusable.
Architecture bottlenecks
1. Single worker process
- uvicorn runs with 1 worker (default) — all requests share one Python event loop
- Each GPT-5.4 visualization call takes 10-30s
- LangGraph has synchronous sections that block the event loop
- Throughput: ~2-6 visualization requests/minute
2. In-memory checkpointer (BoundedMemorySaver)
- All conversation state stored in RAM — shared global pool of 200 threads
- FIFO eviction: after 200 conversations across ALL users, oldest threads are silently deleted
- Users lose conversation context mid-session with no error
- Not thread-safe — designed for single-process async only
- On 512MB starter plan, memory pressure builds well before 200 threads
3. No backpressure or error surfacing
- When the backend is saturated, requests hang silently — no timeout, no error, no retry
- Frontend shows no indication that the agent is overloaded
- Health check at
/healthreturns 200 even when the event loop is blocked
Scale projections
| Concurrent users | Behavior |
|---|---|
| 1-5 | Works fine |
| 10-20 | Noticeable latency, requests queue |
| 50+ | Requests timeout, SSE connections drop |
| 100+ | Effectively down, health checks fail, Render restarts |
Proposed solution
Phase 1 — Quick wins (config changes only)
- Add
--workers 4to uvicorn startCommand inrender.yaml— multiplies throughput ~4x - Upgrade agent service from starter (512MB) to standard (1GB+) in
render.yaml - Enable rate limiting (
RATE_LIMIT_ENABLED=true) with reasonable limits (e.g. 20 req/min per IP)
Phase 2 — Persistent checkpointer
- Replace
BoundedMemorySaverwith PostgreSQL or SQLite async checkpointer - Conversation state survives restarts and doesn't consume RAM
- No more silent thread eviction — threads persist until explicitly cleaned up
- Render already supports managed Postgres — can add as a service in
render.yaml
Phase 3 — Error handling and backpressure
- Add frontend timeout — show error after ~30s of no response instead of hanging forever
- Add backend concurrency limit — return 503 "busy" when at capacity rather than queuing indefinitely
- Add connection health monitoring — detect dropped SSE connections and surface to user
- Reuse thread IDs per browser tab (
sessionStorage) to avoid creating unnecessary threads
Phase 4 — Horizontal scaling
- Use Gunicorn with uvicorn workers for proper process management
- Verify Render auto-scaling (1-3 instances) works correctly with persistent checkpointer
- Add Redis or Postgres for shared state across instances
- Load test at target concurrency (100+ users) to validate
Related issues
- #63 — Agent stops responding after multiple concurrent tabs (symptom of this)
- #58 — Quality regression (long-running visualization calls exacerbate the single-worker bottleneck)
- #62 — Planning step before visualization (adds an extra round-trip, making concurrency even more critical)
Key files
apps/agent/main.py— uvicorn config, BoundedMemorySaver(max_threads=200)apps/agent/src/bounded_memory_saver.py— FIFO eviction logicrender.yaml— Render service config (starter plan, no worker config)apps/app/src/app/api/copilotkit/route.ts— Frontend → agent connection
- Lingua principale
- TypeScript
- Stelle
- 3.9k
- Fork
- 414
- Merge medio
- 4h
- PR unite (30g)
- 6
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di CopilotKit/OpenIntelligentUI
-
Script dedup key truncation may cause collisionsForse già presa @saschabuehrle l’ha presa 215 giorni fa. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
CopilotKit/OpenIntelligentUI#37 ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
CopilotKit/OpenIntelligentUI#29 ·
I maintainer di solito rispondono entro 1 giorno
-
Self-host with Docker Compose and optional server-held keysForse già presa @kannan983 l’ha presa 15 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 18/100
CopilotKit/OpenIntelligentUI#98 ·
I maintainer di solito rispondono entro 1 giorno
-
Support OpenAI-compatible gateways (OpenRouter) via vendor/model namesForse già presa @kannan983 l’ha presa 15 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 25/100
CopilotKit/OpenIntelligentUI#97 ·
I maintainer di solito rispondono entro 1 giorno
-
UIAperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 8/100
CopilotKit/OpenIntelligentUI#96 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di CopilotKit/OpenIntelligentUI
Issue simili
-
[good first issue, hacktoberfest] 🏯 Hacktoberfest Task - Add new Japan Fact 898 (good-first-issue)Apertacommunity first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 86/100
lingdojo/kana-dojo#33145 · 1 commento · 5 reazioni ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
code-yeongyu/senpi#4278 ·
I maintainer di solito rispondono entro 1 giorno
-
[Bug] Activity | The activity list ignores taskIds and returns the activities of every taskForse già presa @NdekoCode l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
ever-co/ever-gauzy#11469 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
griffinwork40/agent-afk#4408 ·
I maintainer di solito rispondono entro 1 giorno