"""Use-case registry. Adding a use case is a two-line change: 1. Write ``ix/use_cases/.py`` exporting ``Request(BaseModel)`` (with ``use_case_name``, ``default_model``, ``system_prompt``) and ``(BaseModel)`` with the extraction schema. 2. Add ``"": (Request, )`` to :data:`REGISTRY` below. No import-time side effects in use-case modules — registration is explicit so the load order is obvious and tests can patch the registry cleanly. """ from __future__ import annotations from pydantic import BaseModel from ix.errors import IXErrorCode, IXException from ix.use_cases.bank_statement_header import BankStatementHeader from ix.use_cases.bank_statement_header import Request as BankStatementHeaderRequest REGISTRY: dict[str, tuple[type[BaseModel], type[BaseModel]]] = { "bank_statement_header": (BankStatementHeaderRequest, BankStatementHeader), } def get_use_case(name: str) -> tuple[type[BaseModel], type[BaseModel]]: """Look up a registered use case by name. Raises :class:`IXException` with :attr:`IXErrorCode.IX_001_001` when the name is not in the registry — the offending name is embedded in the ``detail`` for log-scrape. """ try: return REGISTRY[name] except KeyError as exc: raise IXException(IXErrorCode.IX_001_001, detail=name) from exc __all__ = ["REGISTRY", "get_use_case"]