The Vectorize / Qdrant client is wrapped in a circuit breaker so a vector-store outage degrades gracefully instead of failing the visitor turn.
VECTOR_CIRCUIT_THRESHOLD errors land
inside VECTOR_CIRCUIT_WINDOW seconds, the
circuit opens.VECTOR_CIRCUIT_COOLDOWN seconds):
search() returns an empty array
immediately. The LLM still answers — it just has no
retrieved <source> chunks for
that turn.upsertPoints() / delete* /
ensureCollection() /
dropCollection() raise
CircuitOpenException. Queued jobs
requeue automatically.| Env var | Default | What it does |
|---|---|---|
VECTOR_CIRCUIT_THRESHOLD | 5 | Errors needed to trip the breaker. |
VECTOR_CIRCUIT_WINDOW | 60 | Sliding-window seconds for the failure counter. |
VECTOR_CIRCUIT_COOLDOWN | 60 | Seconds the breaker stays open before the next probe. |
Cache backend is whatever cache.default resolves to.
On a Redis production stack the breaker state is shared across
workers, so an outage trips for the whole cluster at once
instead of being re-discovered per worker.
From laravel.log:
vector.circuit_open {"client":"vectorize","count":5,"cooldown":60,"error":"Cloudflare 502 Bad Gateway"}
The widget continues to serve responses, just without retrieval. Once Vectorize recovers, the breaker auto-closes on the next successful probe — no operator action required.