{"slug": "show-hn-quatuor-kick-back-and-watch-4-agents-llm-talk-to-each-other-foss", "title": "Show HN: Quatuor – Kick back and watch 4 agents LLM talk to each other (FOSS)", "summary": "Quatuor, an open-source autonomous conversation simulator, lets users watch four AI personas debate and interact in real time without human intervention. The tool uses a single LLM called with different system prompts and a Director agent to manage turn-taking, supporting scenarios like tabletop RPGs and podcast debates. It requires an OpenRouter API key and runs locally via a desktop app or Node.js.", "body_md": "**Four AI characters. One invisible director. Zero human intervention.**\n\nAn autonomous conversation simulator where four AI personas debate, adventure and interrupt each other in real time — while you sit back and watch.\n\n*The party meets an ancient red dragon — the Game Master sets the scene, and the three adventurers argue their way out, each true to their own personality.*\n\nQuatuor stages a **live group conversation between four AI characters**, each driven by its own system prompt. You pick a scenario, press **Start**, and the loop runs forever:\n\n- 🎬 An invisible fifth agent — the\n**Director**— reads the transcript and decides*who speaks next*, and whether they speak normally or**cut someone off mid-sentence**. - 🗣️ The chosen character receives the shared transcript and improvises its next line, in character.\n- 🔁 The message lands in the chat, and the Director is consulted again. Forever.\n\nThere is no user turn. You're the audience — like overhearing a tabletop session or a podcast that writes itself.\n\n``` php\nflowchart LR\n    T[(Shared transcript)] --> D{{🎬 Director}}\n    D -- \"next_speaker + continue/interrupt\" --> C[🗣️ Character LLM call]\n    C -- new line --> T\n```\n\nUnder the hood it's **one single LLM** called N times with different system prompts — no persistent sessions, just a shared transcript replayed to whoever speaks next. If the Director ever fails to answer valid JSON, a round-robin fallback keeps the show running.\n\nThree presets ship out of the box, each with four hand-tuned personas:\n\n| Scenario | Cast |\n|---|---|\n⚔️ Tabletop RPG (D&D) |\nGame Master 🧙♂️ · Elara the paranoid mage 🧝♀️ · Kaelen the impulsive warrior ⚔️ · Lyra the mischievous rogue 🗡️ |\n🦇 Vampire: The Masquerade |\nStoryteller 🦇 · Victoria the Ventrue schemer 🍷 · Dante the Brujah hothead 🔥 · Luna the Malkavian seer 🃏 |\n🎙️ Podcast Debate |\nArthur the skeptic 🤨 · Beatrice the optimist ✨ · Charles the technophile 🤓 · Diana the everywoman 🎙️ |\n\n*The Prince has summoned the coterie to Elysium: a leaked video threatens the Masquerade. Victoria wants leverage, Dante wants to shake down cops, and Luna speaks in riddles that turn out to be right.*\n\nEvery persona is written with an **anti-stagnation rule**: characters must react to consequences, never repeat a failed action, and keep the story moving instead of looping.\n\n**No Node installed?** Grab `quatuor.exe`\n\nfrom the [latest release](https://github.com/yeme-oss/quatuor_ai/releases/latest) — run it, and it opens in your browser. Put your OpenRouter key in a `.env`\n\nfile next to the exe (or paste it in the app's sidebar).\n\nOtherwise, from source:\n\n```\ngit clone https://github.com/yeme-oss/quatuor_ai.git\ncd quatuor_ai\nnpm install\ncp .env.example .env   # then paste your OpenRouter API key\nnpm run dev            # → http://localhost:3000\n```\n\nYou need an [OpenRouter](https://openrouter.ai/keys) API key. Either put it in `.env`\n\n(`OPENROUTER_API_KEY=sk-or-v1-...`\n\n) or paste it directly in the app's configuration sidebar — it's proxied through the local dev server and never baked into the client bundle.\n\n💸\n\nNote:Quatuor itself is free and open source, but the LLM calls are not — each message consumes credits from your[OpenRouter]account, billed per token by the model you pick. Since the conversation runs forever, keep an eye on your usage (some models on OpenRouter are free-tier, if you want to watch without spending).\n\nAny OpenRouter model works: type its ID in the **Model** field in the top bar.\n\nEverything is editable live from the ⚙️ configuration sidebar:\n\n- 🎯\n**Topic**— rewrite the initial situation and watch the same cast improvise something new. - 👥\n**Characters**— rename them, recolor their bubbles, rewrite their system prompts entirely. - 🎬\n**Director prompt**— change the casting logic itself (interruption frequency, pacing rules...). - ⏩\n**Speed**— from a slow 5s burn to rapid-fire 1.5s exchanges.\n\n*The podcast preset in full swing — Arthur demands evidence, Charles corrects the record, and the typing indicator shows who the Director picked next.*\n\nThe **FR/EN** button in the header switches the entire experience — interface, personas *and* generated dialogue — between English and French.\n\n```\n├── index.html       # Single-page UI\n├── index.css        # All styling\n├── main.js          # Simulation loop, Director logic, DOM rendering\n├── personas.js      # Scenario presets + Director prompt (EN & FR)\n├── i18n.js          # UI strings & runtime prompt templates (EN & FR)\n└── vite.config.js   # Dev server + /api/chat proxy to OpenRouter\n```\n\n*A weekend prototype — deliberately KISS. Priority: fun to watch, not architecture.* 🍿", "url": "https://wpnews.pro/news/show-hn-quatuor-kick-back-and-watch-4-agents-llm-talk-to-each-other-foss", "canonical_source": "https://github.com/yeme-oss/quatuor_ai", "published_at": "2026-07-16 12:46:14+00:00", "updated_at": "2026-07-16 12:55:10.043715+00:00", "lang": "en", "topics": ["artificial-intelligence", "large-language-models", "ai-agents", "ai-tools", "generative-ai"], "entities": ["Quatuor", "OpenRouter", "Game Master", "Elara", "Kaelen", "Lyra", "Victoria", "Dante"], "alternates": {"html": "https://wpnews.pro/news/show-hn-quatuor-kick-back-and-watch-4-agents-llm-talk-to-each-other-foss", "markdown": "https://wpnews.pro/news/show-hn-quatuor-kick-back-and-watch-4-agents-llm-talk-to-each-other-foss.md", "text": "https://wpnews.pro/news/show-hn-quatuor-kick-back-and-watch-4-agents-llm-talk-to-each-other-foss.txt", "jsonld": "https://wpnews.pro/news/show-hn-quatuor-kick-back-and-watch-4-agents-llm-talk-to-each-other-foss.jsonld"}}