diff --git a/openrag/api/routers/admin/presets.py b/openrag/api/routers/admin/presets.py index 8a3ce09cf..b279147cb 100644 --- a/openrag/api/routers/admin/presets.py +++ b/openrag/api/routers/admin/presets.py @@ -1,5 +1,7 @@ """Admin routes for the Phase 14 pipeline preset registry.""" +from typing import get_args + from api.dependencies.auth import require_admin from api.schemas.admin.preset_schemas import ( CreatePresetRequest, @@ -9,6 +11,7 @@ UpdatePresetRequest, ) from core.chunking import chunking_registry +from core.config.indexation_pipeline import IndexationPipelineConfig from core.rerankers.registry import reranker_registry from core.retrieval import retriever_registry from di.providers import get_preset_service @@ -18,6 +21,10 @@ _DEFAULT_RERANKER_PROVIDERS = ["infinity", "openai"] +# Derived from the validated Literal so the exposed options can never drift from +# what IndexationPipelineConfig actually accepts. +_PARSING_STRATEGIES = list(get_args(IndexationPipelineConfig.model_fields["parsing_strategy"].annotation)) + def _registered_or_default(registered: list[str], defaults: list[str]) -> list[str]: """Return registry values, falling back to known defaults before DI imports providers.""" @@ -29,6 +36,7 @@ async def get_preset_options(): """Return available preset strategy choices.""" return PresetOptionsResponse( chunking_strategies=chunking_registry.list_registered(), + parsing_strategies=_PARSING_STRATEGIES, retrieval_types=retriever_registry.list_registered(), reranker_providers=_registered_or_default( reranker_registry.list_registered(), diff --git a/openrag/api/schemas/admin/preset_schemas.py b/openrag/api/schemas/admin/preset_schemas.py index e5bfd516a..00f1bb73f 100644 --- a/openrag/api/schemas/admin/preset_schemas.py +++ b/openrag/api/schemas/admin/preset_schemas.py @@ -83,6 +83,7 @@ class PresetOptionsResponse(BaseModel): """Response body listing allowed preset option values.""" chunking_strategies: list[str] + parsing_strategies: list[str] retrieval_types: list[str] reranker_providers: list[str] diff --git a/tests/integration/api/test_presets.py b/tests/integration/api/test_presets.py index cdde5b53e..e02560ba2 100644 --- a/tests/integration/api/test_presets.py +++ b/tests/integration/api/test_presets.py @@ -61,6 +61,8 @@ def test_preset_options_crud_and_rename(api_client): option_data = options.json() assert "recursive_splitter" in option_data["chunking_strategies"] assert "single" in option_data["retrieval_types"] + # Parsing strategies are derived from IndexationPipelineConfig's Literal. + assert set(option_data["parsing_strategies"]) == {"pymupdf", "marker", "docling"} create_indexation = api_client.post( "/presets/",