A deterministic local embedder instead of a hosted embedding API.
WhyThe cache's behaviour has to be reproducible in a test and on a laptop with no API key. Hashing the tokens into signed buckets gives the same vector for the same text, every time, for free.
CostIt captures lexical overlap, not deep semantics. A true paraphrase with different words scores lower than a real embedding model would give it. The provider interface is swappable for exactly this reason.
The similarity threshold is configuration, not a constant.
WhyThe correct threshold depends on the application. A support bot can be looser than a system answering questions about pricing. Burying it in code guarantees it gets tuned by editing a service.
CostIt is one more value an operator has to understand and set deliberately.
Redis Streams with a consumer group rather than a simple list queue.
WhyA worker that dies mid-request should not silently lose the request. A consumer group tracks pending entries so a restarted worker can reclaim them.
CostMore moving parts than a list pop, and the pending-entry recovery is deliberately basic in V1.
A mock provider that is the default, not an afterthought.
WhyAnyone can clone the repository and run the full request path (queue, worker, cache write-back) without a key or a bill. That is what makes the system inspectable rather than describable.
CostThe default experience does not produce real model output.