* feat: add JinaMLXCrossEncoder for native Apple Silicon reranking Adds a new `jina-mlx` reranker provider backed by jinaai/jina-reranker-v3-mlx, a 0.6B multilingual listwise reranker running via the MLX framework on Apple Silicon. The model is downloaded automatically from HuggingFace Hub on first use. Benchmarked latencies (Apple Silicon): 1 doc→32ms, 5→45ms, 10→60ms, 20→94ms. Sub-linear scaling because all docs are ranked in a single forward pass. - Embeds the MLX reranker implementation (_MLXReranker / _MLPProjector) directly in cross_encoder.py with no transformers/PyTorch dependency - Adds `mlx`, `mlx-lm`, `safetensors` to pyproject.toml optional deps (uv add) - Updates configuration.md with provider docs and benchmark table * refactor: import MLXReranker from repo rerank.py instead of duplicating code Use importlib to load MLXReranker directly from the model repo's own rerank.py (downloaded via snapshot_download). Also pin exact minimum versions for mlx>=0.31.0, mlx-lm>=0.31.1, safetensors>=0.6.2 (verified against installed versions). * refactor: move MLX reranker impl to dedicated jina_mlx_reranker.py Replaces the importlib hack with a proper module. jina_mlx_reranker.py is adapted from jinaai/jina-reranker-v3-mlx/rerank.py (CC BY-NC 4.0) with the source clearly documented at the top of the file. * docs: simplify jina-mlx reranker docs * fix: disable GIN fastupdate on source_memory_ids index to prevent deadlocks GIN fastupdate buffers inserts in a pending list and flushes it with AccessExclusiveLock when full. Under concurrent test load (8 xdist workers all running retain_async), two workers can trigger a flush simultaneously and deadlock. Recreating the index with fastupdate=off eliminates the flush/lock cycle at the cost of slightly slower individual inserts. * fix: drop per-bank HNSW indexes after transaction to avoid AccessExclusiveLock deadlock When deleting a bank, the previous code dropped HNSW indexes inside the same transaction as the DELETE FROM memory_units. Since DROP INDEX needs AccessExclusiveLock on the parent table and DELETE holds RowExclusiveLock, two concurrent bank deletions deadlocked on the same table lock. Fix: capture internal_id inside the transaction, commit, then drop the indexes outside the transaction so no row-level locks are held. |
||
|---|---|---|
| .. | ||
| versions | ||
| env.py | ||
| README | ||
| script.py.mako | ||
Generic single-database configuration.