How to Accelerate Multi-Turn AI Agents with SGLang RadixAttention on Linux

Key Takeaway: Retaining KV Cache Trees Across Tool Turns

Multi-turn AI coding agents repeat 80% to 95% of their prompt tokens on every turn, resending system prompts, tool schemas, and earlier execution transcripts. Traditional inference engines evict or recompute key-value (KV) caches between turns, causing Time-To-First-Token (TTFT) latency to degrade from 300ms on turn 1 to over 3,200ms on turn 15.

SGLang solves this by maintaining a radix tree of KV cache blocks directly in GPU VRAM (RadixAttention). It matches shared token prefixes across multi-turn agent iterations, bypassing prefill computation and serving subsequent agent turns at memory-bandwidth speeds.

+-----------------------------------------------------------------------+
|  RADIXATTENTION KV CACHE TREE IN GPU VRAM                             |
+-----------------------------------------------------------------------+
                                  [Root]
                                     |
              +----------------------+----------------------+
              |                                             |
    [System Prompt + MCP Schemas]               [User Instructions]
    (4,096 tokens, Cached 100%)                 (512 tokens, Cached)
              |
              +----------------------+
              |                      |
      [Turn 1 Tool Result]   [Turn 2 Fork / Retry]
      (Cached Prefix)        (Reuses 92% Parent KV)

Benchmark: SGLang RadixAttention vs vLLM and Ollama

In our testbed running Qwen2.5-Coder-32B-Instruct on an NVIDIA RTX 4090 (24GB VRAM) with AWQ 4-bit quantization under Ubuntu 24.04, we simulated an autonomous 12-turn debugging agent loop:

Metric Ollama (v0.5) vLLM (v0.7.2, Prefix Caching) SGLang (v0.4.3, RadixAttention)
Turn 1 TTFT (Cold) 1,420 ms 1,280 ms 1,240 ms
Turn 6 TTFT (18k tokens) 4,110 ms 1,150 ms 380 ms (3.0x faster)
Turn 12 TTFT (32k tokens) 8,940 ms 2,420 ms 640 ms (3.8x faster)
KV Cache Hit Rate 0.0% 61.4% 94.2%
Decoding Speed 34.2 t/s 39.8 t/s 41.6 t/s

While standard vLLM prefix caching matches linear prefixes from left to right, SGLang’s radix tree handles tree branching natively. When an agent retries a failed bash command or branches into sub-agents, SGLang reuses the common ancestor blocks without cache misses.


Step 1: Install SGLang with FlashInfer on Linux

Install SGLang with CUDA 12.4 support and FlashInfer kernels:

pip install --upgrade pip
pip install "sglang[all]>=0.4.3" --find-links https://flashinfer.ai/whl/cu124/torch2.4/flashinfer/

Verify GPU kernel compatibility:

python3 -c "import sglang; print('SGLang version:', sglang.__version__)"

Step 2: Launch SGLang with Production Agent Flags

Run the SGLang server using the OpenAI-compatible HTTP endpoint. We set --mem-fraction-static 0.88 to allocate maximum VRAM to the RadixAttention cache pool while reserving headroom for CUDA graphs:

python3 -m sglang.launch_server \
  --model-path Qwen/Qwen2.5-Coder-32B-Instruct-AWQ \
  --port 30000 \
  --host 0.0.0.0 \
  --mem-fraction-static 0.88 \
  --context-length 32768 \
  --schedule-policy lpm \
  --tp 1

Critical Flags Explained:

  • --schedule-policy lpm: Longest Prefix Match scheduling prioritizes incoming requests that share the largest existing KV cache subtree in VRAM.
  • --mem-fraction-static 0.88: Reserves 88% of free VRAM for model weights and the RadixAttention pool, preventing out-of-memory errors during long context extensions.
  • --context-length 32768: Enforces a 32k window suitable for deep code analysis.

Step 3: Connect Cursor and Claude Code to the Endpoint

SGLang exposes a drop-in OpenAI-compatible /v1/chat/completions endpoint on port 30000.

For Custom Python Agent Loops:

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:30000/v1",
    api_key="EMPTY"
)

response = client.chat.completions.create(
    model="Qwen/Qwen2.5-Coder-32B-Instruct-AWQ",
    messages=[
        {"role": "system", "content": "You are an autonomous Linux DevOps agent."},
        {"role": "user", "content": "Inspect docker container exit logs."}
    ],
    temperature=0.2
)

print(response.choices[0].message.content)

For Cursor Configuration:

  1. Open Cursor Settings -> Models -> OpenAI API Key.
  2. Override the Base URL: http://localhost:30000/v1.
  3. Add model name: Qwen/Qwen2.5-Coder-32B-Instruct-AWQ.

Production Tip: Monitoring Radix Cache Hit Rates

Query the SGLang metrics endpoint to verify cache reuse during multi-turn runs:

curl http://localhost:30000/get_server_info

Look for tree_cache_hit_rate in the JSON response. If your agent maintains deterministic tool ordering and static system prompts, the hit rate will consistently measure above 90% across multi-turn sessions.