Narrative generation — and leaving local LLMs behind

milestone narrative, llm, media

Atmosphere without a ceiling eventually sounds like Mad Libs. Mid-July’s stake was to raise prose quality for briefings, articles, press prompts, and inbox narratives — while keeping gameplay deterministic and never making wit a pay-to-win lever.

What shipped came in two acts. First, a narrative-generation queue and composer with procedural fallback: opposition briefings, match and news articles, staff-report enrichment, post-match press wording, and weekly or seasonal inbox copy, plus admin Narrative/LLM settings and metrics so operators could see when the model path was live. Gameplay outcomes stayed untouched; the model rewrote presentation only. Days later we replaced in-cluster Ollama with an OpenAI-compatible cloud path (defaulting to a hosted DeepSeek model), raised queue concurrency, removed off-peak gates, and stripped Compose/Kubernetes Ollama from the happy path — admin overrides for base URL, key, and model remaining, procedural fallback still mandatory when keys or calls fail. In simple terms: richer words, same match maths, and no requirement to babysit a local model beside the API.

The challenges were resource reality and provider coupling. Self-hosted inference on constrained nodes looked elegant until memory trim and model pulls competed with the rest of the stack; cloud inference is elastic and externally dependent. We kept fallback as a first-class path rather than a panic button, inasmuch as a silent empty press conference is worse than a solid procedural paragraph. The strength of cloud is quality and operational simplicity; the drawback is secrets, spend, and the need to ignore legacy local model names still lingering in admin state.

Paths not taken included staying on Ollama (or any self-hosted primary) as the long-term default, calling a model synchronously inside request handlers, or letting LLM output influence match or economy outcomes. Local-primary would have kept narrative hostage to cluster RAM; sync calls would punish match publish latency; outcome influence would break fairness we refuse to negotiate.

What it unlocked was a dedicated background lane for copy that later Go workers could own without Nest holding the GPU folklore — and a clearer rule that presentation may use models while competition never does.

← All entries