chore(deps): update backend dependencies (major) - #1826
Open
renovate[bot] wants to merge 1 commit into
Open
Conversation
renovate
Bot
force-pushed
the
renovate/major-backend-dependencies
branch
2 times, most recently
from
April 27, 2026 23:48
5cf69e1 to
fe7d9be
Compare
renovate
Bot
force-pushed
the
renovate/major-backend-dependencies
branch
3 times, most recently
from
May 11, 2026 21:03
06c2e51 to
e62821e
Compare
renovate
Bot
force-pushed
the
renovate/major-backend-dependencies
branch
3 times, most recently
from
May 24, 2026 06:35
0e52bbc to
c8ff090
Compare
renovate
Bot
force-pushed
the
renovate/major-backend-dependencies
branch
from
June 4, 2026 23:57
c8ff090 to
ba18845
Compare
renovate
Bot
force-pushed
the
renovate/major-backend-dependencies
branch
from
June 26, 2026 10:53
ba18845 to
8fdb170
Compare
renovate
Bot
force-pushed
the
renovate/major-backend-dependencies
branch
from
July 4, 2026 17:47
8fdb170 to
bb0d1c2
Compare
renovate
Bot
force-pushed
the
renovate/major-backend-dependencies
branch
6 times, most recently
from
July 22, 2026 20:29
fca1fb2 to
b82a374
Compare
renovate
Bot
force-pushed
the
renovate/major-backend-dependencies
branch
2 times, most recently
from
July 27, 2026 17:31
0d78ecb to
01e74bd
Compare
renovate
Bot
force-pushed
the
renovate/major-backend-dependencies
branch
6 times, most recently
from
August 11, 2026 23:10
e1b6519 to
e0ddf9d
Compare
renovate
Bot
force-pushed
the
renovate/major-backend-dependencies
branch
2 times, most recently
from
August 15, 2026 21:13
135bd67 to
8a75804
Compare
renovate
Bot
force-pushed
the
renovate/major-backend-dependencies
branch
from
August 19, 2026 09:26
8a75804 to
b919785
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
==5.2.17→==6.1==25.2→==26.1==25.9.1→==26.8.0==25.3.0→==26.1.0==0.7.3→==1.0.1==5.7.0→==6.0.0==82.0.1→==84.0.0Release Notes
django/django (Django)
v6.1Compare Source
v6.0.8Compare Source
v6.0.7Compare Source
v6.0.6Compare Source
v6.0.5Compare Source
v6.0.4Compare Source
v6.0.3Compare Source
v6.0.2Compare Source
v6.0.1Compare Source
v6.0Compare Source
carltongibson/django-filter (django-filter)
v26.1Compare Source
Added testing for Django 6.1.
DRF integration will require the upcoming DRF v3.18.
See encode/django-rest-framework#9978
Added testing against Python 3.14.
benoitc/gunicorn (gunicorn)
v26.1.0: gunicorn 26.1.0Compare Source
New Features
reload_extra_files: entries containing*,?or[are treated as patterns, so
ui/*/config.jsonwatches every view's configwithout listing them one by one. Patterns are re-expanded on every reload
check rather than once at startup, so a file created later starts being
watched without restarting gunicorn, and
**recurses. A pattern matchingnothing warns instead of failing, since with live expansion it may match later
(#1643,
#3662).
Security
checked against the advisory database.
tornado,h2,setuptoolsandpymdown-extensionspermitted vulnerable versions and now require the firstclean release;
pytestandhttpxwere unpinned and now carry floors. Thetornadoexample pinnedtornado<6, which was both the source of severaladvisories and older than the
>=6.5.0the tornado worker needs, so theexample could not run as pinned.
Bug Fixes
SIGHUP did not reload the logger configuration:
Arbiter.reload()re-read the configuration file but kept using the logger built at startup,
calling only
reopen_files()on its existing handlers. Changes tologconfig,logconfig_dict,logconfig_jsonandloglevelwere ignoreduntil a full restart, which in containers meant replacing the pod. The
existing logger now re-runs its setup on reload, so new handlers, formats
and levels take effect while the process identity and its listeners are
preserved, and re-running the setup no longer stacks duplicate syslog
handlers. An invalid log configuration on reload is not fatal either: the
error is reported on stderr, the previous working configuration is restored
and the master keeps running with it
(#3353).
Truncated chunked bodies accepted: RFC 9112 section 7.1.2 ends a chunked
body with
0 CRLF CRLF, the second CRLF being the mandatory empty trailersection.
ChunkedReader.parse_chunk_size()swallowed theNoMoreDataraisedwhile scanning for it, so a body cut short right after the last chunk line was
treated as complete instead of rejected. It now raises
ChunkMissingTerminator(#3382,
#3685).
--spewcrashed on dynamically generated code: the trace hook indexed the2-tuple returned by
inspect.getsourcelines()by line number rather thanindexing the list of lines, so a frame with no
__file__raisedAttributeError: 'int' object has no attribute 'rstrip'on line 1 andIndexErrorbeyond it. The tuple is now unpacked and offset by the source'sstarting line (#3344,
#3495).
Duplicate
HostandContent-Typeheaders accepted: RFC 9110 section 5.3allows only one of each, and a repeat cannot be merged into a list, so the
message means different things to gunicorn and to anything downstream. Both
are now rejected with
InvalidHeader. The check lives in the policy hookshared by both parsers, so the pure-Python and fast parsers agree. Duplicate
Content-Lengthwas already rejected and is unchanged(#3366,
#3548).
Non-worker children reported as failed workers:
reap_workers()reapsevery child through
waitpid(-1), including processes the kernel reparentedonto gunicorn when it runs as PID 1 in a container, but it logged the exit
status before checking whether the pid was ever a worker. An unrelated process
produced
Worker (pid:N) exited with code Mand triggered alerts. Moreseriously, such a process exiting with code 3 or 4 raised
HaltServerand shutthe server down. Ownership is now established first: the dirty arbiter is
reported as itself, unknown children are reaped silently at debug level, and
only real workers can halt the server
(#3220,
#3566).
Dirty arbiter exits were invisible on SIGCHLD:
handle_chld()calledreap_workers()first, whosewaitpid(-1)claimed the dirty arbiter beforereap_dirty_arbiter()could identify it, so the latter always hitECHILDandits reporting never ran. The dirty arbiter is now reaped first, and
reap_workers()recognises it if it exits mid-loop.Dirty arbiter returned stale responses after a worker timeout: when a
request reached
dirty_timeoutthe arbiter answered the client with a timeouterror but kept the worker connection open. The worker's late response was then
the first message waiting on that socket, so the next request routed to the
same worker received the previous request's result, and every request after it
stayed one response behind. The connection is now closed on timeout, so the
late answer is discarded with it
(#3626).
ASGI connection count leaked on server-initiated close:
nr_connswasonly decremented in
connection_lost(), behind a guard keyed on the sameflag
_close_transport()sets first. Every close the server started (aConnection: closeresponse, a keepalive timeout, an error abort) leaked onecount, so
ASGIWorker._shutdown()ran the fullgraceful_timeoutand warnedabout connections that were already gone. The guard now uses its own flag, so
the decrement and the rest of the cleanup run exactly once whichever side
closes first (#3661).
Inotify reloader on cwd-relative extra files:
reload_extra_filesentrieswith no directory part (for example
.env) produced an empty dirname, andwatching it raised
InotifyErrorwithENOENT. The current directory is nowwatched as
.(#3377,#3667).
StatsD zero-valued metrics: gauges, counters, histograms and timers
reporting
0were silently dropped because the value was tested fortruthiness. Only
Noneis skipped now(#3676).
Spurious no-body warning from
sendfile(): a HEAD, 204 or 304 responseserved through
sendfile()warned about dropped body bytes even when thefile was empty and nothing was dropped. It now warns only when there are
bytes to drop, matching
write()(#3684).
Bare
exceptin the gevent websocket example: narrowed toexcept Exception(#3683).ASGI
receive()cancellation: Letasyncio.CancelledErrorpropagatefrom
BodyReceiverinstead of swallowing it and returninghttp.disconnect. Frameworks that cancel their disconnect listener afterthe response completes (Django) no longer see the cancel masked, so
request_finishedfires andclose_old_connections()runs. Fixes idledatabase connections leaking since 25.1.0
(#3627,
#3654).
Control socket leak on SIGHUP reload: The control thread is now marked
ready once its loop and server are live, and the stop paths wait on that
readiness before scheduling shutdown. Reloads no longer leak one thread and
its selector fd plus unix socket per worker, which eventually raised
"too many open files"
(#3648).
WSGI body framing on HEAD/1xx/204/304: Mirror the ASGI strip-and-warn
behavior on the WSGI path.
Content-Lengthis stripped on 1xx/204 perRFC 9110 section 6.4.2, body bytes are dropped for no-body responses in
both
write()andsendfile(), and a single warning is logged per request(#3413).
Refactoring
termination message in
Arbiter.reap_workers()(#3678).
Changes
packagingis no longer a runtime dependency: it was only ever imported bythe gevent worker, to compare gevent's version. It moved to the
geventandtestingextras, so a plainpip install gunicornpulls in nothing(#3643).
Fast HTTP Parser: Require
gunicorn_h1c >= 0.6.6, which rejects duplicateHostandContent-Typeheaders in the C parser itself. Gunicorn alreadyrefuses them on both the WSGI and ASGI paths, so this changes nothing that is
reachable; it moves the rejection to where the bytes are read and lets the
ASGI corpus exercise those cases against the fast parser directly.
Full changelog: https://gunicorn.org/2026-news/
v26.0.0Compare Source
Breaking Changes
eventletworker class has been dropped. Migrate togevent,gthread, ortornado.New Features
Security
authority-formrequest-target outsideCONNECTasterisk-formrequest-target outsideOPTIONSrelative-referencerequest-targetsContent-Lengthlist form (RFC 9112 section 6.3)finish_bodybyte cap_body_receiveralive across the keepalive smuggling gate so pipelined requests cannot re-enter a closed bodyproxy_allow_ipsand tighten v1/v2 parsing in the ASGI callback parser.Bug Fixes
Content-Lengthon HEAD and 304 responses (#3621)_handle_stream_endedto set_body_completein the async HTTP/2 handler so request bodies finalize correctly on stream endInvalidChunkExtensionmapping and fast-parser support in ASGI tests (#3565)Transfer-Encoding: chunkedto 100-Continue interim responses.textkey isNoneearly_hintscallback to matchprocess_headers; pass only the header name toInvalidHeader(#3588).accept())Transfer-Encodingheader for BlackSheep streamingRefactoring
BodyReceiver._closedinto separate transport and body-wait flags for clearer keepalive/EOF semantics.Changes
gunicorn_h1c >= 0.6.5. Drop the lastpython_onlytest markers; the C extension is now used wherever available (CPython only; PyPy continues to use the Python parser).h2anduvloopto thetestingextra; removeeventlet.docker/setup-qemu-action,docker/setup-buildx-action,docker/login-action,docker/build-push-action, anddocker/metadata-actionto current major versions.Full changelog: benoitc/gunicorn@25.3.0...26.0.0
huggingface/sentence-transformers (sentence_transformers)
v6.0.0: - MultiVectorEncoder for ColBERT & late interaction models, transformers v5, float32 scoring, faster training & encodingCompare Source
This major release introduces Multi-Vector Embedding models, also known as late interaction or ColBERT-style models, as a fourth model type alongside
SentenceTransformer,CrossEncoder, andSparseEncoder. Going forward, you'll be able to use Sentence Transformers for training, inferencing, and interpreting Multi-Vector Embedding models.It also modernizes the dependency floors to
transformersv5, fixes a class of silent scoring bugs caused by half precision, and speeds up both training and encoding.Install this version with
MultiVectorEncoder: ColBERT-style late interaction models (#3794)
Sentence Transformers v6.0 introduces
MultiVectorEncoder, for ColBERT-style late interaction retrieval. Where a regular embedding model compresses a whole text into one vector, a multi-vector model keeps one vector per token and scores query against document with the MaxSim operator. That preserves token-level matching information that a single vector has to average away, which usually means stronger retrieval at the cost of a bigger index. It is also the state of the art for visual document retrieval, where a text query is matched against page images directly, with no OCR step in between.Any PyLate checkpoint and any Stanford-NLP ColBERT checkpoint loads straight into it, and colpali-engine models for visual document retrieval work too, through the same familiar API you already use for dense, sparse, and reranker models.
Mars wins, as it should, though notice how close the four scores are. That is normal for MaxSim: the scores often look similar, but the ranking is still exact. The blogpost explores this in more detail.
Note what you get back: a list of 2D tensors on the model device, one per input, each of shape
(num_tokens, embedding_dim). Unlike dense embeddings, you cannot stack these into one rectangular tensor, because every input has its own token count. Passconvert_to_numpy=Truefor a list of numpy arrays instead, which is what you want once a corpus outgrows device memory.Multi-vector models are also asymmetric: queries and documents go through different prefixes, different length caps, and different scoring masks. Unlike many dense models, where the two are interchangeable,
encode_queryandencode_documentare required to get correct embeddings.The MaxSim operator
Scoring uses MaxSim: for each query token, take its highest similarity against any document token, then sum those maxima across the query.
You can read the operator as a soft alignment: every query token points at the one document token that best explains it, and the score is how well the document explains the query overall. The alignment does not have to be lexical, since the token embeddings are contextualized. But when an exact match does matter to you (a product code, a surname, a function name), MaxSim has a token sitting right there to match it, where a single-vector model had to fold it into an average.
Because MaxSim sums over query tokens, its magnitude scales with the query token count, so scores are not comparable across models with different query recipes. If you want scores on a bounded scale, use
similarity_fn_name="meanmaxsim", which divides by the query token count and gives you an average cosine similarity in[-1, 1].Scoring builds a 4-dimensional intermediate of every query token against every document token, which is the largest tensor in the operation. Every scoring function takes a
chunk_elementsbudget that bounds it, defaulting to 100 million elements (roughly 400 MB in float32), so lower it if you run out of memory. Scores and gradients are bit-identical whatever you set it to.maxsimandmaxsim_pairwisealso take adevice, which scores one chunk at a time on that device and moves each result straight back, letting you score a corpus larger than your VRAM on the GPU. Both are reachable throughsimilarity, which forwards any extra keyword arguments to the scoring function:When training, pass the budget to the loss instead, with
similarity_fct=partial(colbert_scores, chunk_elements=1_000_000). It chunks the document axis, so it composes with the loss-levelscore_mini_batch_size, which chunks the query axis.Are they any good?
lightonai/LateOnandlightonai/DenseOnwere trained by LightOn on the same data with the same ModernBERT backbone and the same 149M parameters, differing only in whether they keep one vector per token or pool down to one per document. Running both over all 13 NanoBEIR datasets isolates what that choice buys:Late interaction wins on 9 of the 13 datasets and on the mean, by roughly one NDCG point. The four it loses (ArguAna, FiQA2018, SCIDOCS, and SciFact) are the shape of the tradeoff you should expect: a real gain in retrieval quality at the same model size, paid for in index footprint, rather than a universal win on every dataset. The same pair scores 57.22 against 56.20 on the full 15-dataset BEIR, a comparable gap, so the margin is not an artifact of the small benchmark.
That footprint is the real cost. One vector per token instead of one vector per document is a lot more vectors, only partly offset by the smaller dimension. Encoding 4,874 Natural Questions passages with
lightonai/LateOnproduced 608,414 token vectors, an average of 124.8 per passage:all-MiniLM-L6-v2gte-modernbert-baseLateOnThat is about 42x the storage of the MiniLM index. Token Pooling cuts the vector count before any of that, real late interaction indexes compress heavily (the same vectors take 88 MB as a fast-plaid PLAID index), and using a multi-vector model as a reranker over a dense first stage avoids building an index at all.
Every checkpoint format loads
Multi-vector checkpoints have been published in several formats over the years.
MultiVectorEncoderreads all of them, so loading looks the same whatever the model started life as:The recipe knobs that differ per checkpoint (marker prefixes for queries and documents, length caps, whether queries are padded out with
[MASK]tokens, and which tokens are skipped when scoring documents) all live in the module configs, soprint(model)shows you exactly what you loaded:Following the design principle of the rest of the library, this behavior lives in swappable modules rather than in the model class: a
Transformerproducing contextualized token embeddings, a token-levelDenseprojecting each of them down, aMultiVectorMaskdeciding which tokens count during scoring, and a token-levelNormalize.Supported models
These are the checkpoints we test against directly, ranked by retrieval quality. The
sentence-transformerstag on the Hub is the list that stays current, and for text retrieval in particular, any PyLate or Stanford-NLP ColBERT checkpoint loads whether or not it carries the tag yet. Where arevisionis listed, pass it until the pull request on that repository is merged.Text retrieval (29 models). NanoBEIR is the mean NDCG@10 over the 13 NanoBEIR datasets, a fast proxy for English text retrieval quality. A
-means the model was not evaluated on it, which is the case for the non-English models.trust_remote_code=Truetrust_remote_code=Truerevision="refs/pr/4"Visual document retrieval (22 models). These embed page images as documents and text as queries. NanoViDoRe is the equivalent proxy over the ViDoRe benchmark subsamples.
trust_remote_code=Truetrust_remote_code=Truetrust_remote_code=Truetrust_remote_code=TrueNote that NanoBEIR and NanoViDoRe are small benchmarks, so their scores are not a substitute for evaluating on your own data, which is always the right way to pick a model.
Visual, audio, and video document retrieval
Late interaction is the state of the art for visual document retrieval: matching a text query against page images, with charts, tables, and layout intact, and no OCR step. This is what the ColPali family of models does, and those checkpoints run through the same API. Image documents are passed as URLs, local paths, or PIL images:
The code is unchanged from the text case. Underneath, the processor handles the visual prompt and the image patches, and MaxSim scores query text tokens against document image patches. Page images are not the only non-text modality either: text, images, audio, and video are all accepted, and a checkpoint supports whichever of those its processor does, which
model.modalitiesreports.Because MaxSim is a sum of per-query-token maxima, a ranking decomposes exactly: every point of a document's score belongs to one query token and one document token. The new
sentence_transformers.multi_vector_encoder.interpretabilitymodule overlays that decomposition onto the page as the standard ColPali heatmap, either aggregated over the query or one map per query token.Token pooling
If the index footprint worries you, the most effective knob is to store fewer token vectors.
HierarchicalTokenPoolingimplements the token pooling technique from Clavié, Chaffin, and Adams: it clusters each document's token vectors with Ward linkage on cosine similarity and replaces each cluster with its mean, keeping roughly1 / pool_factorof the tokens.By default, pooling applies to documents only, since queries are short and are the side you cannot afford to distort. On the Natural Questions corpus above, the reduction tracks
pool_factorclosely:pool_factorThe original experiments measured the retrieval cost of this on BEIR and found very little of it: 100.6% of the unpooled performance on average at
pool_factor=2, and 99.0% atpool_factor=3. How much it costs on your data is corpus-specific, so measure it with an evaluator before you settle on a factor.Update Stats
Introducing
MultiVectorEncoderhas been one of the largest updates to Sentence Transformers, introducing all of the following:MultiVectorMask,BaseTokenPooling,HierarchicalTokenPooling, andLambdaTokenPoolingmaxsim,maxsim_pairwise,mean_maxsim,mean_maxsim_pairwise) plus 6 named ColBERT scorers and 5 XTR scoring entry pointstorch.compileResources
🚨 transformers v5, torch 2.2, and new dependency floors (#3794)
Sentence Transformers v6.0 requires
transformersv5. The v4.x compatibility branches have been removed, which is what allows the new modality handling, chat template support, and unpadding paths to be relied upon rather than feature-detected. The floors that moved:transformers>=4.41.0,<6.0.0>=5.0.0,<6.0.0huggingface-hub>=0.23.0>=1.3.0,<2.0.0torch>=1.11.0>=2.2numpy>=1.20.0>=1.24.0scikit-learn>=0.22.0>=1.1.0typing_extensions>=4.5.0>=4.10.0datasets(train)>=2.0.0>=2.16.0accelerate(train)>=0.20.3>=1.3.0optimum-intel[openvino]>=2.0.0requires-pythonis unchanged at>=3.10. Note that multi-GPU training with streaming (IterableDataset) datasets needsaccelerate>=1.13.0in practice.🚨 Higher-precision scoring (#3892, #3893, #3924, #3926)
Half precision ties too many scores together to rank with. Three separate places where that mattered are now computed in float32.
Reranker scores are the big one.
CrossEncoder.predict(andrank) now upcast the logits to float32 before applying the activation function. A sigmoid in bfloat16 saturates and collapses the top candidates onto a handful of tied values, which randomizes their order. Measured oncross-encoder/ettin-reranker-32m-v1in bfloat16 over three NanoBEIR datasets with 100 candidates per query:NanoMSMARCO NDCG@10 alone goes from 0.0965 to 0.7093. If you run a half precision reranker with the default sigmoid activation, its ranking was essentially randomized before this release. Models using
activation_fn=nn.Identity()(raw logits) were unaffected, as bf16 logits keep enough relative spacing.Similarity scores from
model.similarity/similarity_pairwiseand thecos_simfamily are now computed in float32 for float16 and bfloat16 embeddings. With 10,000 realistic cosine scores (mean 0.7, standard deviation 0.05), float32 keeps 9,983 distinct values where float16 keeps 593 and bfloat16 keeps just 93. bfloat16 can represent only 129 distinct values in the whole of[0.5, 1.0).MaxSim sums over query tokens, reaching magnitudes where the bfloat16 grid is 0.125 wide, so
maxsimandmaxsim_pairwiseaccumulate the per-token maxima in float32 and always return float32 scores. The 4-dimensional scoring intermediate stays in the input dtype, so this does not change peak memory.Note that
encode()output dtypes are unchanged. Only the scoring step is upcast. ForCrossEncoder.predict, the returned dtype changes only withconvert_to_tensor=Trueorconvert_to_numpy=False, as the default numpy output was already float32.Separately, the multi-vector bf16 benchmarks were re-measured under this float32 accumulation (#3924). Most of the previously reported bf16 quality drop came from the scoring accumulation rather than from the embeddings: plain bf16 now sits at 99.0% of fp32 retrieval quality (was 95.0%), and bf16 with FlashAttention-2 is indistinguishable from fp32 at 99.96% (was 97.9%).
🚨 Other breaking changes (#3794, #3927, #3935)
similarityandsimilarity_pairwiseare methods, not properties. Calls likemodel.similarity(embeddings1, embeddings2)work unchanged, but assigning a custom function tomodel.similarityis no longer supported: it now silently shadows the method where it previously raised anAttributeError. Setmodel.similarity_fn_name = "dot"instead, which updates both. Note also thatmodel.similarity.__name__is now"similarity"rather than the resolved function name, which affected lossget_config_dict()output and generated model cards. The newsentence_transformers.util.similarity_fct_name()resolves it properly and the losses use it.model.encode([{"role": "user", ...}, {"role": "assistant", ...}])produces one embedding, where v5.x read it as a batch of two inputs. Wrap each conversation in its own list to encode a batch:model.encode([[msg1], [msg2]]). This applies toSentenceTransformer,SparseEncoder, andMultiVectorEncoder.CrossEncoderis unaffected.trust_remote_code=True(#3935). Loading a model whosemodules.jsonreferences a class outsidesentence_transformersexecutes third-party code, and a local directory no longer implies trust. This closes the bypass reported in #3801 and completes the deprecation cycle announced in v5.6 and v5.7. Unmet, it raises aValueErrornaming the class and pointing at the repository or local path to inspect. Trainer checkpoint reloading (load_best_model_at_end,resume_from_checkpoint) keeps working for programmatically built models without the flag.quantize_embeddingsreturns a list of per-input matrices when given a list of 2D arrays, where it previously stacked them into one 3D array. Update callers that indexed the stacked array. An empty list now returns[]instead of raising, and a(0, dim)matrix returns a correctly shaped empty result.encode(pool=..., precision="int8")now quantizes once after merging the worker results, so the calibration ranges match single-process encoding. Quantized indexes built with v5.x multi-process encoding are not bit-compatible and should be regenerated. Peak memory is higher, because the full float32 matrix is materialized before quantization.CrossEncoder.rankreturns Python floats ([#3927](https://redirect.github.com/Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
This PR was generated by Mend Renovate. View the repository job log.