Skip to content

Commit 9f4df77

Browse files
committed
Reject unsupported agentic query filters
1 parent e424064 commit 9f4df77

4 files changed

Lines changed: 40 additions & 7 deletions

File tree

nemo_retriever/src/nemo_retriever/cli/query/app.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
silence_noisy_libraries,
2323
)
2424
from nemo_retriever.common.vdb.records import RetrievalHit
25+
from nemo_retriever.query.filters import has_query_filters
2526
from nemo_retriever.query.options import (
2627
QueryAgenticOptions,
2728
QueryEmbedOptions,
@@ -226,8 +227,16 @@ def _local_command(
226227
try:
227228
reranker_api_key = _api_key_from_env_option(reranker_api_key_env) if reranker_invoke_url else None
228229
effective_retrieval_mode = _query_retrieval_mode(ctx, retrieval_mode, hybrid)
230+
filters = _filter_options(
231+
source_id=source_id,
232+
source=source,
233+
page_number=page_number,
234+
where=where,
235+
)
229236

230237
if agentic:
238+
if has_query_filters(filters):
239+
raise ValueError("--source-id, --source, --page-number, and --where are not supported with --agentic.")
231240
request = QueryRequest(
232241
query=query,
233242
retrieval=_retrieval_options(
@@ -278,12 +287,7 @@ def _request() -> QueryRequest:
278287
content_types=content_types,
279288
retrieval_mode=effective_retrieval_mode,
280289
),
281-
filters=_filter_options(
282-
source_id=source_id,
283-
source=source,
284-
page_number=page_number,
285-
where=where,
286-
),
290+
filters=filters,
287291
embed=QueryEmbedOptions(
288292
embed_invoke_url=embed_invoke_url,
289293
embed_model_name=embed_model_name,

nemo_retriever/src/nemo_retriever/query/filters.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,11 @@ def build_query_where_clause(options: QueryFilterOptions) -> str | None:
106106
return " AND ".join(clauses)
107107

108108

109+
def has_query_filters(options: QueryFilterOptions) -> bool:
110+
"""Return whether any query filter option is set."""
111+
return build_query_where_clause(options) is not None
112+
113+
109114
def query_filter_payload(options: QueryFilterOptions) -> dict[str, Any]:
110115
"""Return the public service query filter payload for non-empty fields."""
111116
payload: dict[str, Any] = {}

nemo_retriever/tests/test_query_filters.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import pytest
88

9-
from nemo_retriever.query.filters import build_query_where_clause, query_filter_payload
9+
from nemo_retriever.query.filters import build_query_where_clause, has_query_filters, query_filter_payload
1010
from nemo_retriever.query.options import QueryFilterOptions
1111

1212

@@ -56,6 +56,12 @@ def test_advanced_where_is_pass_through_and_combines_with_structured_filters() -
5656
)
5757

5858

59+
def test_has_query_filters_reports_non_empty_options() -> None:
60+
assert not has_query_filters(QueryFilterOptions())
61+
assert has_query_filters(QueryFilterOptions(source_id="docs/a.pdf"))
62+
assert has_query_filters(QueryFilterOptions(where="text = 'alpha'"))
63+
64+
5965
def test_negative_page_filter_is_rejected() -> None:
6066
with pytest.raises(ValueError, match="page_number must be greater than or equal to 0"):
6167
build_query_where_clause(QueryFilterOptions(page_number=-1))

nemo_retriever/tests/test_root_query_cli.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,24 @@ def test_root_query_agentic_requires_llm_model() -> None:
470470
assert "requires --agentic-llm-model" in result.output
471471

472472

473+
def test_root_query_agentic_rejects_filter_flags() -> None:
474+
result = RUNNER.invoke(
475+
cli_main.app,
476+
[
477+
"query",
478+
"hello",
479+
"--agentic",
480+
"--agentic-llm-model",
481+
"nvidia/llama-3.3-nemotron-super-49b-v1.5",
482+
"--source-id",
483+
"docs/a.pdf",
484+
],
485+
)
486+
487+
assert result.exit_code == 1
488+
assert "not supported with --agentic" in result.output
489+
490+
473491
def test_root_query_agentic_plumbs_rerank_into_config(monkeypatch) -> None:
474492
"""`--rerank` with `--agentic` wires the reranker config into AgenticRetrievalConfig
475493
(reranker model + endpoint + backend), so the agent's retrieval backend reranks."""

0 commit comments

Comments
 (0)