6666from ...eval .models .models import AgentExecution , EvalItemResult
6767from .._utils ._eval_set import EvalHelpers
6868from .._utils ._parallelization import execute_parallel
69- from ._configurable_factory import ConfigurableRuntimeFactory
7069from ._eval_util import apply_input_overrides
7170from ._evaluator_factory import EvaluatorFactory
7271from ._models ._evaluation_set import (
@@ -214,8 +213,7 @@ def __init__(
214213 event_bus : EventBus ,
215214 ):
216215 self .context : UiPathEvalContext = context
217- # Wrap the factory to support model settings overrides
218- self .factory = ConfigurableRuntimeFactory (factory )
216+ self .factory : UiPathRuntimeFactoryProtocol = factory
219217 self .event_bus : EventBus = event_bus
220218 self .trace_manager : UiPathTraceManager = trace_manager
221219 self .span_exporter : ExecutionSpanExporter = ExecutionSpanExporter ()
@@ -241,10 +239,6 @@ async def __aexit__(self, *args: Any) -> None:
241239 self .coverage .stop ()
242240 self .coverage .report (include = ["./*" ], show_missing = True )
243241
244- # Clean up any temporary files created by the factory
245- if hasattr (self .factory , "dispose" ):
246- await self .factory .dispose ()
247-
248242 async def get_schema (self , runtime : UiPathRuntimeProtocol ) -> UiPathRuntimeSchema :
249243 schema = await runtime .get_schema ()
250244 if schema is None :
@@ -313,12 +307,13 @@ async def execute(self) -> UiPathRuntimeResult:
313307 logger .info (f"EVAL RUNTIME: Resume mode: { self .context .resume } " )
314308 logger .info ("=" * 80 )
315309
316- # Configure model settings override before creating runtime
317- await self ._configure_model_settings_override ()
310+ # Resolve model settings override from eval set
311+ settings_override = self ._resolve_model_settings_override ()
318312
319313 runtime = await self .factory .new_runtime (
320314 entrypoint = self .context .entrypoint or "" ,
321315 runtime_id = self .execution_id ,
316+ settings = settings_override ,
322317 )
323318 try :
324319 with self ._mocker_cache ():
@@ -796,14 +791,21 @@ def _get_and_clear_execution_data(
796791
797792 return spans , logs
798793
799- async def _configure_model_settings_override (self ) -> None :
800- """Configure the factory with model settings override if specified."""
801- # Skip if no model settings ID specified
794+ def _resolve_model_settings_override (
795+ self ,
796+ ) -> dict [str , Any ] | None :
797+ """Resolve model settings override from evaluation set.
798+
799+ Returns:
800+ Model settings dict to use for override, or None if using defaults.
801+ Settings are passed to factory via settings kwarg.
802+ """
803+ # Skip if no model settings ID specified or using default
802804 if (
803805 not self .context .model_settings_id
804806 or self .context .model_settings_id == "default"
805807 ):
806- return
808+ return None
807809
808810 # Load evaluation set to get model settings
809811 evaluation_set , _ = EvalHelpers .load_eval_set (self .context .eval_set or "" )
@@ -812,7 +814,7 @@ async def _configure_model_settings_override(self) -> None:
812814 or not evaluation_set .model_settings
813815 ):
814816 logger .warning ("No model settings available in evaluation set" )
815- return
817+ return None
816818
817819 # Find the specified model settings
818820 target_model_settings = next (
@@ -828,15 +830,26 @@ async def _configure_model_settings_override(self) -> None:
828830 logger .warning (
829831 f"Model settings ID '{ self .context .model_settings_id } ' not found in evaluation set"
830832 )
831- return
833+ return None
832834
833835 logger .info (
834- f"Configuring model settings override: id='{ target_model_settings .id } ', "
835- f"model_name='{ target_model_settings .model_name } ', temperature='{ target_model_settings .temperature } '"
836+ f"Applying model settings override: model={ target_model_settings .model_name } , temperature={ target_model_settings .temperature } "
836837 )
837838
838- # Configure the factory with the override settings
839- self .factory .set_model_settings_override (target_model_settings )
839+ # Return settings dict with correct keys for factory
840+ override : dict [str , str | float ] = {}
841+ if (
842+ target_model_settings .model_name
843+ and target_model_settings .model_name != "same-as-agent"
844+ ):
845+ override ["model" ] = target_model_settings .model_name
846+ if (
847+ target_model_settings .temperature is not None
848+ and target_model_settings .temperature != "same-as-agent"
849+ ):
850+ override ["temperature" ] = float (target_model_settings .temperature )
851+
852+ return override if override else None
840853
841854 async def execute_runtime (
842855 self ,
@@ -1010,15 +1023,27 @@ async def run_evaluator(
10101023 return result
10111024
10121025 async def _get_agent_model (self , runtime : UiPathRuntimeProtocol ) -> str | None :
1013- """Get agent model from the runtime.
1026+ """Get agent model from the runtime schema metadata.
1027+
1028+ The model is read from schema.metadata["settings"]["model"] which is
1029+ populated by the low-code agents runtime from agent.json.
10141030
10151031 Returns:
10161032 The model name from agent settings, or None if not found.
10171033 """
10181034 try :
1035+ schema = await self .get_schema (runtime )
1036+ if schema .metadata and "settings" in schema .metadata :
1037+ settings = schema .metadata ["settings" ]
1038+ model = settings .get ("model" )
1039+ if model :
1040+ logger .debug (f"Got agent model from schema.metadata: { model } " )
1041+ return model
1042+
1043+ # Fallback to protocol-based approach for backwards compatibility
10191044 model = self ._find_agent_model_in_runtime (runtime )
10201045 if model :
1021- logger .debug (f"Got agent model from runtime: { model } " )
1046+ logger .debug (f"Got agent model from runtime protocol : { model } " )
10221047 return model
10231048 except Exception :
10241049 return None
0 commit comments