Turn-taking in my multi-agent voice game was solvable. Giving the agents a shared, accurate memory was the real fight — and I’m ~80% there
I’ve been building a voice social-deduction game (werewolf-style): several AI agents playing roles alongside a human, each on its own realtime model session. Turn-taking I’ve basically solved — a central conductor owns whose turn it is, one agent speaks at a time, no free-for-all. The harder problem was context: separate sessions share zero memory, so out of the box the agents are individually coherent but collectively amnesiac. Someone gets accused and answers something unrelated, because they never “heard” it.
What I’ve landed on, and where I’m still stuck:
Dumping the full transcript into each agent made it worse. They fixate on the wrong lines and lose the thread — the classic long-context failure. Capacity isn’t comprehension.
What worked far better: a cheap side-model extracts structured claims after each turn — who said they were where, who accused whom, who contradicted an earlier statement — into a single shared state object. Before each agent speaks, I refresh its whole system prompt with a rendered view of that state. Hidden-role agents get an asymmetric view (the werewolves see packmate info the villagers don’t). This gives them a shared, consistent picture without every session drowning in raw history. Discrepancy detection (X said the Mill on turn 3, the Forge on turn 7) falls out of it for free.
The wall I’ve hit: structured extraction flattens the conversation to facts, and in a deduction game the facts aren’t the point — the subtext is. Sarcasm, a bluff, an implied accusation, someone going suspiciously quiet — all of that gets compressed out. The agents reason accurately over a flattened transcript and miss the social layer that makes deduction actually interesting. Facts: solved. Social nuance: not.
And the stubborn tail is still audio. Two that cost me days: mic feedback bleeding into the sessions and truncating responses mid-sentence, and a nasty one where closing an eliminated agent’s socket tore down the realtime subscription that was driving turn dispatch — so the whole loop silently died after the first elimination. Real-time voice punishes every one of these audibly; there’s no hiding a bug behind a spinner.
For people doing multi-agent: how are you preserving the social layer of a conversation — tone, implication, evasion — when you compress history into structured state? Everything I’ve tried keeps the facts and loses the subtext, and I can’t tell if that’s a prompt problem, an extraction-schema problem, or just the wrong abstraction.