Adding Voices

Install and configure voice packages for your agents

Voices give agents the ability to interact with external systems. This guide covers installing official voices and using them in your score.

Install a voice

npx tutti-ai add filesystem
npx tutti-ai add github
npx tutti-ai add playwright
npx tutti-ai add web
npx tutti-ai add sandbox
npx tutti-ai add rag
npx tutti-ai add mcp

The add command installs the npm package and prints setup instructions. Shorthand names resolve to official packages (@tuttiai/<name>); unknown names fall back to the literal package, so tutti-ai add @someone/custom-voice works too.

Official voices at a glance

ShorthandPackageToolsWhat it gives the agent
filesystem@tuttiai/filesystem7Read, write, search, and manage local files
github@tuttiai/github10Issues, PRs, repos, code search via the GitHub API
playwright@tuttiai/playwright12Browser automation (navigate, click, type, screenshot, etc.)
web@tuttiai/web3Search the web, fetch URLs, parse sitemaps
sandbox@tuttiai/sandbox4Execute TypeScript / Python / Bash in a sandboxed subprocess
rag@tuttiai/ragingest / chunk / embed / searchRetrieval-augmented generation over your own docs
mcp@tuttiai/mcpdynamicWrap any MCP server — tools discovered at runtime

Use a voice in your score

import { AnthropicProvider, defineScore } from "@tuttiai/core";
import { FilesystemVoice } from "@tuttiai/filesystem";
import { GitHubVoice } from "@tuttiai/github";

export default defineScore({
  provider: new AnthropicProvider(),
  agents: {
    coder: {
      name: "Coder",
      system_prompt: "You are a developer with file and GitHub access.",
      voices: [new FilesystemVoice(), new GitHubVoice()],
      permissions: ["filesystem", "network"],
    },
  },
});

:::caution You must grant the permissions each voice requires. If you forget, the runtime throws a clear error:

Voice filesystem requires permissions not granted: filesystem

Grant them in your score file:
  permissions: ['filesystem']

:::

Voice configuration

Some voices accept options:

// GitHubVoice with a custom token
new GitHubVoice({ token: process.env.MY_GITHUB_TOKEN })

// PlaywrightVoice with options
new PlaywrightVoice({
  headless: true,
  slowMo: 100,
  timeout: 15000,
})

Environment variables

VoiceEnv varRequired?
FilesystemNo
GitHubGITHUB_TOKENYes (for authenticated API access)
PlaywrightNo (but needs npx playwright install chromium)
WebBRAVE_SEARCH_API_KEY or SERPER_API_KEYYes, for search_web (fetch / sitemap work without one)
SandboxNo (requires TypeScript / Python / Bash runtimes available on PATH)
RAGOPENAI_API_KEY for embeddings; RAG_PG_URL if using the pgvector storeDepends on configured backend
MCPvariesPer the MCP server you wrap — passed through via the env option

Community voices

You can install any npm package that exports a Voice implementation:

npx tutti-ai add @someone/custom-voice

Or install directly:

npm install @someone/custom-voice

See Building a Voice to create your own.

Multiple voices per agent

An agent can have any number of voices. All tools from all voices are merged and made available to the LLM:

{
  fullstack: {
    name: "Full Stack Agent",
    system_prompt: "You can read/write files, manage GitHub issues, and test in the browser.",
    voices: [
      new FilesystemVoice(),
      new GitHubVoice(),
      new PlaywrightVoice(),
    ],
    permissions: ["filesystem", "network", "browser"],
  },
}

Edit this page on GitHub →