Nalar: Workflow-Aware Management of Agentic Applications
Organizations: UT-Austin · Cisco-Research
Abstract
LLM-driven agentic applications automate complex, multi-step tasks, but serving them efficiently remains difficult due to heterogeneous components, dynamic model-driven control flow, long-lived state, and highly variable latencies. Nalar is a serving framework for agent workflows that separates workflow specification from execution while providing the runtime visibility and control needed for robust performance. Nalar preserves ordinary Python interfaces and control flow through lightweight auto-generated stubs that turn agent and tool invocations into futures carrying dependency and execution-context metadata. A two-level control architecture combines global policy computation with local event-driven enforcement to support adaptive routing, scheduling, and resource management across evolving workflows. A workflow-aware KV-cache layer enables the runtime to manage cache placement and lifetime. Together, these mechanisms enable scalable, efficient, policy-driven serving of heterogeneous agentic applications without burdening developers with orchestration logic. Across three agentic workloads, Nalar reduces tail latency by 34-74% and achieves up to 3.38x speedups.
Figures & tables
| Metadata | Structure | Description |
|---|---|---|
| dependencies | list(agentA:ip, …) | List of dependencies required to compute the future’s output |
| creator | agentName:ip | Component that created the future |
| executor | agentName:ip | Component instance currently assigned to execute the future |
| consumers | list(future-id, …) | Components waiting to consume the future’s value |
| session-id | str:UUID | The user-request associated with the future |
| Hint | Values | Descriptions |
|---|---|---|
| stateful | Boolean | True indicates for a session successive calls to the agent will be routed to the same instance |
| batchable | Boolean | True indicates that module can accept a batch of request |
| reusable | Boolean | Resource created during a session can be reused by subsequent invocations within the same session. |
| preemptable | function | True indicates that running invocations of the component may be preempted by the runtime. |
| max_instances | Integer | Indicates the max number of instances to initialize |
| min_instances | Integer | Indicates the min number of instances the framework should keep alive |
| Number of Futures | One-Level Design | Two-level Design |
|---|---|---|
| Time(ms) | Time(ms) | |
| 1024 | 1.2 | 0.1 |
| 2048 | 2.3 | 0.1 |
| 4096 | 2.8 | 0.2 |
| 8192 | 3.4 | 0.4 |
| 16384 | 3.9 | 0.4 |
Appendix figures & tables2 assets
Supplementary material from the paper’s appendix.
Appendix
| Category | Metric | Description |
| Future metadata | Session ID | UniqueID associated with a session. |
| Future ID | Unique ID associated | |
| Component | Identifies the agent or tool invoked by the future. | |
| Creator | Component that created the future. | |
| Executor | Agent or tool instance assigned to execute the future. | |
| Dependencies | Futures whose values must be available before the future becomes ready. |