THIRI logo
build.thiri.ai
Solana · Seeker · Cadenza

Lab · Phase 1 · Conductor Agent

Conductor Agent

The Conductor Agent ties together dual MCP servers, the Band studio dashboard, and a CLI for local Csound render. Vibe in natural language → conduct_bandmapConductResultToStudioModules → hydrate localhost:5173/bandrender_csound_wav.

Meet THIRI — your personified conductor. Chat in Plan, Compose, or Cron modes at localhost:5173/conductor with optional ElevenLabs voice.

Try it

  • Cursor: install skill THIRI/lab/skills/thiri-conductor-agent/SKILL.md~/.cursor/skills/thiri-conductor-agent/SKILL.md
  • CLI: cd thiri-mcp && npm run conductor:vibe -- "gospel ballad in F minor"
  • Dashboard: npm run dev:studiolocalhost:5173/bandConductor Chat + Vibe Conduct
  • Conductor tab: localhost:5173/conductor — chat + ElevenLabs voice

Conductor Chat + ElevenLabs voice

Natural-language chat with rule-based intent routing (conduct, analyze, voicing, reharmonize). Agent responses can auto-play via ElevenLabs TTS — paste key in panel or set VITE_ELEVENLABS_API_KEY locally. Never commit keys.

Dual MCP (Conductor Agent)

{
  "mcpServers": {
    "thiri": {
      "command": "npx",
      "args": ["-y", "@bluesprincemedia/thiri-mcp"],
      "env": { "THIRI_API_KEY": "sk_live_…" }
    },
    "thiri-conductor": {
      "command": "npx",
      "args": ["-y", "@bluesprincemedia/thiri-mcp", "thiri-conductor-mcp"],
      "env": { "THIRI_API_KEY": "sk_live_…" }
    }
  }
}

Optional thiri-composition for Composition IR + fluidsynth preview. See agent recipes.

Vibe compose loop

  1. User prompt — e.g. "dark jazz swing in C minor"
  2. conduct_band → lanes (harmony, pattern, bass, drums)
  3. mapConductResultToStudioModules → studio routes + skills
  4. Open Band with conduct URL params · tweak in browser Csound WASM
  5. build_csound_scorerender_csound_wavplay_audio
  6. Iterate with user feedback

Smoke proof JSON

{
  "slug": "conductor-agent",
  "version": "0.2.0",
  "generatedAt": "2026-06-19T18:00:00Z",
  "commit": "local",
  "tests": {
    "conductorMcpSmoke": "pass",
    "conductorAgentCli": "pass",
    "studioBuild": "pass",
    "lastRun": "2026-06-19T18:00:00Z"
  },
  "artifacts": {
    "skill": "THIRI/lab/skills/thiri-conductor-agent/SKILL.md",
    "cli": "thiri-mcp/conductor-agent.mjs",
    "npmScript": "npm run conductor:vibe",
    "chatPanel": "ConductorChatPanel @ localhost:5173/band | /conductor",
    "vibePanel": "VibeConductPanel @ localhost:5173/band",
    "handlers": "packages/core/src/lib/conductorChatHandlers.ts",
    "lastRenderArtifact": "~/.thiri/conductor-last.json"
  },
  "modes": {
    "plan": {
      "ui": "gold outline, PLAN badge",
      "api": [
        "POST /v2/analyze",
        "POST /v2/resolve",
        "POST /v2/voicing",
        "POST /v2/reharmonize"
      ],
      "sessionApply": "manual Apply to session button",
      "elevenLabs": "plan summaries"
    },
    "compose": {
      "ui": "burgundy pulse, COMPOSE badge",
      "api": [
        "POST /v2/conduct"
      ],
      "sessionApply": "immediate BandSession hydrate",
      "elevenLabs": "conduct summary + listen cues",
      "render": "npm run conductor:vibe -- \"…\" --play"
    },
    "cron": {
      "ui": "teal pulse, CRON badge",
      "scheduler": "in-browser setInterval (tab must stay open)",
      "intervalsMinutes": [
        1,
        5,
        15,
        30
      ],
      "humanGate": true
    }
  },
  "workflow": {
    "plan": [
      "handlePlanMessage(user text)",
      "THIRI theory endpoints (no conduct)",
      "optional Apply to session → BandSession progression/key/bpm"
    ],
    "compose": [
      "handleComposeMessage(vibe prompt)",
      "conduct_band → mapConductResultToStudioModules",
      "hydrate BandSession + lane deep-links",
      "build_csound_score → render_csound_wav → play_audio"
    ]
  },
  "env": {
    "THIRI_API_KEY": "required — proof panel or VITE_THIRI_API_KEY",
    "VITE_ELEVENLABS_API_KEY": "optional — Conductor Chat TTS",
    "VITE_THIRI_VOICE_ID": "optional — ElevenLabs voice override"
  },
  "notes": "Run: cd thiri-mcp && npm run test:conductor && cd ../THIRI/production/thiri-studio-local && npm run build && npm run dev:studio"
}

Run: cd thiri-mcp && npm run test:conductor · node conductor-agent.mjs "gospel ballad in F minor" --no-render (needs THIRI_API_KEY for live conduct)