Inspiration
In the real world, creativity rarely comes from one person working alone. It comes from an idea passing through many perspectives, each one pushing back and adding something the others couldn't see. Ask a single AI for creative ideas, though, and you get one point of view, and usually the obvious answer.
We turned that into a hypothesis: if we build AI agents that see the world differently, and make them argue, negotiate and replace each other, will they come up with more creative ideas than one model on its own? Oddtown is our experiment. Its agent design starts from Generative Agents (Park et al.) and adds the things we thought creativity needs: disagreement, scarcity and turnover.
What it does
You type a deliberately boring idea, like "a coffee subscription." Six AI characters move into an isometric town and argue it into something better.
- Built to disagree. Every character is a point in a six-axis personality space: how far ahead they think, how they feel about technology, what scale they care about, how social they are, how much risk they take, and gut versus logic. The cast is spread out on purpose, because distance in that space becomes disagreement. Each one also has loves, hates and a red line they never cross.
- Real negotiation. Characters twist, merge, back, trash and pitch versions of the idea, peer to peer. Each can back only two ideas at a time, in public, and a merge needs both sides to agree.
- Turnover. Every character has a lifespan. When one dies, three random survivors design its replacement (one proposes, two refine) for the emptiest corner of the personality space, so the town never settles into agreement.
- A verdict you can audit. The run ends with the three ideas that still have the most living backers. Each comes with its strongest objection from a rival faction as a minority report, shown next to what a single LLM said for the same seed.
You watch it all live: letters fly between houses, replies come back stamped "Yes!" or "Boooo!", a news ticker narrates every twist and death, an idea tree traces every version's lineage, and any run can be replayed.
How we built it
- AGNTCY: every character is its own process. Characters find each other in the AGNTCY Directory, where each persona is an OASF record that newcomers register at runtime, and they talk peer to peer over SLIM. Transport and registry sit behind small adapters, so the same agent code also runs on plain HTTP.
- No central decision-maker: a FastAPI world service starts runs, injects seeds and constraints, and spawns newcomers, but never decides anything. When a character crashes, the first peer whose message bounces notices it and runs the replacement.
- The agent brain (Python, asyncio): each character batches its inbox and answers everything in one structured LLM call. It has a memory stream ranked by recency, relevance and self-rated importance, plus a per-peer record of what actually happened between two characters. Reflection turns memories into impressions and an agenda, and replies can carry the character's own version of an idea, credited to them. Every mechanism can be switched off for experiments.
- Models: each persona names its own model: big-pickle on OpenCode Zen, a local Ollama model, or Claude. A mock mode runs the whole town with no API key.
- Observer and UI: a one-way event stream into SQLite drives a React + react-three-fiber city built on KayKit models, a d3 idea tree, and a results view. Live view and replay run the same code.
- Research harness: plays whole runs against the real platform and scores them from the event log, so we could test our hypothesis rather than just assert it.
Challenges we ran into
- Agents forgot each other. With only the top memories in view, a rejection from three turns earlier vanished, and characters re-pitched the same people again and again. A per-peer relationship record fixed it.
- Replacements became clones. Designers wrote newcomers in their own image. Now they see every name already used and the emptiest corner of trait space, and code checks drafts for overlap with everyone who has lived.
- Towns went extinct. A designer that died with work queued dropped it, and one pilot town ended with nobody left. Dying characters now finish their design work, and the last one alive designs its own successor.
- Exploring beat committing. Once characters reasoned before acting, they built more but endorsed less, which thinned out the finalists. Every turn now shows the town's current standing.
- Distributed edge cases. Two peers could both notice the same crash and both spawn a replacement. One dead peer could stall a whole SLIM broadcast. The Directory hiccupped with many agents at once. Atomic deletes, per-send sessions and retries fixed them.
Accomplishments that we're proud of
- A fully decentralized town: real independent agents on AGNTCY, peer-to-peer messaging, runtime discovery, and crash recovery with no supervisor.
- We measured our hypothesis instead of only claiming it. With the same cast, seed, model and time budget, our mechanisms raised the share of twists that build on someone else's idea from 22% to 54%. Re-pitching someone who had already said no fell from 0.24 to 0.03 per message. Shared words between a newcomer and an earlier character dropped from 18.7 to 3.1. These are single runs on one local model, so we treat only the large effects as signal.
- Characters that sound like people negotiating. Marguerite, a lighthouse keeper who hates subscriptions, accepted a tenants' organizer's tin-refill co-op: "If the drinkers hold the tiller, the tin won't rust in a warehouse somewhere."
- A UI that makes multi-agent disagreement watchable and replayable, plus over 100 automated tests covering three lanes built in parallel.
What we learned
- Creativity came from mechanics, not instructions. Telling agents to "be creative" did little. Changing what they could remember, and what a single message let them do, changed how they behaved.
- Having the model write its reasoning before it picks an action made characters noticeably more open to other ideas.
- Scarcity and turnover matter. Without limited votes, agreement is free. Without deaths, one viewpoint owns the idea.
- Distributed agents fail in distributed ways, so crash handling has to live in the agents themselves.
What's next for Oddtown
- A diversity index: the average trait distance between living characters, to dial disagreement up or down and test whether more distance really means more creativity.
- A compute-matched baseline: one model iterating with the same token budget as the town, for a fairer comparison.
- More throughput, so 12-character towns get enough turns for ideas to travel.
- Model-judged idea quality next to our behavioral metrics.
- Reading the room: a stance check on each reply, and analysis that finds rival blocs, unlikely allies and characters who switch sides.
Built With
- a2a
- agntcy
- agntcy-directory
- agntcy-slim
- asyncio
- d3.js
- docker
- fastapi
- httpx
- motion
- pydantic
- pytest
- python
- react
- react-three-fiber
- sqlite
- three.js
- typescript
- vite
- vitest
- websockets
Log in or sign up for Devpost to join the conversation.