|
12 | 12 | import pytest |
13 | 13 |
|
14 | 14 | from uipath.eval.evaluators import BaseEvaluator |
| 15 | +from uipath.eval.mocks._types import LLMMockingStrategy |
15 | 16 | from uipath.eval.models import NumericEvaluationResult |
16 | 17 | from uipath.eval.models.evaluation_set import EvaluationSet |
| 18 | +from uipath.eval.models.models import AgentExecution |
17 | 19 | from uipath.eval.runtime import UiPathEvalContext, UiPathEvalRuntime |
18 | 20 | from uipath.runtime.schema import UiPathRuntimeSchema |
19 | 21 |
|
@@ -402,6 +404,64 @@ async def test_run_evaluator_creates_evaluator_span( |
402 | 404 | assert span["attributes"]["evaluator_name"] == "AccuracyEvaluator" |
403 | 405 | assert span["attributes"]["eval_item_id"] == "eval-item-456" |
404 | 406 |
|
| 407 | + @pytest.mark.asyncio |
| 408 | + async def test_run_evaluator_passes_simulation_instructions( |
| 409 | + self, |
| 410 | + mock_trace_manager: MagicMock, |
| 411 | + mock_factory: MagicMock, |
| 412 | + mock_event_bus: MagicMock, |
| 413 | + mock_execution_output: MagicMock, |
| 414 | + ) -> None: |
| 415 | + """Test that trajectory evaluators receive simulation instructions.""" |
| 416 | + context = create_eval_context( |
| 417 | + eval_set="test.json", |
| 418 | + entrypoint="main.py:main", |
| 419 | + ) |
| 420 | + |
| 421 | + runtime = UiPathEvalRuntime( |
| 422 | + context=context, |
| 423 | + factory=mock_factory, |
| 424 | + trace_manager=mock_trace_manager, |
| 425 | + event_bus=mock_event_bus, |
| 426 | + ) |
| 427 | + |
| 428 | + eval_item = MagicMock() |
| 429 | + eval_item.id = "eval-item-with-simulation" |
| 430 | + eval_item.name = "Simulated item" |
| 431 | + eval_item.inputs = {"input": "test"} |
| 432 | + eval_item.expected_agent_behavior = "Agent should use the simulated tool" |
| 433 | + eval_item.mocking_strategy = LLMMockingStrategy( |
| 434 | + prompt="Return mocked API responses for the tool calls", |
| 435 | + tools_to_simulate=[], |
| 436 | + ) |
| 437 | + |
| 438 | + evaluator = MagicMock(spec=BaseEvaluator) |
| 439 | + evaluator.id = "trajectory-evaluator" |
| 440 | + evaluator.name = "TrajectoryEvaluator" |
| 441 | + |
| 442 | + async def capture_agent_execution( |
| 443 | + agent_execution: AgentExecution, |
| 444 | + evaluation_criteria: object, |
| 445 | + ) -> NumericEvaluationResult: |
| 446 | + assert ( |
| 447 | + agent_execution.simulation_instructions |
| 448 | + == "Return mocked API responses for the tool calls" |
| 449 | + ) |
| 450 | + return NumericEvaluationResult(score=1.0) |
| 451 | + |
| 452 | + evaluator.validate_and_evaluate_criteria = AsyncMock( |
| 453 | + side_effect=capture_agent_execution |
| 454 | + ) |
| 455 | + |
| 456 | + await runtime.run_evaluator( |
| 457 | + evaluator=evaluator, |
| 458 | + execution_output=mock_execution_output, |
| 459 | + eval_item=eval_item, |
| 460 | + evaluation_criteria=None, |
| 461 | + ) |
| 462 | + |
| 463 | + evaluator.validate_and_evaluate_criteria.assert_awaited_once() |
| 464 | + |
405 | 465 | @pytest.mark.asyncio |
406 | 466 | async def test_multiple_evaluators_create_multiple_spans( |
407 | 467 | self, |
|
0 commit comments