Add voice roster validator for caller_gen

This commit is contained in:
2026-04-05 02:22:10 -06:00
parent f56ca3d4bc
commit ade5510bd5
2 changed files with 33 additions and 0 deletions
+9
View File
@@ -36,3 +36,12 @@ def parse_batch_response(raw: str) -> list[CallerIdentity]:
raise ValueError(f"CallerIdentity missing fields: {missing}") raise ValueError(f"CallerIdentity missing fields: {missing}")
result.append(CallerIdentity(**{k: c[k] for k in REQUIRED_FIELDS})) result.append(CallerIdentity(**{k: c[k] for k in REQUIRED_FIELDS}))
return result return result
def resolve_voice(suggestion: str, roster: list[str]) -> str:
"""Map sonnet's voice suggestion to a real voice in the roster.
Case-insensitive exact match; deterministic fallback to first roster entry."""
if not suggestion or not roster:
return roster[0] if roster else ""
lower_map = {v.lower(): v for v in roster}
return lower_map.get(suggestion.lower(), roster[0])
+24
View File
@@ -35,3 +35,27 @@ def test_parse_batch_response_rejects_missing_fields():
bad = '{"callers": [{"name": "Jim"}]}' bad = '{"callers": [{"name": "Jim"}]}'
with pytest.raises(ValueError, match="missing"): with pytest.raises(ValueError, match="missing"):
parse_batch_response(bad) parse_batch_response(bad)
def test_resolve_voice_matches_exact():
from backend.services.caller_gen import resolve_voice
roster = ["Marcus", "Dennis", "Priya", "Edward"]
assert resolve_voice("Marcus", roster) == "Marcus"
def test_resolve_voice_case_insensitive():
from backend.services.caller_gen import resolve_voice
roster = ["Marcus", "Dennis"]
assert resolve_voice("marcus", roster) == "Marcus"
def test_resolve_voice_falls_back_when_no_match():
from backend.services.caller_gen import resolve_voice
roster = ["Marcus", "Dennis"]
# Deterministic fallback: return first from roster
assert resolve_voice("Santiago", roster) == "Marcus"
def test_resolve_voice_empty_suggestion_falls_back():
from backend.services.caller_gen import resolve_voice
assert resolve_voice("", ["Marcus"]) == "Marcus"