Skip to content

Commit f68cd43

Browse files
authored
refactor(docs): describe reranker model overrides (#153)
1 parent 10eb779 commit f68cd43

File tree

6 files changed

+34
-2
lines changed

6 files changed

+34
-2
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ uv run load-data --dense-model my-dense --sparse-model my-sparse
6666
uv run mcp-server --dense-model my-dense --sparse-model my-sparse
6767
```
6868

69+
Cross-encoder reranking defaults to `cross-encoder/ms-marco-MiniLM-L-6-v2`.
70+
Set `RERANKER_MODEL` or pass `--reranker-model` to point at a different model:
71+
72+
```bash
73+
uv run mcp-server --reranker-model sentence-transformers/ms-marco-mini
74+
```
75+
6976
## Docker
7077
A Dockerfile builds a GPU-enabled image based on
7178
`nvidia/cuda:12.4.1-cudnn-devel-ubuntu22.04` using `uv` for dependency

mcp_plex/server/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ async def ensure_reranker(self) -> CrossEncoder | None:
170170
return self._reranker
171171
try:
172172
reranker = await asyncio.to_thread(
173-
CrossEncoder, "cross-encoder/ms-marco-MiniLM-L-6-v2"
173+
CrossEncoder, self.settings.reranker_model
174174
)
175175
except Exception as exc:
176176
logger.warning(

mcp_plex/server/cli.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ def main(argv: list[str] | None = None) -> None:
5656
default=settings.sparse_model,
5757
help="Sparse embedding model name (env: SPARSE_MODEL)",
5858
)
59+
parser.add_argument(
60+
"--reranker-model",
61+
default=settings.reranker_model,
62+
help="Cross-encoder reranker model name (env: RERANKER_MODEL)",
63+
)
5964
args = parser.parse_args(argv)
6065

6166
env_transport = os.getenv("MCP_TRANSPORT")
@@ -105,6 +110,7 @@ def main(argv: list[str] | None = None) -> None:
105110

106111
settings.dense_model = args.dense_model
107112
settings.sparse_model = args.sparse_model
113+
settings.reranker_model = args.reranker_model
108114

109115
plex_server.run(transport=transport, **run_config.to_kwargs())
110116

mcp_plex/server/config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ class Settings(BaseSettings):
3535
)
3636
cache_size: int = Field(default=128, validation_alias="CACHE_SIZE")
3737
use_reranker: bool = Field(default=True, validation_alias="USE_RERANKER")
38+
reranker_model: str = Field(
39+
default="cross-encoder/ms-marco-MiniLM-L-6-v2",
40+
validation_alias="RERANKER_MODEL",
41+
)
3842
plex_url: AnyHttpUrl | None = Field(default=None, validation_alias="PLEX_URL")
3943
plex_token: str | None = Field(default=None, validation_alias="PLEX_TOKEN")
4044
plex_player_aliases: PlexPlayerAliasMap = Field(

tests/test_server.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,10 @@ def __init__(self, *args, **kwargs):
541541

542542

543543
def test_ensure_reranker_uses_thread_executor(monkeypatch):
544+
monkeypatch.setenv(
545+
"RERANKER_MODEL",
546+
"sentence-transformers/test-cross-encoder",
547+
)
544548
module, Dummy = _reload_server_with_dummy_reranker(monkeypatch)
545549
calls: list[tuple[object, tuple[object, ...], dict[str, object]]] = []
546550

@@ -560,7 +564,7 @@ async def exercise():
560564
assert len(calls) == 1
561565
fn, args, _ = calls[0]
562566
assert fn is Dummy
563-
assert args == ("cross-encoder/ms-marco-MiniLM-L-6-v2",)
567+
assert args == ("sentence-transformers/test-cross-encoder",)
564568
asyncio.run(module.server.close())
565569

566570

tests/test_server_config_additional.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@
55
from mcp_plex.server.config import Settings
66

77

8+
def test_settings_defaults_reranker_model():
9+
settings = Settings()
10+
assert settings.reranker_model == "cross-encoder/ms-marco-MiniLM-L-6-v2"
11+
12+
13+
def test_settings_env_alias_for_reranker_model(monkeypatch):
14+
monkeypatch.setenv("RERANKER_MODEL", "sentence-transformers/custom")
15+
settings = Settings()
16+
assert settings.reranker_model == "sentence-transformers/custom"
17+
18+
819
def test_parse_aliases_rejects_invalid_json():
920
with pytest.raises(ValueError):
1021
Settings._parse_aliases("not json")

0 commit comments

Comments
 (0)