Skip to content

datarobot_genai.dragent.eval.scorer_factory

scorer_factory

Build moderation OOTB scorers from NAT EvalBuilder judge LLMs.

Each custom NAT evaluator plugin should stay thin (config + evaluate_item). This module centralizes how a workflow llm_name is resolved and mapped onto the same scorer types used by moderation_config.yaml OOTB guards.

LitellmJudgeTarget dataclass

litellm.acompletion model id and kwargs for in-process LLM judges.

Source code in datarobot_genai/dragent/eval/scorer_factory.py
@dataclass(frozen=True)
class LitellmJudgeTarget:
    """``litellm.acompletion`` model id and kwargs for in-process LLM judges."""

    model: str
    completion_kwargs: dict[str, Any]

resolve_langchain_judge_llm async

resolve_langchain_judge_llm(builder: EvalBuilder, llm_name: str) -> object

Resolve llm_name from the eval/workflow config to a LangChain chat model.

Source code in datarobot_genai/dragent/eval/scorer_factory.py
async def resolve_langchain_judge_llm(builder: EvalBuilder, llm_name: str) -> object:
    """Resolve ``llm_name`` from the eval/workflow config to a LangChain chat model."""
    from nat.builder.framework_enum import LLMFrameworkEnum

    return await builder.get_llm(llm_name, wrapper_type=LLMFrameworkEnum.LANGCHAIN)

build_litellm_judge_target async

build_litellm_judge_target(builder: EvalBuilder, llm_name: str) -> LitellmJudgeTarget

Map the workflow judge LLM to a litellm target (agent goal accuracy, etc.).

Source code in datarobot_genai/dragent/eval/scorer_factory.py
async def build_litellm_judge_target(builder: EvalBuilder, llm_name: str) -> LitellmJudgeTarget:
    """Map the workflow judge LLM to a litellm target (agent goal accuracy, etc.)."""
    llm = await resolve_langchain_judge_llm(builder, llm_name)
    model, completion_kwargs = langchain_chat_model_to_litellm(llm)
    return LitellmJudgeTarget(model=model, completion_kwargs=completion_kwargs)

build_faithfulness_evaluator async

build_faithfulness_evaluator(builder: EvalBuilder, llm_name: str) -> FaithfulnessEvaluator

LlamaIndex faithfulness judge (same wiring as OOTBFaithfulnessGuard).

Source code in datarobot_genai/dragent/eval/scorer_factory.py
async def build_faithfulness_evaluator(
    builder: EvalBuilder, llm_name: str
) -> FaithfulnessEvaluator:
    """LlamaIndex faithfulness judge (same wiring as ``OOTBFaithfulnessGuard``)."""
    from datarobot_dome._import_utils import require_extra

    llm = await resolve_langchain_judge_llm(builder, llm_name)

    try:
        from llama_index.core import Settings
        from llama_index.core.evaluation import FaithfulnessEvaluator
    except ImportError as e:
        raise require_extra("llama-index-core", "llm-eval", e) from e

    llamaindex_llm = wrap_langchain_judge_for_llamaindex(llm)
    Settings.llm = llamaindex_llm
    Settings.embed_model = cast(Any, None)
    return FaithfulnessEvaluator()

build_task_adherence_scorer async

build_task_adherence_scorer(builder: EvalBuilder, llm_name: str) -> TaskCompletionMetric

DeepEval task completion judge (same wiring as OOTBTaskAdherenceGuard).

Source code in datarobot_genai/dragent/eval/scorer_factory.py
async def build_task_adherence_scorer(builder: EvalBuilder, llm_name: str) -> TaskCompletionMetric:
    """DeepEval task completion judge (same wiring as ``OOTBTaskAdherenceGuard``)."""
    from datarobot_dome._import_utils import require_extra

    llm = await resolve_langchain_judge_llm(builder, llm_name)

    try:
        from datarobot_dome._deepeval_adapter import ModerationDeepEvalLLM
    except ImportError as e:
        raise require_extra("deepeval", "llm-eval", e) from e
    try:
        from deepeval.metrics import TaskCompletionMetric
    except ImportError as e:
        raise require_extra("deepeval", "llm-eval", e) from e

    deepeval_llm = ModerationDeepEvalLLM(llm)
    return TaskCompletionMetric(model=deepeval_llm, include_reason=True)

build_guideline_adherence_scorer async

build_guideline_adherence_scorer(builder: EvalBuilder, llm_name: str, agent_guideline: str) -> GuidelineEvaluator

LlamaIndex guideline judge (same wiring as OOTBAgentGuidelineAdherence).

Source code in datarobot_genai/dragent/eval/scorer_factory.py
async def build_guideline_adherence_scorer(
    builder: EvalBuilder,
    llm_name: str,
    agent_guideline: str,
) -> GuidelineEvaluator:
    """LlamaIndex guideline judge (same wiring as ``OOTBAgentGuidelineAdherence``)."""
    from datarobot_dome._import_utils import require_extra

    if not agent_guideline.strip():
        raise ValueError("agent_guideline is required for guideline adherence evaluation")

    llm = await resolve_langchain_judge_llm(builder, llm_name)

    try:
        from llama_index.core.evaluation import GuidelineEvaluator
        from llama_index.core.evaluation.guideline import EvaluationData
        from llama_index.core.output_parsers import PydanticOutputParser
    except ImportError as e:
        raise require_extra("llama-index-core", "llm-eval", e) from e

    class _FixedPydanticOutputParser(PydanticOutputParser):
        def format(self, query: str) -> str:
            return query + "\n\n" + self.get_format_string(escape_json=False)

    langchain_llm = wrap_langchain_judge_for_llamaindex(llm)
    return GuidelineEvaluator(
        llm=langchain_llm,
        guidelines=agent_guideline,
        output_parser=_FixedPydanticOutputParser(output_cls=EvaluationData),
    )