One client per process, not per request
The async client maintains a connection pool. Constructing a new AsyncAnthropic() inside every FastAPI route burns connection setup overhead and prevents the pool from being effective. Build the client once at startup, store it on the app state or a module-level singleton, and reuse it everywhere.
Concurrent calls with asyncio.gather
When a single request needs multiple Claude calls (parallel summarization, multi-shot evaluation, fan-out), asyncio.gather runs them concurrently. The SDK's async client handles connection reuse and rate-limit backoff cleanly under gather — you are not penalized for fanning out.
Cancellation and timeouts done right
If the upstream HTTP request from your client is canceled (browser closes, FastAPI raises CancelledError), you want the in-flight Anthropic call canceled too. The SDK respects asyncio cancellation. Use async with asyncio.timeout() for whole-call timeouts; do not wrap stream iteration in asyncio.wait_for (it kills the generator, see Messages track).