Skip to content

Commit 2feab75

Browse files
mathurkChibi Vikramclaude
authored
fix: remove ConfigurableRuntimeFactory, read settings from schema.metadata (#1164)
Co-authored-by: Chibi Vikram <[email protected]> Co-authored-by: Claude Opus 4.5 <[email protected]>
1 parent f151a87 commit 2feab75

File tree

3 files changed

+46
-371
lines changed

3 files changed

+46
-371
lines changed

src/uipath/_cli/_evals/_configurable_factory.py

Lines changed: 0 additions & 167 deletions
This file was deleted.

src/uipath/_cli/_evals/_runtime.py

Lines changed: 46 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@
6666
from ...eval.models.models import AgentExecution, EvalItemResult
6767
from .._utils._eval_set import EvalHelpers
6868
from .._utils._parallelization import execute_parallel
69-
from ._configurable_factory import ConfigurableRuntimeFactory
7069
from ._eval_util import apply_input_overrides
7170
from ._evaluator_factory import EvaluatorFactory
7271
from ._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

Comments
 (0)