Skip to content

1.4.0-dev

Choose a tag to compare

@github-actions github-actions released this 17 Sep 09:57
· 11 commits to dev since this release

1.4.0-dev

Added

  • Run-slot limit is --concurrent / concurrent in graphviagent.toml / GVA_CONCURRENT (default 3). Every graph execution takes a slot: live Run, Continue/Step, POST /api/run, and Replay / Replay from. Overflow waits in a server-side FIFO (--queue-limit / queue_limit / GVA_QUEUE_LIMIT, default 4× concurrent). Resume / HITL jumps ahead of new runs so a paused run is not stuck behind other live work. LangGraph node fan-out is separate (--node-concurrency / node_concurrency / GVA_NODE_CONCURRENCY; omitted = unlimited). Slots and the queue live on the server (GET /api/meta); two browser tabs share them.

Changed

  • Concurrent runs in one process are keyed only by LangGraph thread_id (a missing id is not inferred from “the only capture”). user_id is set to that same id so a shared MemorySaver / store cannot mix long-term memory across runs
  • Node probes stay installed for the compiled app (refcount), but each run has its own probe bucket, logs, and cancel via capture lookup
  • Process-global stdout/stderr and time.sleep patches resolve the current run through TLS / thread_id, so queued and running workers do not leak logs or cancel
  • save_run writes to a temp file and os.replaces it; list/load skip unreadable JSON and hidden temp files
  • Graph workers are non-daemon and joined after cancel, so disconnecting cannot free a slot while an LLM call is still running
  • Closing a tab dequeues a waiting run and still cancels a live one; a paused or finished run is left alone
  • Leftover queued / running stubs from a crashed process are canceled on the next serve so they do not look runnable
  • SSE queue waits send comment heartbeats (: ping) so proxies do not drop the connection

Fixed

  • Cancel shows Canceling on the button and pipeline until the run actually stops
  • A 4th Run is queued instead of rejected; a full queue returns HTTP 429 {busy, active, queued, limit, queue_limit}, not a generic 400
  • Closing the tab dequeues a queued wait without starting the graph
  • A second start of the same run_id is refused (HTTP 409 {active, run_id}), not HTTP 400
  • Trace graph edges no longer stretch into giant loops after opening Trace from a fresh start / another page (edges were drawn while the pane was display: none)
  • Trace follows the run you opened: finishing another job does not replace the view; History / Runs clicks keep the live SSE
  • Clear / Delete refuse while a pipeline or run is queued or running
  • Pipeline glob no longer descends into Python environments (.venv / venv, pyvenv.cfg, conda prefixes, tox / pixi / direnv)
  • File watch re-hashes pipeline files only when size changes, so cloud-sync mtime jitter does not re-read them