{"slug": "gamechat-voice-based-agent-orchestrator-built-in-rust", "title": "Gamechat – Voice-Based Agent Orchestrator Built in Rust", "summary": "Gamechat, a voice-based agent orchestrator built in Rust, allows users to speak commands into a terminal that dispatches tasks to background coding agents like Claude Code or Codex CLI. The tool uses a single low-latency OpenAI Realtime voice loop alongside an async worker pool that manages concurrent agent jobs, with each task slug maintaining its own ordered conversation session. Gamechat is available via a one-line installer that pulls prebuilt binaries for macOS and Linux, requiring only an OpenAI API key and a coding agent on the user's PATH.", "body_md": "Voice-driven supervisor for [Claude Code](https://github.com/anthropics/claude-code) and [Codex](https://github.com/openai/codex). You talk to a low-latency Realtime model in your terminal; whenever you ask for real work, it dispatches a job to a background coding agent and narrates the result when it lands.\n\n```\n🎤 ──▶ OpenAI Realtime (gpt-realtime-2) ──▶ 🔈\n                │\n                │  tool: delegate_to_orchestrator(slug, intent, …)\n                │  tool: sub_agent_progress(slug)\n                ▼\n        OrchestratorJobManager\n                │  one worker task per slug, ordered within a slug,\n                │  concurrent across slugs\n                ▼\n        ┌───────┴────────┐\n   `claude -p`        `codex exec`\n   (Claude Code)      (Codex CLI)\n```\n\nThere is exactly **one realtime voice loop** and an **async worker pool** for background agent jobs. Those are the two halves of the binary.\n\nA single `tokio::select!`\n\nloop that owns:\n\n- a microphone stream (\n`cpal`\n\n, mono, resampled to 24 kHz) - a websocket to the OpenAI Realtime API\n- a playback buffer (\n`cpal`\n\nagain, jittered) - a channel of job-completion events from the worker pool\n\nOn startup it sends a `session.update`\n\nthat registers two tools — `delegate_to_orchestrator`\n\nand `sub_agent_progress`\n\n— and tells the model to use stable snake_case **slugs** for each background task. Reusing a slug continues the same orchestrator conversation; new slugs spawn parallel work. Run `gamechat --print-realtime-config`\n\nto inspect the exact JSON.\n\n`OrchestratorJobManager`\n\nruns in its own task. Behind it:\n\n**One worker per slug.** All sends for`refactor_docs`\n\ngo through the same`OrchestratorSession`\n\n, in order. Different slugs run concurrently in independent sessions.**A** Workers stream snippets into a slug-keyed buffer;`ProgressStore`\n\n.`sub_agent_progress`\n\nqueries it with built-in rate limiting (~5 s) so the model can't poll itself into a loop.**A** with two backends:`Provider`\n\n/`Session`\n\ntrait— spawns`claude`\n\n`claude -p`\n\nper send. First send uses`--name <slug>`\n\n; subsequent sends use`--resume <session_id>`\n\n. Claude Code's server-side prompt cache does the heavy lifting; we don't maintain our own.— spawns`codex`\n\n`codex exec`\n\nper send and tails its output back through the same`SendResult`\n\nshape.\n\nAdding a third backend means implementing `Provider`\n\nand wiring one match arm in `main.rs`\n\n. The voice loop doesn't know which agent is on the other end.\n\n```\ncurl -fsSL https://raw.githubusercontent.com/zdql/gamechat/main/install.sh | sh\n```\n\nPulls the latest prebuilt binary for your platform from [GitHub Releases](https://github.com/zdql/gamechat/releases) and drops it in `~/.local/bin/gamechat`\n\n. Supported platforms: `darwin-arm64`\n\n, `darwin-x86_64`\n\n, `linux-x86_64`\n\n, `linux-arm64`\n\n.\n\nThe installer also prompts (hidden input) for your `OPENAI_API_KEY`\n\nand stores it at `~/.config/gamechat/env`\n\n(mode 0600). `gamechat`\n\nreads that file automatically from any working directory, so `gamechat --realtime`\n\njust works after install. Skip the prompt with `GAMECHAT_NO_PROMPT=1`\n\n.\n\nIf `~/.local/bin`\n\nisn't on your `PATH`\n\n, the installer prints the line to add to your shell profile.\n\n**Pin a version or change install location:**\n\n```\nGAMECHAT_VERSION=v0.1.0 INSTALL_DIR=/usr/local/bin \\\n  sh -c \"$(curl -fsSL https://raw.githubusercontent.com/zdql/gamechat/main/install.sh)\"\ngit clone https://github.com/zdql/gamechat.git && cd gamechat\ncargo install --path .\n```\n\nRequires Rust 1.87+. Linux additionally needs `libasound2-dev`\n\n(and `pkg-config`\n\n) for `cpal`\n\n.\n\n— required. The Realtime API runs on OpenAI regardless of which background agent you use.`OPENAI_API_KEY`\n\n**A coding agent on your**`$PATH`\n\n:[Claude Code](https://github.com/anthropics/claude-code)(`claude`\n\n) — default backend.[Codex CLI](https://github.com/openai/codex)(`codex`\n\n) — pass`--provider codex`\n\n.\n\n- Microphone + speakers.\n\n`gamechat`\n\nlooks for env vars in three places, in order: the process environment, then a `.env`\n\nfile in the current directory or any parent, then `$XDG_CONFIG_HOME/gamechat/env`\n\n(defaults to `~/.config/gamechat/env`\n\n). The installer writes that last file; per-project `.env`\n\ns override it. First match wins per variable.\n\n```\n# Live voice session — talks to Claude Code by default. Ctrl-C to stop.\ngamechat --realtime\n\n# Use Codex instead.\ngamechat --realtime --provider codex --codex-model gpt-5-codex\n\n# One-shot delegation (no audio) — useful for scripting / smoke tests.\ngamechat --once \"summarize the last 5 commits\" --slug summarize_commits\n\n# Dump the session.update JSON without connecting.\ngamechat --print-realtime-config\n```\n\n| Flag | Default | Description |\n|---|---|---|\n`--realtime` |\n— | Live voice loop (mic + speakers). |\n`--once <msg>` |\n— | Single delegation; prints the `VoiceUpdate` JSON. |\n`--provider <claude|codex>` |\n`claude` |\nBackground coding agent. |\n`--model <id>` |\n`gpt-realtime-2` |\nRealtime voice model. |\n`--slug <slug>` |\n`default` |\nBackground task slug (used with `--once` ). |\n`--claude-bin` / `--claude-model` |\nautodetect | Override the `claude` binary or its model. |\n`--codex-bin` / `--codex-model` |\nautodetect | Override the `codex` binary or its model. |\n\n```\ngamechat/\n├── src/\n│   ├── main.rs              # CLI, dotenv, provider wiring\n│   ├── types.rs             # DelegateToOrchestratorArgs, VoiceUpdate\n│   ├── voice_loop/\n│   │   ├── mod.rs           # The select! loop\n│   │   ├── session.rs       # session.update JSON + tool defs\n│   │   └── audio.rs         # cpal input/output, resampling\n│   └── orchestrator/\n│       ├── interface.rs     # Provider / Session traits, public types\n│       ├── jobs.rs          # OrchestratorJobManager + per-slug workers\n│       ├── progress.rs      # ProgressStore + rate-limited snapshots\n│       ├── bridge.rs        # Realtime tool calls ↔ job events\n│       ├── shared.rs        # Logging / stream helpers\n│       ├── claude/          # `claude -p` backend\n│       └── openai/          # `codex exec` backend\n├── install.sh               # curl|sh installer\n└── .github/workflows/release.yml  # cross-platform release builds\n```\n\nMIT.", "url": "https://wpnews.pro/news/gamechat-voice-based-agent-orchestrator-built-in-rust", "canonical_source": "https://github.com/zdql/gamechat", "published_at": "2026-05-26 13:26:06+00:00", "updated_at": "2026-05-26 13:40:22.124788+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "ai-products", "large-language-models", "ai-infrastructure"], "entities": ["Claude Code", "Codex", "OpenAI", "Rust"], "alternates": {"html": "https://wpnews.pro/news/gamechat-voice-based-agent-orchestrator-built-in-rust", "markdown": "https://wpnews.pro/news/gamechat-voice-based-agent-orchestrator-built-in-rust.md", "text": "https://wpnews.pro/news/gamechat-voice-based-agent-orchestrator-built-in-rust.txt", "jsonld": "https://wpnews.pro/news/gamechat-voice-based-agent-orchestrator-built-in-rust.jsonld"}}