Announcing New Concurrency Features
We’ve been closely focused on improving our support for different concurrency setups and strategies and shipped a bunch of new features, which can be found in our concurrency docs and in our latest open-source release. These features work only at the task level for now and will soon also be available at the workflow level.
Dynamic Concurrency Limits
Dynamic concurrency limits allow you to set concurrency limits on a per-key basis using a CEL expression. For example, you might want premium-tier users to be able to run 10 workflows simultaneously, while other users can only run one. This can be expressed as a dynamic concurrency limit: input.tier == 'premium' ? 10 : 1
Shared Concurrency Across Workflows
Shared concurrency across workflows allows you to create concurrency rules that many tasks and workflows can consume simultaneously. For example, you might want workflow_a and workflow_b to be limited to 10 concurrent runs per user total. While we previously recommended using a parent router task for this pattern, this is now possible with shared concurrency instead.
Concurrency Strategies
We’re releasing two new concurrency strategies: Cancel Queued Except Newest and Cancel Queued Except Oldest. These allow you to configure the queue depth for each concurrency key. For example, say you only want to keep a single item in the queue for a key: Cancel Queued Except Newest will always keep the most-recent item in the queue, while Cancel Queued Except Oldest will always keep the least-recent, until the in-progress runs have completed. This is conceptually similar to debouncing.
Updated SDK References
We’ve also updated the SDK references, including reference overview pages (Python example) and more docs pages (such as the latest on CEL expressions) to improve docs navigability for coding agents.
That’s all for now!