Skip to content

Commit 1568402

Browse files
test(eval): cover evaluator compatibility paths
1 parent e0d022a commit 1568402

2 files changed

Lines changed: 112 additions & 0 deletions

File tree

tests/evaluation/test_agent_evaluator.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@
55
# tRPC-Agent-Python is licensed under Apache-2.0.
66
"""Unit tests for agent evaluator (agent_evaluator)."""
77

8+
import json
9+
810
import pytest
911

1012
import trpc_agent_sdk.runners # noqa: F401
1113

1214
from trpc_agent_sdk.evaluation import EvalStatus
1315
from trpc_agent_sdk.evaluation import EvalCaseResult
16+
from trpc_agent_sdk.evaluation import EvalConfig
1417
from trpc_agent_sdk.evaluation import EvalMetricResult
1518
from trpc_agent_sdk.evaluation import EvalSetAggregateResult
1619
from trpc_agent_sdk.evaluation import EvaluateResult
@@ -97,3 +100,55 @@ def test_pass_at_k_delegates(self):
97100
def test_pass_hat_k_delegates(self):
98101
"""Test AgentEvaluator.pass_hat_k delegates to _eval_pass."""
99102
assert AgentEvaluator.pass_hat_k(10, 5, 2) == 0.25
103+
104+
105+
class TestAgentEvaluatorLoadEvalSet:
106+
"""Test suite for loading eval sets from ADK-style path selectors."""
107+
108+
def test_loads_selected_case_from_json_path_suffix(self, tmp_path):
109+
eval_set_path = tmp_path / "cases.evalset.json"
110+
eval_set_path.write_text(
111+
json.dumps({
112+
"eval_set_id": "selector_set",
113+
"name": "Selector set",
114+
"eval_cases": [
115+
{
116+
"eval_id": "case_1",
117+
"conversation": [{
118+
"invocation_id": "invocation_1",
119+
"user_content": {
120+
"role": "user",
121+
"parts": [{"text": "first"}],
122+
},
123+
"final_response": {
124+
"role": "model",
125+
"parts": [{"text": "first response"}],
126+
},
127+
}],
128+
},
129+
{
130+
"eval_id": "case_2",
131+
"conversation": [{
132+
"invocation_id": "invocation_2",
133+
"user_content": {
134+
"role": "user",
135+
"parts": [{"text": "second"}],
136+
},
137+
"final_response": {
138+
"role": "model",
139+
"parts": [{"text": "second response"}],
140+
},
141+
}],
142+
},
143+
],
144+
}),
145+
encoding="utf-8",
146+
)
147+
148+
eval_set = AgentEvaluator._load_eval_set_from_file(
149+
f"{eval_set_path}:case_2",
150+
EvalConfig(),
151+
)
152+
153+
assert eval_set.eval_set_id == "selector_set_case_2"
154+
assert [case.eval_id for case in eval_set.eval_cases] == ["case_2"]

tests/evaluation/test_llm_judge_think.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
from trpc_agent_sdk.evaluation._llm_judge import _JudgeAgent
1818
from trpc_agent_sdk.evaluation._llm_judge import _judge_generation_config
1919
from trpc_agent_sdk.evaluation._llm_judge import _merge_extra_body
20+
from trpc_agent_sdk.types import Content
2021
from trpc_agent_sdk.types import HttpOptions
22+
from trpc_agent_sdk.types import Part
2123

2224

2325
class TestJudgeModelOptionsThinkField:
@@ -143,6 +145,61 @@ def test_generation_config_thinking_config_used_when_think_is_none(self):
143145

144146
class TestJudgeAgentPlanner:
145147

148+
@pytest.mark.asyncio
149+
async def test_judge_agent_collects_final_non_thought_text(self):
150+
class _FakeEvent:
151+
152+
def __init__(self, *, final, content):
153+
self._final = final
154+
self.content = content
155+
156+
def is_final_response(self):
157+
return self._final
158+
159+
events = [
160+
_FakeEvent(
161+
final=False,
162+
content=Content(parts=[Part(text="ignored non-final")]),
163+
),
164+
_FakeEvent(final=True, content=None),
165+
_FakeEvent(
166+
final=True,
167+
content=Content(parts=[
168+
Part(text="hidden reasoning", thought=True),
169+
Part(text=" first "),
170+
Part(text="second"),
171+
]),
172+
),
173+
]
174+
175+
class _FakeLlmAgent:
176+
177+
def __init__(self, **kwargs):
178+
pass
179+
180+
def run_async(self, ctx):
181+
async def _run():
182+
for event in events:
183+
yield event
184+
185+
return _run()
186+
187+
class _FakeInvocationContext:
188+
189+
def __init__(self, **kwargs):
190+
self.run_config = kwargs["run_config"]
191+
192+
with patch("trpc_agent_sdk.evaluation._llm_judge.LlmAgent", _FakeLlmAgent), patch(
193+
"trpc_agent_sdk.evaluation._llm_judge.InvocationContext", _FakeInvocationContext):
194+
judge = _JudgeAgent(
195+
model=object(),
196+
config=None,
197+
system_prompt="sp",
198+
)
199+
response = await judge.get_response("evaluate this response")
200+
201+
assert response == "first\nsecond"
202+
146203
@pytest.mark.asyncio
147204
async def test_judge_agent_closes_its_agent_run(self):
148205
captured = {"closed": False}

0 commit comments

Comments
 (0)