Minor fixes, CI should build

This commit is contained in:
Yiorgis Gozadinos 2026-05-14 15:41:57 +03:00
parent 519afe6709
commit 57f273e000
No known key found for this signature in database
7 changed files with 30 additions and 6 deletions

View file

@ -66,6 +66,8 @@ jobs:
key: huggingface-${{ runner.os }}-qwen-tokenizer-v1
- name: Pre-download tokenizer
run: uv run python -c "from transformers import AutoTokenizer; AutoTokenizer.from_pretrained('Qwen/Qwen3-Embedding-0.6B')"
- name: Pre-download cross-encoder test model
run: uv run python -c "from sentence_transformers import CrossEncoder; CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')"
- name: Run tests with coverage
run: uv run pytest -m "not integration" --cov=haiku --cov-report=xml
- name: Upload coverage to Codecov

View file

@ -58,6 +58,7 @@ async def download_models(
model_name = config.embeddings.model.name
yield DownloadProgress(model=model_name, status="start")
# Wrap in lambda: ty loses ParamSpec inference on third-party __init__.
await asyncio.to_thread(lambda: SentenceTransformer(model_name))
yield DownloadProgress(model=model_name, status="done")
except ImportError:

View file

@ -71,7 +71,12 @@ def get_reranker(config: AppConfig = Config) -> RerankerBase | None:
try:
from haiku.rag.reranking.cross_encoder import CrossEncoderReranker
return CrossEncoderReranker(config.reranking.model.name)
name = config.reranking.model.name
if not name:
raise ValueError(
"cross-encoder reranker requires name in reranking.model"
)
return CrossEncoderReranker(name)
except ImportError: # pragma: no cover
return None

View file

@ -33,8 +33,7 @@ class CrossEncoderReranker(RerankerBase):
return []
documents = [chunk.content for chunk in chunks]
loop = asyncio.get_running_loop()
rankings = await loop.run_in_executor(
None, lambda: self._reranker.rank(query, documents, top_k=top_n)
rankings = await asyncio.to_thread(
lambda: self._reranker.rank(query, documents, top_k=top_n)
)
return [(chunks[r["corpus_id"]], float(r["score"])) for r in rankings]

View file

@ -1,3 +1,5 @@
import asyncio
try:
from transformers import (
AutoModel, # pyright: ignore[reportMissingImports]
@ -32,6 +34,8 @@ class JinaLocalReranker(RerankerBase): # pragma: no cover
documents = [chunk.content for chunk in chunks]
results = self._reranker.rerank(query, documents, top_n=top_n)
results = await asyncio.to_thread(
lambda: self._reranker.rerank(query, documents, top_n=top_n)
)
return [(chunks[r["index"]], float(r["relevance_score"])) for r in results]

View file

@ -1,3 +1,5 @@
import asyncio
from mxbai_rerank import MxbaiRerankV2 # pyright: ignore[reportMissingImports]
from haiku.rag.config import Config
@ -22,7 +24,9 @@ class MxBAIReranker(RerankerBase):
documents = [chunk.content for chunk in chunks]
results = self._client.rank(query=query, documents=documents, top_k=top_n)
results = await asyncio.to_thread(
lambda: self._client.rank(query=query, documents=documents, top_k=top_n)
)
reranked_chunks = []
for result in results:
original_chunk = chunks[result.index]

View file

@ -126,6 +126,15 @@ class TestGetReranker:
with pytest.raises(ValueError, match="vLLM reranker requires base_url"):
get_reranker(config)
def test_cross_encoder_provider_without_name_raises_error(self):
config = AppConfig(
reranking=RerankingConfig(
model=ModelConfig(provider="cross-encoder", name="")
)
)
with pytest.raises(ValueError, match="cross-encoder reranker requires name"):
get_reranker(config)
@pytest.mark.parametrize(
"provider, model_name, class_module, class_name, extra_model_kwargs, expected_attrs, env_vars",
[