Fix caller lineup never loading and add Wellspring cult callers
The lineup fix and the new characters both land in main.py, so they share a commit rather than being split artificially. Lineup fix — populate_backgrounds() was reachable only through POST /api/session/reset, so taking calls without hitting reset left session.caller_backgrounds empty for a whole show. Every caller got a hollow prompt, collapsed into generic relationship filler, and Silas lost his lore. Now start_call populates on demand, get_caller_prompt raises EmptyCallerBackgroundError instead of emitting an empty prompt, /api/callers reports lineup readiness to a header badge, and cross-episode topic dedup widened from 2 shows to 10. Wellspring callers — Doyle as the anchor defector plus a six-member pool, grouped by new frontmatter fields (group, group_lead, group_weight, register, explicitness). A faction is capped at one caller per show, with a 15% roll for two pairing the lead with one other member. group_weight lets an anchor carrying an arc get slots faster than texture characters. Also detects model refusals, which arrive as ordinary 200s and previously reached air as broken-character text or dead silence. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,25 @@
|
||||
from backend.main import get_caller_prompt
|
||||
import pytest
|
||||
|
||||
from backend.main import EmptyCallerBackgroundError, get_caller_prompt
|
||||
|
||||
|
||||
def test_empty_background_raises_instead_of_hollow_prompt():
|
||||
"""A hollow prompt still generates dialog — the model invents generic
|
||||
relationship filler and regulars lose their lore. Fail loudly instead."""
|
||||
with pytest.raises(EmptyCallerBackgroundError):
|
||||
get_caller_prompt({})
|
||||
|
||||
|
||||
def test_background_missing_every_identity_field_raises():
|
||||
caller = {"voice": "Sebastian", "age": 52, "location": "Terlingua"}
|
||||
with pytest.raises(EmptyCallerBackgroundError):
|
||||
get_caller_prompt(caller)
|
||||
|
||||
|
||||
def test_partial_background_still_builds():
|
||||
"""A name alone is enough to reach the regulars lookup, so don't block it."""
|
||||
prompt = get_caller_prompt({"name": "Silas"})
|
||||
assert "Silas" in prompt
|
||||
|
||||
|
||||
def test_prompt_includes_identity_and_situation():
|
||||
|
||||
Reference in New Issue
Block a user