| """Cheap sentiment classifier for the message board's UI tint. | |
| One LLM call (default model) every time the board changes — classifies the | |
| recent posts as positive | neutral | negative. The board's background colour | |
| maps to that label client-side. Characters do not see this signal — it's a | |
| user-facing affordance only. | |
| """ | |
| from __future__ import annotations | |
| from backend.factory import get_llm | |
| from game.models import DEFAULT_MODEL_ID | |
| from .world import WorldState | |
| LABELS = ("positive", "neutral", "negative") | |
| def classify_board(world: WorldState) -> str: | |
| if not world.board: | |
| return "neutral" | |
| tail = "\n".join(f"{p.author}: {p.text}" for p in world.board[-10:]) | |
| backend = get_llm(DEFAULT_MODEL_ID) | |
| raw = backend.generate( | |
| system_prompt=( | |
| "Classify the overall mood of the following message-board posts. " | |
| "Reply with exactly one word: positive, neutral, or negative." | |
| ), | |
| user_prompt=tail, | |
| ) | |
| word = (raw or "").strip().lower().split()[0:1] | |
| if word and word[0] in LABELS: | |
| return word[0] | |
| return "neutral" | |