Add EasyCom interaction weak-label pipeline
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
"""Tests for DeepSeek interaction-event adjudication without network calls."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
|
||||
from adjudicate_easycom_interaction_events import (
|
||||
OUTPUT_SCHEMA_VERSION,
|
||||
PROMPT_VERSION,
|
||||
_validate_decisions,
|
||||
_validate_resume_rows,
|
||||
build_user_prompt,
|
||||
stratified_limit,
|
||||
)
|
||||
|
||||
|
||||
class AdjudicationTests(unittest.TestCase):
|
||||
def test_prompt_contains_json_and_candidate_context(self) -> None:
|
||||
prompt = build_user_prompt(
|
||||
[{"uid": "u1", "event_type": "backchannel_candidate", "transcription": "Yeah."}],
|
||||
0,
|
||||
)
|
||||
self.assertIn("JSON", prompt)
|
||||
self.assertIn("u1", prompt)
|
||||
self.assertIn("Yeah.", prompt)
|
||||
|
||||
def test_response_requires_exact_uid_set(self) -> None:
|
||||
with self.assertRaisesRegex(ValueError, "mismatch"):
|
||||
_validate_decisions({"items": []}, ["u1"])
|
||||
|
||||
def test_valid_response_is_returned_in_input_order(self) -> None:
|
||||
payload = {
|
||||
"items": [
|
||||
{"uid": "u2", "label": "uncertain", "confidence": "low", "rationale": "Not enough evidence."},
|
||||
{"uid": "u1", "label": "backchannel", "confidence": "high", "rationale": "Floor is retained."},
|
||||
]
|
||||
}
|
||||
actual = _validate_decisions(payload, ["u1", "u2"])
|
||||
self.assertEqual([row["uid"] for row in actual], ["u1", "u2"])
|
||||
|
||||
def test_invalid_label_is_rejected(self) -> None:
|
||||
payload = {
|
||||
"items": [
|
||||
{"uid": "u1", "label": "guess", "confidence": "high", "rationale": "No."}
|
||||
]
|
||||
}
|
||||
with self.assertRaisesRegex(ValueError, "Invalid label"):
|
||||
_validate_decisions(payload, ["u1"])
|
||||
|
||||
def test_resume_rejects_mixed_model(self) -> None:
|
||||
rows = [
|
||||
{
|
||||
"uid": "u1",
|
||||
"schema_version": OUTPUT_SCHEMA_VERSION,
|
||||
"model": "different-model",
|
||||
"prompt_version": PROMPT_VERSION,
|
||||
"passes": 2,
|
||||
}
|
||||
]
|
||||
with self.assertRaisesRegex(ValueError, "different adjudication"):
|
||||
_validate_resume_rows(rows, model="deepseek-v4-flash", passes=2)
|
||||
|
||||
def test_resume_accepts_matching_configuration(self) -> None:
|
||||
rows = [
|
||||
{
|
||||
"uid": "u1",
|
||||
"schema_version": OUTPUT_SCHEMA_VERSION,
|
||||
"model": "deepseek-v4-flash",
|
||||
"prompt_version": PROMPT_VERSION,
|
||||
"passes": 2,
|
||||
}
|
||||
]
|
||||
_validate_resume_rows(rows, model="deepseek-v4-flash", passes=2)
|
||||
|
||||
def test_pilot_limit_is_stratified_and_deterministic(self) -> None:
|
||||
rows = [
|
||||
{
|
||||
"uid": f"{event_type}-{session}-{index}",
|
||||
"event_type": event_type,
|
||||
"session": session,
|
||||
}
|
||||
for event_type in ("backchannel_candidate", "interruption_candidate")
|
||||
for session in ("Session_4", "Session_5")
|
||||
for index in range(3)
|
||||
]
|
||||
first = stratified_limit(rows, 4, seed=2027)
|
||||
second = stratified_limit(rows, 4, seed=2027)
|
||||
self.assertEqual(first, second)
|
||||
self.assertEqual(
|
||||
{(row["event_type"], row["session"]) for row in first},
|
||||
{
|
||||
("backchannel_candidate", "Session_4"),
|
||||
("backchannel_candidate", "Session_5"),
|
||||
("interruption_candidate", "Session_4"),
|
||||
("interruption_candidate", "Session_5"),
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user