nodmix 2026.5.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11573 -0
- package/LICENSE +21 -0
- package/README.md +486 -0
- package/docs/.i18n/README.md +81 -0
- package/docs/.i18n/ar-navigation.json +18 -0
- package/docs/.i18n/de-navigation.json +18 -0
- package/docs/.i18n/es-navigation.json +18 -0
- package/docs/.i18n/fr-navigation.json +18 -0
- package/docs/.i18n/glossary.ar.json +78 -0
- package/docs/.i18n/glossary.de.json +78 -0
- package/docs/.i18n/glossary.es.json +78 -0
- package/docs/.i18n/glossary.fa.json +78 -0
- package/docs/.i18n/glossary.fr.json +78 -0
- package/docs/.i18n/glossary.id.json +78 -0
- package/docs/.i18n/glossary.it.json +78 -0
- package/docs/.i18n/glossary.ja-JP.json +98 -0
- package/docs/.i18n/glossary.ko.json +78 -0
- package/docs/.i18n/glossary.nl.json +78 -0
- package/docs/.i18n/glossary.pl.json +78 -0
- package/docs/.i18n/glossary.pt-BR.json +78 -0
- package/docs/.i18n/glossary.th.json +78 -0
- package/docs/.i18n/glossary.tr.json +78 -0
- package/docs/.i18n/glossary.uk.json +78 -0
- package/docs/.i18n/glossary.vi.json +78 -0
- package/docs/.i18n/glossary.zh-CN.json +1002 -0
- package/docs/.i18n/glossary.zh-TW.json +78 -0
- package/docs/.i18n/id-navigation.json +18 -0
- package/docs/.i18n/it-navigation.json +18 -0
- package/docs/.i18n/ja-navigation.json +18 -0
- package/docs/.i18n/ko-navigation.json +18 -0
- package/docs/.i18n/pl-navigation.json +18 -0
- package/docs/.i18n/pt-BR-navigation.json +18 -0
- package/docs/.i18n/tr-navigation.json +18 -0
- package/docs/.i18n/translation-workflow.md +111 -0
- package/docs/.i18n/zh-Hans-navigation.json +542 -0
- package/docs/AGENTS.md +36 -0
- package/docs/announcements/bluebubbles-imessage.md +79 -0
- package/docs/assets/install-script.svg +1 -0
- package/docs/assets/macos-onboarding/01-macos-warning.jpeg +0 -0
- package/docs/assets/macos-onboarding/02-local-networks.jpeg +0 -0
- package/docs/assets/macos-onboarding/03-security-notice.png +0 -0
- package/docs/assets/macos-onboarding/04-choose-gateway.png +0 -0
- package/docs/assets/macos-onboarding/05-permissions.png +0 -0
- package/docs/assets/openclaw-logo-text-dark.png +0 -0
- package/docs/assets/openclaw-logo-text-dark.svg +418 -0
- package/docs/assets/openclaw-logo-text.png +0 -0
- package/docs/assets/openclaw-logo-text.svg +418 -0
- package/docs/assets/pixel-lobster.svg +60 -0
- package/docs/assets/pr/quick-settings-browser-tools.png +0 -0
- package/docs/assets/showcase/agents-ui.jpg +0 -0
- package/docs/assets/showcase/bambu-cli.png +0 -0
- package/docs/assets/showcase/codexmonitor.png +0 -0
- package/docs/assets/showcase/gohome-grafana.png +0 -0
- package/docs/assets/showcase/ios-testflight.jpg +0 -0
- package/docs/assets/showcase/oura-health.png +0 -0
- package/docs/assets/showcase/padel-cli.svg +11 -0
- package/docs/assets/showcase/padel-screenshot.jpg +0 -0
- package/docs/assets/showcase/papla-tts.jpg +0 -0
- package/docs/assets/showcase/pr-review-telegram.jpg +0 -0
- package/docs/assets/showcase/roborock-screenshot.jpg +0 -0
- package/docs/assets/showcase/roborock-status.svg +13 -0
- package/docs/assets/showcase/roof-camera-sky.jpg +0 -0
- package/docs/assets/showcase/snag.png +0 -0
- package/docs/assets/showcase/tesco-shop.jpg +0 -0
- package/docs/assets/showcase/wienerlinien.png +0 -0
- package/docs/assets/showcase/wine-cellar-skill.jpg +0 -0
- package/docs/assets/showcase/winix-air-purifier.jpg +0 -0
- package/docs/assets/showcase/xuezh-pronunciation.jpeg +0 -0
- package/docs/assets/sponsors/blacksmith-light.svg +14 -0
- package/docs/assets/sponsors/blacksmith.svg +14 -0
- package/docs/assets/sponsors/convex-light.svg +16 -0
- package/docs/assets/sponsors/convex.svg +16 -0
- package/docs/assets/sponsors/github-light.svg +3 -0
- package/docs/assets/sponsors/github.svg +3 -0
- package/docs/assets/sponsors/nvidia-dark.svg +9 -0
- package/docs/assets/sponsors/nvidia.svg +9 -0
- package/docs/assets/sponsors/openai-light.svg +3 -0
- package/docs/assets/sponsors/openai.svg +3 -0
- package/docs/assets/sponsors/vercel-light.svg +5 -0
- package/docs/assets/sponsors/vercel.svg +5 -0
- package/docs/auth-credential-semantics.md +124 -0
- package/docs/automation/auth-monitoring.md +11 -0
- package/docs/automation/clawflow.md +12 -0
- package/docs/automation/cron-jobs.md +500 -0
- package/docs/automation/cron-vs-heartbeat.md +11 -0
- package/docs/automation/gmail-pubsub.md +11 -0
- package/docs/automation/hooks.md +365 -0
- package/docs/automation/index.md +135 -0
- package/docs/automation/poll.md +12 -0
- package/docs/automation/standing-orders.md +250 -0
- package/docs/automation/taskflow.md +155 -0
- package/docs/automation/tasks.md +374 -0
- package/docs/automation/troubleshooting.md +12 -0
- package/docs/automation/webhook.md +12 -0
- package/docs/brave-search.md +11 -0
- package/docs/channels/access-groups.md +201 -0
- package/docs/channels/ambient-room-events.md +214 -0
- package/docs/channels/bot-loop-protection.md +131 -0
- package/docs/channels/broadcast-groups.md +472 -0
- package/docs/channels/channel-routing.md +162 -0
- package/docs/channels/clickclack.md +138 -0
- package/docs/channels/discord.md +1762 -0
- package/docs/channels/feishu.md +502 -0
- package/docs/channels/googlechat.md +284 -0
- package/docs/channels/group-messages.md +95 -0
- package/docs/channels/groups.md +519 -0
- package/docs/channels/imessage-from-bluebubbles.md +259 -0
- package/docs/channels/imessage.md +813 -0
- package/docs/channels/index.md +64 -0
- package/docs/channels/irc.md +253 -0
- package/docs/channels/line.md +243 -0
- package/docs/channels/location.md +71 -0
- package/docs/channels/matrix-migration.md +370 -0
- package/docs/channels/matrix-presentation.md +77 -0
- package/docs/channels/matrix-push-rules.md +150 -0
- package/docs/channels/matrix.md +921 -0
- package/docs/channels/mattermost.md +542 -0
- package/docs/channels/msteams.md +1042 -0
- package/docs/channels/nextcloud-talk.md +176 -0
- package/docs/channels/nostr.md +253 -0
- package/docs/channels/pairing.md +214 -0
- package/docs/channels/qqbot.md +309 -0
- package/docs/channels/signal.md +400 -0
- package/docs/channels/slack.md +1564 -0
- package/docs/channels/synology-chat.md +187 -0
- package/docs/channels/telegram.md +1107 -0
- package/docs/channels/tlon.md +296 -0
- package/docs/channels/troubleshooting.md +161 -0
- package/docs/channels/twitch.md +431 -0
- package/docs/channels/wechat.md +171 -0
- package/docs/channels/whatsapp.md +739 -0
- package/docs/channels/yuanbao.md +416 -0
- package/docs/channels/zalo.md +253 -0
- package/docs/channels/zalouser.md +199 -0
- package/docs/ci.md +612 -0
- package/docs/clawhub/publishing.md +96 -0
- package/docs/cli/acp.md +370 -0
- package/docs/cli/agent.md +103 -0
- package/docs/cli/agents.md +232 -0
- package/docs/cli/approvals.md +190 -0
- package/docs/cli/backup.md +97 -0
- package/docs/cli/browser.md +307 -0
- package/docs/cli/channels.md +154 -0
- package/docs/cli/clawbot.md +25 -0
- package/docs/cli/commitments.md +90 -0
- package/docs/cli/completion.md +39 -0
- package/docs/cli/config.md +504 -0
- package/docs/cli/configure.md +77 -0
- package/docs/cli/crestodian.md +332 -0
- package/docs/cli/cron.md +281 -0
- package/docs/cli/daemon.md +67 -0
- package/docs/cli/dashboard.md +33 -0
- package/docs/cli/devices.md +204 -0
- package/docs/cli/directory.md +68 -0
- package/docs/cli/dns.md +53 -0
- package/docs/cli/docs.md +73 -0
- package/docs/cli/doctor.md +237 -0
- package/docs/cli/flows.md +52 -0
- package/docs/cli/gateway.md +567 -0
- package/docs/cli/health.md +43 -0
- package/docs/cli/hooks.md +345 -0
- package/docs/cli/index.md +396 -0
- package/docs/cli/infer.md +364 -0
- package/docs/cli/logs.md +65 -0
- package/docs/cli/mcp.md +529 -0
- package/docs/cli/memory.md +183 -0
- package/docs/cli/message.md +317 -0
- package/docs/cli/migrate.md +290 -0
- package/docs/cli/models.md +224 -0
- package/docs/cli/node.md +177 -0
- package/docs/cli/nodes.md +76 -0
- package/docs/cli/onboard.md +245 -0
- package/docs/cli/pairing.md +77 -0
- package/docs/cli/path.md +502 -0
- package/docs/cli/plugins.md +454 -0
- package/docs/cli/policy.md +418 -0
- package/docs/cli/proxy.md +89 -0
- package/docs/cli/qr.md +56 -0
- package/docs/cli/reset.md +39 -0
- package/docs/cli/sandbox.md +208 -0
- package/docs/cli/secrets.md +202 -0
- package/docs/cli/security.md +124 -0
- package/docs/cli/sessions.md +164 -0
- package/docs/cli/setup.md +59 -0
- package/docs/cli/skills.md +102 -0
- package/docs/cli/status.md +45 -0
- package/docs/cli/system.md +89 -0
- package/docs/cli/tasks.md +111 -0
- package/docs/cli/tui.md +89 -0
- package/docs/cli/uninstall.md +44 -0
- package/docs/cli/update.md +242 -0
- package/docs/cli/voicecall.md +204 -0
- package/docs/cli/webhooks.md +117 -0
- package/docs/cli/wiki.md +256 -0
- package/docs/concepts/active-memory.md +856 -0
- package/docs/concepts/agent-loop.md +185 -0
- package/docs/concepts/agent-runtimes.md +243 -0
- package/docs/concepts/agent-workspace.md +230 -0
- package/docs/concepts/agent.md +136 -0
- package/docs/concepts/architecture.md +154 -0
- package/docs/concepts/channel-docking.md +145 -0
- package/docs/concepts/commitments.md +150 -0
- package/docs/concepts/compaction.md +203 -0
- package/docs/concepts/context-engine.md +306 -0
- package/docs/concepts/context.md +199 -0
- package/docs/concepts/delegate-architecture.md +319 -0
- package/docs/concepts/dreaming.md +261 -0
- package/docs/concepts/experimental-features.md +108 -0
- package/docs/concepts/features.md +91 -0
- package/docs/concepts/mantis-slack-desktop-runbook.md +202 -0
- package/docs/concepts/mantis.md +740 -0
- package/docs/concepts/markdown-formatting.md +139 -0
- package/docs/concepts/memory-builtin.md +146 -0
- package/docs/concepts/memory-honcho.md +144 -0
- package/docs/concepts/memory-qmd.md +271 -0
- package/docs/concepts/memory-search.md +166 -0
- package/docs/concepts/memory.md +258 -0
- package/docs/concepts/message-lifecycle-refactor.md +1128 -0
- package/docs/concepts/messages.md +214 -0
- package/docs/concepts/model-failover.md +385 -0
- package/docs/concepts/model-providers.md +715 -0
- package/docs/concepts/models.md +370 -0
- package/docs/concepts/multi-agent.md +619 -0
- package/docs/concepts/oauth.md +198 -0
- package/docs/concepts/openclaw-sdk.md +323 -0
- package/docs/concepts/parallel-specialist-lanes.md +127 -0
- package/docs/concepts/personal-agent-benchmark-pack.md +74 -0
- package/docs/concepts/presence.md +117 -0
- package/docs/concepts/progress-drafts.md +362 -0
- package/docs/concepts/qa-e2e-automation.md +820 -0
- package/docs/concepts/qa-matrix.md +139 -0
- package/docs/concepts/queue-steering.md +90 -0
- package/docs/concepts/queue.md +122 -0
- package/docs/concepts/retry.md +86 -0
- package/docs/concepts/session-pruning.md +104 -0
- package/docs/concepts/session-tool.md +190 -0
- package/docs/concepts/session.md +164 -0
- package/docs/concepts/soul.md +116 -0
- package/docs/concepts/streaming.md +251 -0
- package/docs/concepts/system-prompt.md +310 -0
- package/docs/concepts/timezone.md +47 -0
- package/docs/concepts/typebox.md +309 -0
- package/docs/concepts/typing-indicators.md +88 -0
- package/docs/concepts/usage-tracking.md +66 -0
- package/docs/date-time.md +126 -0
- package/docs/debug/node-issue.md +90 -0
- package/docs/diagnostics/flags.md +138 -0
- package/docs/docs.json +1832 -0
- package/docs/gateway/authentication.md +239 -0
- package/docs/gateway/background-process.md +147 -0
- package/docs/gateway/bonjour.md +303 -0
- package/docs/gateway/bridge-protocol.md +94 -0
- package/docs/gateway/cli-backends.md +420 -0
- package/docs/gateway/config-agents.md +1514 -0
- package/docs/gateway/config-channels.md +945 -0
- package/docs/gateway/config-tools.md +769 -0
- package/docs/gateway/configuration-examples.md +705 -0
- package/docs/gateway/configuration-reference.md +1393 -0
- package/docs/gateway/configuration.md +737 -0
- package/docs/gateway/diagnostics.md +213 -0
- package/docs/gateway/discovery.md +154 -0
- package/docs/gateway/doctor.md +574 -0
- package/docs/gateway/gateway-lock.md +37 -0
- package/docs/gateway/health.md +73 -0
- package/docs/gateway/heartbeat.md +493 -0
- package/docs/gateway/index.md +383 -0
- package/docs/gateway/local-model-services.md +205 -0
- package/docs/gateway/local-models.md +355 -0
- package/docs/gateway/logging.md +149 -0
- package/docs/gateway/multiple-gateways.md +178 -0
- package/docs/gateway/network-model.md +15 -0
- package/docs/gateway/openai-http-api.md +350 -0
- package/docs/gateway/openresponses-http-api.md +347 -0
- package/docs/gateway/openshell.md +316 -0
- package/docs/gateway/opentelemetry.md +404 -0
- package/docs/gateway/operator-scopes.md +111 -0
- package/docs/gateway/pairing.md +207 -0
- package/docs/gateway/prometheus.md +230 -0
- package/docs/gateway/protocol.md +803 -0
- package/docs/gateway/remote-gateway-readme.md +169 -0
- package/docs/gateway/remote.md +280 -0
- package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +146 -0
- package/docs/gateway/sandboxing.md +545 -0
- package/docs/gateway/secrets-plan-contract.md +114 -0
- package/docs/gateway/secrets.md +609 -0
- package/docs/gateway/security/audit-checks.md +127 -0
- package/docs/gateway/security/index.md +1326 -0
- package/docs/gateway/security/secure-file-operations.md +76 -0
- package/docs/gateway/tailscale.md +156 -0
- package/docs/gateway/tools-invoke-http-api.md +169 -0
- package/docs/gateway/troubleshooting.md +772 -0
- package/docs/gateway/trusted-proxy-auth.md +451 -0
- package/docs/help/debugging.md +344 -0
- package/docs/help/environment.md +214 -0
- package/docs/help/faq-first-run.md +867 -0
- package/docs/help/faq-models.md +553 -0
- package/docs/help/faq.md +1975 -0
- package/docs/help/gpt55-codex-agentic-parity-maintainers.md +196 -0
- package/docs/help/gpt55-codex-agentic-parity.md +230 -0
- package/docs/help/index.md +39 -0
- package/docs/help/scripts.md +56 -0
- package/docs/help/testing-live.md +580 -0
- package/docs/help/testing-updates-plugins.md +291 -0
- package/docs/help/testing.md +928 -0
- package/docs/help/troubleshooting.md +424 -0
- package/docs/images/configure-model-picker-unsearchable.png +0 -0
- package/docs/images/feishu-get-group-id.png +0 -0
- package/docs/images/groups-flow.svg +52 -0
- package/docs/images/mobile-ui-screenshot.png +0 -0
- package/docs/index.md +196 -0
- package/docs/install/ansible.md +233 -0
- package/docs/install/azure.md +315 -0
- package/docs/install/bun.md +59 -0
- package/docs/install/clawdock.md +112 -0
- package/docs/install/development-channels.md +135 -0
- package/docs/install/digitalocean.md +174 -0
- package/docs/install/docker-vm-runtime.md +154 -0
- package/docs/install/docker.md +562 -0
- package/docs/install/exe-dev.md +201 -0
- package/docs/install/fly.md +524 -0
- package/docs/install/gcp.md +418 -0
- package/docs/install/hetzner.md +285 -0
- package/docs/install/hostinger.md +98 -0
- package/docs/install/index.md +221 -0
- package/docs/install/installer.md +455 -0
- package/docs/install/kubernetes.md +196 -0
- package/docs/install/macos-vm.md +281 -0
- package/docs/install/migrating-claude.md +165 -0
- package/docs/install/migrating-hermes.md +177 -0
- package/docs/install/migrating.md +137 -0
- package/docs/install/nix.md +112 -0
- package/docs/install/node.md +142 -0
- package/docs/install/northflank.mdx +44 -0
- package/docs/install/oracle.md +218 -0
- package/docs/install/podman.md +210 -0
- package/docs/install/railway.mdx +92 -0
- package/docs/install/raspberry-pi.md +234 -0
- package/docs/install/render.mdx +167 -0
- package/docs/install/uninstall.md +131 -0
- package/docs/install/updating.md +280 -0
- package/docs/logging.md +318 -0
- package/docs/nav-tabs-underline.js +100 -0
- package/docs/network.md +72 -0
- package/docs/nodes/audio.md +215 -0
- package/docs/nodes/camera.md +166 -0
- package/docs/nodes/images.md +77 -0
- package/docs/nodes/index.md +439 -0
- package/docs/nodes/location-command.md +102 -0
- package/docs/nodes/media-understanding.md +469 -0
- package/docs/nodes/talk.md +154 -0
- package/docs/nodes/troubleshooting.md +123 -0
- package/docs/nodes/voicewake.md +93 -0
- package/docs/perplexity.md +11 -0
- package/docs/pi-dev.md +82 -0
- package/docs/pi.md +573 -0
- package/docs/plan/codex-context-engine-harness.md +624 -0
- package/docs/plan/ui-channels.md +284 -0
- package/docs/platforms/android.md +285 -0
- package/docs/platforms/digitalocean.md +12 -0
- package/docs/platforms/index.md +60 -0
- package/docs/platforms/ios.md +283 -0
- package/docs/platforms/linux.md +141 -0
- package/docs/platforms/mac/bundled-gateway.md +79 -0
- package/docs/platforms/mac/canvas.md +128 -0
- package/docs/platforms/mac/child-process.md +72 -0
- package/docs/platforms/mac/dev-setup.md +112 -0
- package/docs/platforms/mac/health.md +39 -0
- package/docs/platforms/mac/icon.md +36 -0
- package/docs/platforms/mac/logging.md +62 -0
- package/docs/platforms/mac/menu-bar.md +93 -0
- package/docs/platforms/mac/peekaboo.md +92 -0
- package/docs/platforms/mac/permissions.md +53 -0
- package/docs/platforms/mac/remote.md +123 -0
- package/docs/platforms/mac/signing.md +52 -0
- package/docs/platforms/mac/skills.md +43 -0
- package/docs/platforms/mac/voice-overlay.md +66 -0
- package/docs/platforms/mac/voicewake.md +73 -0
- package/docs/platforms/mac/webchat.md +54 -0
- package/docs/platforms/mac/xpc.md +66 -0
- package/docs/platforms/macos.md +226 -0
- package/docs/platforms/oracle.md +12 -0
- package/docs/platforms/raspberry-pi.md +13 -0
- package/docs/platforms/windows.md +286 -0
- package/docs/plugins/adding-capabilities.md +133 -0
- package/docs/plugins/admin-http-rpc.md +216 -0
- package/docs/plugins/agent-tools.md +13 -0
- package/docs/plugins/architecture-internals.md +1195 -0
- package/docs/plugins/architecture.md +481 -0
- package/docs/plugins/building-extensions.md +13 -0
- package/docs/plugins/building-plugins.md +330 -0
- package/docs/plugins/bundles.md +310 -0
- package/docs/plugins/cli-backend-plugins.md +310 -0
- package/docs/plugins/codex-computer-use.md +293 -0
- package/docs/plugins/codex-harness-reference.md +409 -0
- package/docs/plugins/codex-harness-runtime.md +247 -0
- package/docs/plugins/codex-harness.md +746 -0
- package/docs/plugins/codex-native-plugins.md +276 -0
- package/docs/plugins/community.md +77 -0
- package/docs/plugins/compatibility.md +164 -0
- package/docs/plugins/dependency-resolution.md +143 -0
- package/docs/plugins/google-meet.md +1737 -0
- package/docs/plugins/hooks.md +459 -0
- package/docs/plugins/install-overrides.md +80 -0
- package/docs/plugins/manage-plugins.md +210 -0
- package/docs/plugins/manifest.md +1359 -0
- package/docs/plugins/memory-lancedb.md +385 -0
- package/docs/plugins/memory-wiki.md +529 -0
- package/docs/plugins/message-presentation.md +473 -0
- package/docs/plugins/oc-path.md +166 -0
- package/docs/plugins/plugin-inventory.md +182 -0
- package/docs/plugins/reference/acpx.md +23 -0
- package/docs/plugins/reference/admin-http-rpc.md +23 -0
- package/docs/plugins/reference/alibaba.md +23 -0
- package/docs/plugins/reference/amazon-bedrock-mantle.md +23 -0
- package/docs/plugins/reference/amazon-bedrock.md +23 -0
- package/docs/plugins/reference/anthropic-vertex.md +19 -0
- package/docs/plugins/reference/anthropic.md +23 -0
- package/docs/plugins/reference/arcee.md +23 -0
- package/docs/plugins/reference/azure-speech.md +23 -0
- package/docs/plugins/reference/bonjour.md +19 -0
- package/docs/plugins/reference/brave.md +23 -0
- package/docs/plugins/reference/browser.md +23 -0
- package/docs/plugins/reference/byteplus.md +19 -0
- package/docs/plugins/reference/canvas.md +19 -0
- package/docs/plugins/reference/cerebras.md +23 -0
- package/docs/plugins/reference/chutes.md +23 -0
- package/docs/plugins/reference/clickclack.md +23 -0
- package/docs/plugins/reference/cloudflare-ai-gateway.md +23 -0
- package/docs/plugins/reference/codex.md +23 -0
- package/docs/plugins/reference/comfy.md +23 -0
- package/docs/plugins/reference/copilot-proxy.md +19 -0
- package/docs/plugins/reference/deepgram.md +23 -0
- package/docs/plugins/reference/deepinfra.md +23 -0
- package/docs/plugins/reference/deepseek.md +23 -0
- package/docs/plugins/reference/diagnostics-otel.md +19 -0
- package/docs/plugins/reference/diagnostics-prometheus.md +19 -0
- package/docs/plugins/reference/diffs.md +19 -0
- package/docs/plugins/reference/discord.md +23 -0
- package/docs/plugins/reference/document-extract.md +23 -0
- package/docs/plugins/reference/duckduckgo.md +23 -0
- package/docs/plugins/reference/elevenlabs.md +23 -0
- package/docs/plugins/reference/exa.md +23 -0
- package/docs/plugins/reference/fal.md +23 -0
- package/docs/plugins/reference/feishu.md +23 -0
- package/docs/plugins/reference/file-transfer.md +19 -0
- package/docs/plugins/reference/firecrawl.md +23 -0
- package/docs/plugins/reference/fireworks.md +23 -0
- package/docs/plugins/reference/github-copilot.md +23 -0
- package/docs/plugins/reference/google-meet.md +23 -0
- package/docs/plugins/reference/google.md +23 -0
- package/docs/plugins/reference/googlechat.md +23 -0
- package/docs/plugins/reference/gradium.md +23 -0
- package/docs/plugins/reference/groq.md +23 -0
- package/docs/plugins/reference/huggingface.md +23 -0
- package/docs/plugins/reference/imessage.md +23 -0
- package/docs/plugins/reference/inworld.md +23 -0
- package/docs/plugins/reference/irc.md +23 -0
- package/docs/plugins/reference/kilocode.md +23 -0
- package/docs/plugins/reference/kimi.md +23 -0
- package/docs/plugins/reference/line.md +23 -0
- package/docs/plugins/reference/litellm.md +23 -0
- package/docs/plugins/reference/llm-task.md +19 -0
- package/docs/plugins/reference/lmstudio.md +23 -0
- package/docs/plugins/reference/lobster.md +19 -0
- package/docs/plugins/reference/matrix.md +23 -0
- package/docs/plugins/reference/mattermost.md +23 -0
- package/docs/plugins/reference/memory-core.md +19 -0
- package/docs/plugins/reference/memory-lancedb.md +23 -0
- package/docs/plugins/reference/memory-wiki.md +23 -0
- package/docs/plugins/reference/microsoft-foundry.md +19 -0
- package/docs/plugins/reference/microsoft.md +19 -0
- package/docs/plugins/reference/migrate-claude.md +19 -0
- package/docs/plugins/reference/migrate-hermes.md +19 -0
- package/docs/plugins/reference/minimax.md +23 -0
- package/docs/plugins/reference/mistral.md +23 -0
- package/docs/plugins/reference/moonshot.md +23 -0
- package/docs/plugins/reference/msteams.md +23 -0
- package/docs/plugins/reference/nextcloud-talk.md +23 -0
- package/docs/plugins/reference/nostr.md +23 -0
- package/docs/plugins/reference/nvidia.md +23 -0
- package/docs/plugins/reference/oc-path.md +23 -0
- package/docs/plugins/reference/ollama.md +23 -0
- package/docs/plugins/reference/open-prose.md +19 -0
- package/docs/plugins/reference/openai.md +23 -0
- package/docs/plugins/reference/opencode-go.md +23 -0
- package/docs/plugins/reference/opencode.md +23 -0
- package/docs/plugins/reference/openrouter.md +23 -0
- package/docs/plugins/reference/openshell.md +19 -0
- package/docs/plugins/reference/perplexity.md +23 -0
- package/docs/plugins/reference/policy.md +23 -0
- package/docs/plugins/reference/qa-channel.md +23 -0
- package/docs/plugins/reference/qa-lab.md +19 -0
- package/docs/plugins/reference/qa-matrix.md +19 -0
- package/docs/plugins/reference/qianfan.md +23 -0
- package/docs/plugins/reference/qqbot.md +23 -0
- package/docs/plugins/reference/qwen.md +23 -0
- package/docs/plugins/reference/runway.md +23 -0
- package/docs/plugins/reference/searxng.md +19 -0
- package/docs/plugins/reference/senseaudio.md +23 -0
- package/docs/plugins/reference/sglang.md +23 -0
- package/docs/plugins/reference/signal.md +23 -0
- package/docs/plugins/reference/skill-workshop.md +23 -0
- package/docs/plugins/reference/slack.md +23 -0
- package/docs/plugins/reference/stepfun.md +23 -0
- package/docs/plugins/reference/synology-chat.md +23 -0
- package/docs/plugins/reference/synthetic.md +23 -0
- package/docs/plugins/reference/tavily.md +23 -0
- package/docs/plugins/reference/telegram.md +23 -0
- package/docs/plugins/reference/tencent.md +23 -0
- package/docs/plugins/reference/tlon.md +23 -0
- package/docs/plugins/reference/together.md +23 -0
- package/docs/plugins/reference/tokenjuice.md +23 -0
- package/docs/plugins/reference/tts-local-cli.md +19 -0
- package/docs/plugins/reference/twitch.md +23 -0
- package/docs/plugins/reference/venice.md +23 -0
- package/docs/plugins/reference/vercel-ai-gateway.md +23 -0
- package/docs/plugins/reference/vllm.md +23 -0
- package/docs/plugins/reference/voice-call.md +23 -0
- package/docs/plugins/reference/volcengine.md +23 -0
- package/docs/plugins/reference/voyage.md +19 -0
- package/docs/plugins/reference/vydra.md +23 -0
- package/docs/plugins/reference/web-readability.md +19 -0
- package/docs/plugins/reference/webhooks.md +23 -0
- package/docs/plugins/reference/whatsapp.md +23 -0
- package/docs/plugins/reference/xai.md +23 -0
- package/docs/plugins/reference/xiaomi.md +23 -0
- package/docs/plugins/reference/zai.md +23 -0
- package/docs/plugins/reference/zalo.md +23 -0
- package/docs/plugins/reference/zalouser.md +24 -0
- package/docs/plugins/reference.md +138 -0
- package/docs/plugins/sdk-agent-harness.md +339 -0
- package/docs/plugins/sdk-channel-ingress.md +137 -0
- package/docs/plugins/sdk-channel-message.md +458 -0
- package/docs/plugins/sdk-channel-plugins.md +762 -0
- package/docs/plugins/sdk-channel-turn.md +580 -0
- package/docs/plugins/sdk-entrypoints.md +333 -0
- package/docs/plugins/sdk-migration.md +949 -0
- package/docs/plugins/sdk-overview.md +501 -0
- package/docs/plugins/sdk-provider-plugins.md +807 -0
- package/docs/plugins/sdk-runtime.md +676 -0
- package/docs/plugins/sdk-setup.md +550 -0
- package/docs/plugins/sdk-subpaths.md +396 -0
- package/docs/plugins/sdk-testing.md +401 -0
- package/docs/plugins/skill-workshop.md +713 -0
- package/docs/plugins/tool-plugins.md +411 -0
- package/docs/plugins/voice-call.md +943 -0
- package/docs/plugins/webhooks.md +192 -0
- package/docs/plugins/zalouser.md +86 -0
- package/docs/prose.md +137 -0
- package/docs/providers/alibaba.md +158 -0
- package/docs/providers/anthropic.md +344 -0
- package/docs/providers/arcee.md +144 -0
- package/docs/providers/azure-speech.md +119 -0
- package/docs/providers/bedrock-mantle.md +211 -0
- package/docs/providers/bedrock.md +414 -0
- package/docs/providers/cerebras.md +130 -0
- package/docs/providers/chutes.md +153 -0
- package/docs/providers/claude-max-api-proxy.md +188 -0
- package/docs/providers/cloudflare-ai-gateway.md +119 -0
- package/docs/providers/comfy.md +362 -0
- package/docs/providers/deepgram.md +184 -0
- package/docs/providers/deepinfra.md +87 -0
- package/docs/providers/deepseek.md +146 -0
- package/docs/providers/ds4.md +309 -0
- package/docs/providers/elevenlabs.md +130 -0
- package/docs/providers/fal.md +204 -0
- package/docs/providers/fireworks.md +144 -0
- package/docs/providers/github-copilot.md +225 -0
- package/docs/providers/glm.md +137 -0
- package/docs/providers/google.md +472 -0
- package/docs/providers/gradium.md +123 -0
- package/docs/providers/groq.md +180 -0
- package/docs/providers/huggingface.md +235 -0
- package/docs/providers/index.md +102 -0
- package/docs/providers/inferrs.md +272 -0
- package/docs/providers/inworld.md +120 -0
- package/docs/providers/kilocode.md +135 -0
- package/docs/providers/litellm.md +234 -0
- package/docs/providers/lmstudio.md +224 -0
- package/docs/providers/minimax.md +505 -0
- package/docs/providers/mistral.md +235 -0
- package/docs/providers/models.md +65 -0
- package/docs/providers/moonshot.md +413 -0
- package/docs/providers/nvidia.md +140 -0
- package/docs/providers/ollama.md +1180 -0
- package/docs/providers/openai.md +1057 -0
- package/docs/providers/opencode-go.md +123 -0
- package/docs/providers/opencode.md +149 -0
- package/docs/providers/openrouter.md +349 -0
- package/docs/providers/perplexity-provider.md +123 -0
- package/docs/providers/qianfan.md +132 -0
- package/docs/providers/qwen.md +332 -0
- package/docs/providers/runway.md +103 -0
- package/docs/providers/senseaudio.md +68 -0
- package/docs/providers/sglang.md +161 -0
- package/docs/providers/stepfun.md +229 -0
- package/docs/providers/synthetic.md +154 -0
- package/docs/providers/tencent.md +130 -0
- package/docs/providers/together.md +141 -0
- package/docs/providers/venice.md +315 -0
- package/docs/providers/vercel-ai-gateway.md +128 -0
- package/docs/providers/vllm.md +383 -0
- package/docs/providers/volcengine.md +199 -0
- package/docs/providers/vydra.md +180 -0
- package/docs/providers/xai.md +560 -0
- package/docs/providers/xiaomi.md +188 -0
- package/docs/providers/zai.md +203 -0
- package/docs/refactor/access.md +9 -0
- package/docs/refactor/acp.md +298 -0
- package/docs/refactor/canvas.md +131 -0
- package/docs/refactor/ingress-core.md +341 -0
- package/docs/reference/AGENTS.default.md +129 -0
- package/docs/reference/RELEASING.md +767 -0
- package/docs/reference/api-usage-costs.md +202 -0
- package/docs/reference/application-modernization-plan.md +208 -0
- package/docs/reference/code-mode.md +757 -0
- package/docs/reference/credits.md +33 -0
- package/docs/reference/device-models.md +50 -0
- package/docs/reference/full-release-validation.md +202 -0
- package/docs/reference/memory-config.md +630 -0
- package/docs/reference/openclaw-sdk-api-design.md +390 -0
- package/docs/reference/prompt-caching.md +358 -0
- package/docs/reference/rich-output-protocol.md +79 -0
- package/docs/reference/rpc.md +43 -0
- package/docs/reference/secretref-credential-surface.md +159 -0
- package/docs/reference/secretref-user-supplied-credentials-matrix.json +663 -0
- package/docs/reference/session-management-compaction.md +461 -0
- package/docs/reference/templates/AGENTS.dev.md +89 -0
- package/docs/reference/templates/AGENTS.md +225 -0
- package/docs/reference/templates/BOOT.md +16 -0
- package/docs/reference/templates/BOOTSTRAP.md +66 -0
- package/docs/reference/templates/HEARTBEAT.md +16 -0
- package/docs/reference/templates/IDENTITY.dev.md +52 -0
- package/docs/reference/templates/IDENTITY.md +34 -0
- package/docs/reference/templates/SOUL.dev.md +82 -0
- package/docs/reference/templates/SOUL.md +49 -0
- package/docs/reference/templates/TOOLS.dev.md +29 -0
- package/docs/reference/templates/TOOLS.md +51 -0
- package/docs/reference/templates/USER.dev.md +23 -0
- package/docs/reference/templates/USER.md +28 -0
- package/docs/reference/test.md +239 -0
- package/docs/reference/token-use.md +233 -0
- package/docs/reference/transcript-hygiene.md +214 -0
- package/docs/reference/wizard.md +252 -0
- package/docs/security/CONTRIBUTING-THREAT-MODEL.md +101 -0
- package/docs/security/THREAT-MODEL-ATLAS.md +611 -0
- package/docs/security/formal-verification.md +170 -0
- package/docs/security/incident-response.md +59 -0
- package/docs/security/network-proxy.md +268 -0
- package/docs/snippets/plugin-publish/minimal-openclaw.plugin.json +12 -0
- package/docs/snippets/plugin-publish/minimal-package.json +16 -0
- package/docs/start/bootstrapping.md +49 -0
- package/docs/start/docs-directory.md +69 -0
- package/docs/start/getting-started.md +152 -0
- package/docs/start/hubs.md +201 -0
- package/docs/start/lore.md +223 -0
- package/docs/start/onboarding-overview.md +72 -0
- package/docs/start/onboarding.md +95 -0
- package/docs/start/openclaw.md +244 -0
- package/docs/start/quickstart.md +25 -0
- package/docs/start/setup.md +178 -0
- package/docs/start/showcase.md +383 -0
- package/docs/start/wizard-cli-automation.md +232 -0
- package/docs/start/wizard-cli-reference.md +331 -0
- package/docs/start/wizard.md +141 -0
- package/docs/style.css +184 -0
- package/docs/superpowers/specs/2026-04-22-tweakcn-custom-theme-import-design.md +316 -0
- package/docs/tools/acp-agents-setup.md +352 -0
- package/docs/tools/acp-agents.md +847 -0
- package/docs/tools/agent-send.md +112 -0
- package/docs/tools/apply-patch.md +64 -0
- package/docs/tools/brave-search.md +139 -0
- package/docs/tools/browser-control.md +391 -0
- package/docs/tools/browser-linux-troubleshooting.md +173 -0
- package/docs/tools/browser-login.md +77 -0
- package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +219 -0
- package/docs/tools/browser.md +769 -0
- package/docs/tools/btw.md +159 -0
- package/docs/tools/capability-cookbook.md +12 -0
- package/docs/tools/clawhub.md +5 -0
- package/docs/tools/code-execution.md +173 -0
- package/docs/tools/creating-skills.md +120 -0
- package/docs/tools/diffs.md +506 -0
- package/docs/tools/duckduckgo-search.md +109 -0
- package/docs/tools/elevated.md +128 -0
- package/docs/tools/exa-search.md +152 -0
- package/docs/tools/exec-approvals-advanced.md +360 -0
- package/docs/tools/exec-approvals.md +474 -0
- package/docs/tools/exec.md +282 -0
- package/docs/tools/firecrawl.md +155 -0
- package/docs/tools/gemini-search.md +114 -0
- package/docs/tools/grok-search.md +113 -0
- package/docs/tools/image-generation.md +433 -0
- package/docs/tools/index.md +178 -0
- package/docs/tools/kimi-search.md +105 -0
- package/docs/tools/llm-task.md +137 -0
- package/docs/tools/lobster.md +365 -0
- package/docs/tools/loop-detection.md +154 -0
- package/docs/tools/media-overview.md +157 -0
- package/docs/tools/minimax-search.md +102 -0
- package/docs/tools/multi-agent-sandbox-tools.md +409 -0
- package/docs/tools/music-generation.md +371 -0
- package/docs/tools/ollama-search.md +153 -0
- package/docs/tools/pdf.md +195 -0
- package/docs/tools/perplexity-search.md +220 -0
- package/docs/tools/plugin.md +327 -0
- package/docs/tools/reactions.md +100 -0
- package/docs/tools/searxng-search.md +141 -0
- package/docs/tools/skills-config.md +195 -0
- package/docs/tools/skills.md +535 -0
- package/docs/tools/slash-commands.md +488 -0
- package/docs/tools/steer.md +84 -0
- package/docs/tools/subagents.md +650 -0
- package/docs/tools/tavily.md +162 -0
- package/docs/tools/thinking.md +140 -0
- package/docs/tools/tokenjuice.md +81 -0
- package/docs/tools/tool-search.md +269 -0
- package/docs/tools/trajectory.md +229 -0
- package/docs/tools/tts.md +1004 -0
- package/docs/tools/video-generation.md +552 -0
- package/docs/tools/web-fetch.md +195 -0
- package/docs/tools/web.md +459 -0
- package/docs/tts.md +11 -0
- package/docs/vps.md +139 -0
- package/docs/web/control-ui.md +503 -0
- package/docs/web/dashboard.md +107 -0
- package/docs/web/index.md +133 -0
- package/docs/web/tui.md +246 -0
- package/docs/web/webchat.md +99 -0
- package/docs/whatsapp-openclaw-ai-zh.jpg +0 -0
- package/docs/whatsapp-openclaw.jpg +0 -0
- package/nodmix.mjs +487 -0
- package/package.json +1852 -0
- package/patches/.gitkeep +0 -0
- package/patches/@agentclientprotocol__claude-agent-acp@0.36.1.patch +41 -0
- package/pnpm-workspace.yaml +63 -0
- package/scripts/crabbox-wrapper.mjs +353 -0
- package/scripts/lib/official-external-channel-catalog.json +559 -0
- package/scripts/lib/official-external-plugin-catalog.json +192 -0
- package/scripts/lib/official-external-provider-catalog.json +117 -0
- package/scripts/lib/package-dist-imports.mjs +171 -0
- package/scripts/npm-runner.mjs +91 -0
- package/scripts/postinstall-bundled-plugins.mjs +978 -0
- package/scripts/preinstall-package-manager-warning.mjs +64 -0
- package/scripts/windows-cmd-helpers.mjs +20 -0
- package/skills/1password/SKILL.md +70 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/apple-notes/SKILL.md +77 -0
- package/skills/apple-reminders/SKILL.md +118 -0
- package/skills/bear-notes/SKILL.md +107 -0
- package/skills/blogwatcher/SKILL.md +69 -0
- package/skills/blucli/SKILL.md +47 -0
- package/skills/camsnap/SKILL.md +45 -0
- package/skills/canvas/SKILL.md +78 -0
- package/skills/clawhub/SKILL.md +77 -0
- package/skills/coding-agent/SKILL.md +149 -0
- package/skills/diagram-maker/SKILL.md +53 -0
- package/skills/diagram-maker/references/excalidraw-patterns.md +85 -0
- package/skills/diagram-maker/references/svg-template.md +112 -0
- package/skills/discord/SKILL.md +136 -0
- package/skills/eightctl/SKILL.md +50 -0
- package/skills/gemini/SKILL.md +47 -0
- package/skills/gh-issues/SKILL.md +213 -0
- package/skills/gifgrep/SKILL.md +85 -0
- package/skills/github/SKILL.md +84 -0
- package/skills/gog/SKILL.md +116 -0
- package/skills/goplaces/SKILL.md +52 -0
- package/skills/healthcheck/SKILL.md +105 -0
- package/skills/himalaya/SKILL.md +80 -0
- package/skills/himalaya/references/configuration.md +184 -0
- package/skills/himalaya/references/message-composition.md +199 -0
- package/skills/imsg/SKILL.md +122 -0
- package/skills/mcporter/SKILL.md +61 -0
- package/skills/meme-maker/SKILL.md +42 -0
- package/skills/meme-maker/references/templates.json +358 -0
- package/skills/meme-maker/scripts/meme.mjs +398 -0
- package/skills/model-usage/SKILL.md +69 -0
- package/skills/model-usage/references/codexbar-cli.md +33 -0
- package/skills/model-usage/scripts/model_usage.py +319 -0
- package/skills/model-usage/scripts/test_model_usage.py +40 -0
- package/skills/nano-pdf/SKILL.md +38 -0
- package/skills/node-connect/SKILL.md +142 -0
- package/skills/node-inspect-debugger/SKILL.md +85 -0
- package/skills/notion/SKILL.md +150 -0
- package/skills/obsidian/SKILL.md +119 -0
- package/skills/openai-whisper/SKILL.md +38 -0
- package/skills/openai-whisper-api/SKILL.md +71 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +154 -0
- package/skills/openhue/SKILL.md +112 -0
- package/skills/oracle/SKILL.md +126 -0
- package/skills/ordercli/SKILL.md +78 -0
- package/skills/peekaboo/SKILL.md +190 -0
- package/skills/pyproject.toml +10 -0
- package/skills/python-debugpy/SKILL.md +73 -0
- package/skills/sag/SKILL.md +87 -0
- package/skills/session-logs/SKILL.md +151 -0
- package/skills/sherpa-onnx-tts/SKILL.md +109 -0
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
- package/skills/skill-creator/SKILL.md +78 -0
- package/skills/skill-creator/license.txt +202 -0
- package/skills/skill-creator/scripts/init_skill.py +378 -0
- package/skills/skill-creator/scripts/package_skill.py +139 -0
- package/skills/skill-creator/scripts/quick_validate.py +169 -0
- package/skills/skill-creator/scripts/test_package_skill.py +161 -0
- package/skills/skill-creator/scripts/test_quick_validate.py +116 -0
- package/skills/slack/SKILL.md +78 -0
- package/skills/songsee/SKILL.md +49 -0
- package/skills/sonoscli/SKILL.md +65 -0
- package/skills/spike/SKILL.md +51 -0
- package/skills/spotify-player/SKILL.md +64 -0
- package/skills/summarize/SKILL.md +87 -0
- package/skills/taskflow/SKILL.md +149 -0
- package/skills/taskflow/examples/inbox-triage.lobster +33 -0
- package/skills/taskflow/examples/pr-intake.lobster +32 -0
- package/skills/taskflow-inbox-triage/SKILL.md +119 -0
- package/skills/things-mac/SKILL.md +86 -0
- package/skills/tmux/SKILL.md +91 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +108 -0
- package/skills/video-frames/SKILL.md +46 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/voice-call/SKILL.md +45 -0
- package/skills/wacli/SKILL.md +72 -0
- package/skills/weather/SKILL.md +64 -0
- package/skills/xurl/SKILL.md +120 -0
|
@@ -0,0 +1,1004 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Text-to-speech for outbound replies — providers, personas, slash commands, and per-channel output"
|
|
3
|
+
read_when:
|
|
4
|
+
- Enabling text-to-speech for replies
|
|
5
|
+
- Configuring a TTS provider, fallback chain, or persona
|
|
6
|
+
- Using /tts commands or directives
|
|
7
|
+
title: "Text-to-speech"
|
|
8
|
+
sidebarTitle: "Text to speech (TTS)"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Nodmix can convert outbound replies into audio across **14 speech providers**
|
|
12
|
+
and deliver native voice messages on Feishu, Matrix, Telegram, and WhatsApp,
|
|
13
|
+
audio attachments everywhere else, and PCM/Ulaw streams for telephony and Talk.
|
|
14
|
+
|
|
15
|
+
TTS is the speech-output half of Talk's `stt-tts` mode. Provider-native
|
|
16
|
+
`realtime` Talk sessions synthesize speech inside the realtime provider instead
|
|
17
|
+
of calling this TTS path, while `transcription` sessions do not synthesize an
|
|
18
|
+
assistant voice response.
|
|
19
|
+
|
|
20
|
+
## Quick start
|
|
21
|
+
|
|
22
|
+
<Steps>
|
|
23
|
+
<Step title="Pick a provider">
|
|
24
|
+
OpenAI and ElevenLabs are the most reliable hosted options. Microsoft and
|
|
25
|
+
Local CLI work without an API key. See the [provider matrix](#supported-providers)
|
|
26
|
+
for the full list.
|
|
27
|
+
</Step>
|
|
28
|
+
<Step title="Set the API key">
|
|
29
|
+
Export the env var for your provider (for example `OPENAI_API_KEY`,
|
|
30
|
+
`ELEVENLABS_API_KEY`). Microsoft and Local CLI need no key.
|
|
31
|
+
</Step>
|
|
32
|
+
<Step title="Enable in config">
|
|
33
|
+
Set `messages.tts.auto: "always"` and `messages.tts.provider`:
|
|
34
|
+
|
|
35
|
+
```json5
|
|
36
|
+
{
|
|
37
|
+
messages: {
|
|
38
|
+
tts: {
|
|
39
|
+
auto: "always",
|
|
40
|
+
provider: "elevenlabs",
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
</Step>
|
|
47
|
+
<Step title="Try it in chat">
|
|
48
|
+
`/tts status` shows the current state. `/tts audio Hello from Nodmix`
|
|
49
|
+
sends a one-off audio reply.
|
|
50
|
+
</Step>
|
|
51
|
+
</Steps>
|
|
52
|
+
|
|
53
|
+
<Note>
|
|
54
|
+
Auto-TTS is **off** by default. When `messages.tts.provider` is unset,
|
|
55
|
+
Nodmix picks the first configured provider in registry auto-select order.
|
|
56
|
+
The built-in `tts` agent tool is explicit-intent only: ordinary chat stays
|
|
57
|
+
text unless the user asks for audio, uses `/tts`, or enables Auto-TTS/directive
|
|
58
|
+
speech.
|
|
59
|
+
</Note>
|
|
60
|
+
|
|
61
|
+
## Supported providers
|
|
62
|
+
|
|
63
|
+
| Provider | Auth | Notes |
|
|
64
|
+
| ----------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
|
|
65
|
+
| **Azure Speech** | `AZURE_SPEECH_KEY` + `AZURE_SPEECH_REGION` (also `AZURE_SPEECH_API_KEY`, `SPEECH_KEY`, `SPEECH_REGION`) | Native Ogg/Opus voice-note output and telephony. |
|
|
66
|
+
| **DeepInfra** | `DEEPINFRA_API_KEY` | OpenAI-compatible TTS. Defaults to `hexgrad/Kokoro-82M`. |
|
|
67
|
+
| **ElevenLabs** | `ELEVENLABS_API_KEY` or `XI_API_KEY` | Voice cloning, multilingual, deterministic via `seed`; streamed for Discord voice playback. |
|
|
68
|
+
| **Google Gemini** | `GEMINI_API_KEY` or `GOOGLE_API_KEY` | Gemini API batch TTS; persona-aware via `promptTemplate: "audio-profile-v1"`. |
|
|
69
|
+
| **Gradium** | `GRADIUM_API_KEY` | Voice-note and telephony output. |
|
|
70
|
+
| **Inworld** | `INWORLD_API_KEY` | Streaming TTS API. Native Opus voice-note and PCM telephony. |
|
|
71
|
+
| **Local CLI** | none | Runs a configured local TTS command. |
|
|
72
|
+
| **Microsoft** | none | Public Edge neural TTS via `node-edge-tts`. Best-effort, no SLA. |
|
|
73
|
+
| **MiniMax** | `MINIMAX_API_KEY` (or Token Plan: `MINIMAX_OAUTH_TOKEN`, `MINIMAX_CODE_PLAN_KEY`, `MINIMAX_CODING_API_KEY`) | T2A v2 API. Defaults to `speech-2.8-hd`. |
|
|
74
|
+
| **OpenAI** | `OPENAI_API_KEY` | Also used for auto-summary; supports persona `instructions`. |
|
|
75
|
+
| **OpenRouter** | `OPENROUTER_API_KEY` (can reuse `models.providers.openrouter.apiKey`) | Default model `hexgrad/kokoro-82m`. |
|
|
76
|
+
| **Volcengine** | `VOLCENGINE_TTS_API_KEY` or `BYTEPLUS_SEED_SPEECH_API_KEY` (legacy AppID/token: `VOLCENGINE_TTS_APPID`/`_TOKEN`) | BytePlus Seed Speech HTTP API. |
|
|
77
|
+
| **Vydra** | `VYDRA_API_KEY` | Shared image, video, and speech provider. |
|
|
78
|
+
| **xAI** | `XAI_API_KEY` | xAI batch TTS. Native Opus voice-note is **not** supported. |
|
|
79
|
+
| **Xiaomi MiMo** | `XIAOMI_API_KEY` | MiMo TTS through Xiaomi chat completions. |
|
|
80
|
+
|
|
81
|
+
If multiple providers are configured, the selected one is used first and the
|
|
82
|
+
others are fallback options. Auto-summary uses `summaryModel` (or
|
|
83
|
+
`agents.defaults.model.primary`), so that provider must also be authenticated
|
|
84
|
+
if you keep summaries enabled.
|
|
85
|
+
|
|
86
|
+
<Warning>
|
|
87
|
+
The bundled **Microsoft** provider uses Microsoft Edge's online neural TTS
|
|
88
|
+
service via `node-edge-tts`. It is a public web service without a published
|
|
89
|
+
SLA or quota — treat it as best-effort. The legacy provider id `edge` is
|
|
90
|
+
normalized to `microsoft` and `nodmix doctor --fix` rewrites persisted
|
|
91
|
+
config; new configs should always use `microsoft`.
|
|
92
|
+
</Warning>
|
|
93
|
+
|
|
94
|
+
## Configuration
|
|
95
|
+
|
|
96
|
+
TTS config lives under `messages.tts` in `~/.nodmix/nodmix.json`. Pick a
|
|
97
|
+
preset and adapt the provider block:
|
|
98
|
+
|
|
99
|
+
<Tabs>
|
|
100
|
+
<Tab title="Azure Speech">
|
|
101
|
+
```json5
|
|
102
|
+
{
|
|
103
|
+
messages: {
|
|
104
|
+
tts: {
|
|
105
|
+
auto: "always",
|
|
106
|
+
provider: "azure-speech",
|
|
107
|
+
providers: {
|
|
108
|
+
"azure-speech": {
|
|
109
|
+
apiKey: "${AZURE_SPEECH_KEY}",
|
|
110
|
+
region: "eastus",
|
|
111
|
+
voice: "en-US-JennyNeural",
|
|
112
|
+
lang: "en-US",
|
|
113
|
+
outputFormat: "audio-24khz-48kbitrate-mono-mp3",
|
|
114
|
+
voiceNoteOutputFormat: "ogg-24khz-16bit-mono-opus",
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
</Tab>
|
|
122
|
+
<Tab title="ElevenLabs">
|
|
123
|
+
```json5
|
|
124
|
+
{
|
|
125
|
+
messages: {
|
|
126
|
+
tts: {
|
|
127
|
+
auto: "always",
|
|
128
|
+
provider: "elevenlabs",
|
|
129
|
+
providers: {
|
|
130
|
+
elevenlabs: {
|
|
131
|
+
apiKey: "${ELEVENLABS_API_KEY}",
|
|
132
|
+
model: "eleven_multilingual_v2",
|
|
133
|
+
voiceId: "EXAVITQu4vr4xnSDxMaL",
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
</Tab>
|
|
141
|
+
<Tab title="Google Gemini">
|
|
142
|
+
```json5
|
|
143
|
+
{
|
|
144
|
+
messages: {
|
|
145
|
+
tts: {
|
|
146
|
+
auto: "always",
|
|
147
|
+
provider: "google",
|
|
148
|
+
providers: {
|
|
149
|
+
google: {
|
|
150
|
+
apiKey: "${GEMINI_API_KEY}",
|
|
151
|
+
model: "gemini-3.1-flash-tts-preview",
|
|
152
|
+
voiceName: "Kore",
|
|
153
|
+
// Optional natural-language style prompts:
|
|
154
|
+
// audioProfile: "Speak in a calm, podcast-host tone.",
|
|
155
|
+
// speakerName: "Alex",
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
</Tab>
|
|
163
|
+
<Tab title="Gradium">
|
|
164
|
+
```json5
|
|
165
|
+
{
|
|
166
|
+
messages: {
|
|
167
|
+
tts: {
|
|
168
|
+
auto: "always",
|
|
169
|
+
provider: "gradium",
|
|
170
|
+
providers: {
|
|
171
|
+
gradium: {
|
|
172
|
+
apiKey: "${GRADIUM_API_KEY}",
|
|
173
|
+
voiceId: "YTpq7expH9539ERJ",
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
</Tab>
|
|
181
|
+
<Tab title="Inworld">
|
|
182
|
+
```json5
|
|
183
|
+
{
|
|
184
|
+
messages: {
|
|
185
|
+
tts: {
|
|
186
|
+
auto: "always",
|
|
187
|
+
provider: "inworld",
|
|
188
|
+
providers: {
|
|
189
|
+
inworld: {
|
|
190
|
+
apiKey: "${INWORLD_API_KEY}",
|
|
191
|
+
modelId: "inworld-tts-1.5-max",
|
|
192
|
+
voiceId: "Sarah",
|
|
193
|
+
temperature: 0.7,
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
</Tab>
|
|
201
|
+
<Tab title="Local CLI">
|
|
202
|
+
```json5
|
|
203
|
+
{
|
|
204
|
+
messages: {
|
|
205
|
+
tts: {
|
|
206
|
+
auto: "always",
|
|
207
|
+
provider: "tts-local-cli",
|
|
208
|
+
providers: {
|
|
209
|
+
"tts-local-cli": {
|
|
210
|
+
command: "say",
|
|
211
|
+
args: ["-o", "{{OutputPath}}", "{{Text}}"],
|
|
212
|
+
outputFormat: "wav",
|
|
213
|
+
timeoutMs: 120000,
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
</Tab>
|
|
221
|
+
<Tab title="Microsoft (no key)">
|
|
222
|
+
```json5
|
|
223
|
+
{
|
|
224
|
+
messages: {
|
|
225
|
+
tts: {
|
|
226
|
+
auto: "always",
|
|
227
|
+
provider: "microsoft",
|
|
228
|
+
providers: {
|
|
229
|
+
microsoft: {
|
|
230
|
+
enabled: true,
|
|
231
|
+
voice: "en-US-MichelleNeural",
|
|
232
|
+
lang: "en-US",
|
|
233
|
+
outputFormat: "audio-24khz-48kbitrate-mono-mp3",
|
|
234
|
+
rate: "+0%",
|
|
235
|
+
pitch: "+0%",
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
</Tab>
|
|
243
|
+
<Tab title="MiniMax">
|
|
244
|
+
```json5
|
|
245
|
+
{
|
|
246
|
+
messages: {
|
|
247
|
+
tts: {
|
|
248
|
+
auto: "always",
|
|
249
|
+
provider: "minimax",
|
|
250
|
+
providers: {
|
|
251
|
+
minimax: {
|
|
252
|
+
apiKey: "${MINIMAX_API_KEY}",
|
|
253
|
+
model: "speech-2.8-hd",
|
|
254
|
+
voiceId: "English_expressive_narrator",
|
|
255
|
+
speed: 1.0,
|
|
256
|
+
vol: 1.0,
|
|
257
|
+
pitch: 0,
|
|
258
|
+
},
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
},
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
</Tab>
|
|
265
|
+
<Tab title="OpenAI + ElevenLabs">
|
|
266
|
+
```json5
|
|
267
|
+
{
|
|
268
|
+
messages: {
|
|
269
|
+
tts: {
|
|
270
|
+
auto: "always",
|
|
271
|
+
provider: "openai",
|
|
272
|
+
summaryModel: "openai/gpt-4.1-mini",
|
|
273
|
+
modelOverrides: { enabled: true },
|
|
274
|
+
providers: {
|
|
275
|
+
openai: {
|
|
276
|
+
apiKey: "${OPENAI_API_KEY}",
|
|
277
|
+
model: "gpt-4o-mini-tts",
|
|
278
|
+
voice: "alloy",
|
|
279
|
+
},
|
|
280
|
+
elevenlabs: {
|
|
281
|
+
apiKey: "${ELEVENLABS_API_KEY}",
|
|
282
|
+
model: "eleven_multilingual_v2",
|
|
283
|
+
voiceId: "EXAVITQu4vr4xnSDxMaL",
|
|
284
|
+
voiceSettings: { stability: 0.5, similarityBoost: 0.75, style: 0.0, useSpeakerBoost: true, speed: 1.0 },
|
|
285
|
+
applyTextNormalization: "auto",
|
|
286
|
+
languageCode: "en",
|
|
287
|
+
},
|
|
288
|
+
},
|
|
289
|
+
},
|
|
290
|
+
},
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
</Tab>
|
|
294
|
+
<Tab title="OpenRouter">
|
|
295
|
+
```json5
|
|
296
|
+
{
|
|
297
|
+
messages: {
|
|
298
|
+
tts: {
|
|
299
|
+
auto: "always",
|
|
300
|
+
provider: "openrouter",
|
|
301
|
+
providers: {
|
|
302
|
+
openrouter: {
|
|
303
|
+
apiKey: "${OPENROUTER_API_KEY}",
|
|
304
|
+
model: "hexgrad/kokoro-82m",
|
|
305
|
+
voice: "af_alloy",
|
|
306
|
+
responseFormat: "mp3",
|
|
307
|
+
},
|
|
308
|
+
},
|
|
309
|
+
},
|
|
310
|
+
},
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
</Tab>
|
|
314
|
+
<Tab title="Volcengine">
|
|
315
|
+
```json5
|
|
316
|
+
{
|
|
317
|
+
messages: {
|
|
318
|
+
tts: {
|
|
319
|
+
auto: "always",
|
|
320
|
+
provider: "volcengine",
|
|
321
|
+
providers: {
|
|
322
|
+
volcengine: {
|
|
323
|
+
apiKey: "${VOLCENGINE_TTS_API_KEY}",
|
|
324
|
+
resourceId: "seed-tts-1.0",
|
|
325
|
+
voice: "en_female_anna_mars_bigtts",
|
|
326
|
+
},
|
|
327
|
+
},
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
}
|
|
331
|
+
```
|
|
332
|
+
</Tab>
|
|
333
|
+
<Tab title="xAI">
|
|
334
|
+
```json5
|
|
335
|
+
{
|
|
336
|
+
messages: {
|
|
337
|
+
tts: {
|
|
338
|
+
auto: "always",
|
|
339
|
+
provider: "xai",
|
|
340
|
+
providers: {
|
|
341
|
+
xai: {
|
|
342
|
+
apiKey: "${XAI_API_KEY}",
|
|
343
|
+
voiceId: "eve",
|
|
344
|
+
language: "en",
|
|
345
|
+
responseFormat: "mp3",
|
|
346
|
+
},
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
}
|
|
351
|
+
```
|
|
352
|
+
</Tab>
|
|
353
|
+
<Tab title="Xiaomi MiMo">
|
|
354
|
+
```json5
|
|
355
|
+
{
|
|
356
|
+
messages: {
|
|
357
|
+
tts: {
|
|
358
|
+
auto: "always",
|
|
359
|
+
provider: "xiaomi",
|
|
360
|
+
providers: {
|
|
361
|
+
xiaomi: {
|
|
362
|
+
apiKey: "${XIAOMI_API_KEY}",
|
|
363
|
+
model: "mimo-v2.5-tts",
|
|
364
|
+
voice: "mimo_default",
|
|
365
|
+
format: "mp3",
|
|
366
|
+
},
|
|
367
|
+
},
|
|
368
|
+
},
|
|
369
|
+
},
|
|
370
|
+
}
|
|
371
|
+
```
|
|
372
|
+
</Tab>
|
|
373
|
+
</Tabs>
|
|
374
|
+
|
|
375
|
+
### Per-agent voice overrides
|
|
376
|
+
|
|
377
|
+
Use `agents.list[].tts` when one agent should speak with a different provider,
|
|
378
|
+
voice, model, persona, or auto-TTS mode. The agent block deep-merges over
|
|
379
|
+
`messages.tts`, so provider credentials can stay in the global provider config:
|
|
380
|
+
|
|
381
|
+
```json5
|
|
382
|
+
{
|
|
383
|
+
messages: {
|
|
384
|
+
tts: {
|
|
385
|
+
auto: "always",
|
|
386
|
+
provider: "elevenlabs",
|
|
387
|
+
providers: {
|
|
388
|
+
elevenlabs: { apiKey: "${ELEVENLABS_API_KEY}", model: "eleven_multilingual_v2" },
|
|
389
|
+
},
|
|
390
|
+
},
|
|
391
|
+
},
|
|
392
|
+
agents: {
|
|
393
|
+
list: [
|
|
394
|
+
{
|
|
395
|
+
id: "reader",
|
|
396
|
+
tts: {
|
|
397
|
+
providers: {
|
|
398
|
+
elevenlabs: { voiceId: "EXAVITQu4vr4xnSDxMaL" },
|
|
399
|
+
},
|
|
400
|
+
},
|
|
401
|
+
},
|
|
402
|
+
],
|
|
403
|
+
},
|
|
404
|
+
}
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
To pin a per-agent persona, set `agents.list[].tts.persona` alongside provider
|
|
408
|
+
config — it overrides the global `messages.tts.persona` for that agent only.
|
|
409
|
+
|
|
410
|
+
Precedence order for automatic replies, `/tts audio`, `/tts status`, and the
|
|
411
|
+
`tts` agent tool:
|
|
412
|
+
|
|
413
|
+
1. `messages.tts`
|
|
414
|
+
2. active `agents.list[].tts`
|
|
415
|
+
3. channel override, when the channel supports `channels.<channel>.tts`
|
|
416
|
+
4. account override, when the channel passes `channels.<channel>.accounts.<id>.tts`
|
|
417
|
+
5. local `/tts` preferences for this host
|
|
418
|
+
6. inline `[[tts:...]]` directives when [model overrides](#model-driven-directives) are enabled
|
|
419
|
+
|
|
420
|
+
Channel and account overrides use the same shape as `messages.tts` and
|
|
421
|
+
deep-merge over the earlier layers, so shared provider credentials can stay in
|
|
422
|
+
`messages.tts` while a channel or bot account changes only voice, model, persona,
|
|
423
|
+
or auto mode:
|
|
424
|
+
|
|
425
|
+
```json5
|
|
426
|
+
{
|
|
427
|
+
messages: {
|
|
428
|
+
tts: {
|
|
429
|
+
provider: "openai",
|
|
430
|
+
providers: {
|
|
431
|
+
openai: { apiKey: "${OPENAI_API_KEY}", model: "gpt-4o-mini-tts" },
|
|
432
|
+
},
|
|
433
|
+
},
|
|
434
|
+
},
|
|
435
|
+
channels: {
|
|
436
|
+
feishu: {
|
|
437
|
+
accounts: {
|
|
438
|
+
english: {
|
|
439
|
+
tts: {
|
|
440
|
+
providers: {
|
|
441
|
+
openai: { voice: "shimmer" },
|
|
442
|
+
},
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
},
|
|
446
|
+
},
|
|
447
|
+
},
|
|
448
|
+
}
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
## Personas
|
|
452
|
+
|
|
453
|
+
A **persona** is a stable spoken identity that can be applied deterministically
|
|
454
|
+
across providers. It can prefer one provider, define provider-neutral prompt
|
|
455
|
+
intent, and carry provider-specific bindings for voices, models, prompt
|
|
456
|
+
templates, seeds, and voice settings.
|
|
457
|
+
|
|
458
|
+
### Minimal persona
|
|
459
|
+
|
|
460
|
+
```json5
|
|
461
|
+
{
|
|
462
|
+
messages: {
|
|
463
|
+
tts: {
|
|
464
|
+
auto: "always",
|
|
465
|
+
persona: "narrator",
|
|
466
|
+
personas: {
|
|
467
|
+
narrator: {
|
|
468
|
+
label: "Narrator",
|
|
469
|
+
provider: "elevenlabs",
|
|
470
|
+
providers: {
|
|
471
|
+
elevenlabs: { voiceId: "EXAVITQu4vr4xnSDxMaL", modelId: "eleven_multilingual_v2" },
|
|
472
|
+
},
|
|
473
|
+
},
|
|
474
|
+
},
|
|
475
|
+
},
|
|
476
|
+
},
|
|
477
|
+
}
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### Full persona (provider-neutral prompt)
|
|
481
|
+
|
|
482
|
+
```json5
|
|
483
|
+
{
|
|
484
|
+
messages: {
|
|
485
|
+
tts: {
|
|
486
|
+
auto: "always",
|
|
487
|
+
persona: "alfred",
|
|
488
|
+
personas: {
|
|
489
|
+
alfred: {
|
|
490
|
+
label: "Alfred",
|
|
491
|
+
description: "Dry, warm British butler narrator.",
|
|
492
|
+
provider: "google",
|
|
493
|
+
fallbackPolicy: "preserve-persona",
|
|
494
|
+
prompt: {
|
|
495
|
+
profile: "A brilliant British butler. Dry, witty, warm, charming, emotionally expressive, never generic.",
|
|
496
|
+
scene: "A quiet late-night study. Close-mic narration for a trusted operator.",
|
|
497
|
+
sampleContext: "The speaker is answering a private technical request with concise confidence and dry warmth.",
|
|
498
|
+
style: "Refined, understated, lightly amused.",
|
|
499
|
+
accent: "British English.",
|
|
500
|
+
pacing: "Measured, with short dramatic pauses.",
|
|
501
|
+
constraints: ["Do not read configuration values aloud.", "Do not explain the persona."],
|
|
502
|
+
},
|
|
503
|
+
providers: {
|
|
504
|
+
google: {
|
|
505
|
+
model: "gemini-3.1-flash-tts-preview",
|
|
506
|
+
voiceName: "Algieba",
|
|
507
|
+
promptTemplate: "audio-profile-v1",
|
|
508
|
+
},
|
|
509
|
+
openai: { model: "gpt-4o-mini-tts", voice: "cedar" },
|
|
510
|
+
elevenlabs: {
|
|
511
|
+
voiceId: "voice_id",
|
|
512
|
+
modelId: "eleven_multilingual_v2",
|
|
513
|
+
seed: 42,
|
|
514
|
+
voiceSettings: {
|
|
515
|
+
stability: 0.65,
|
|
516
|
+
similarityBoost: 0.8,
|
|
517
|
+
style: 0.25,
|
|
518
|
+
useSpeakerBoost: true,
|
|
519
|
+
speed: 0.95,
|
|
520
|
+
},
|
|
521
|
+
},
|
|
522
|
+
},
|
|
523
|
+
},
|
|
524
|
+
},
|
|
525
|
+
},
|
|
526
|
+
},
|
|
527
|
+
}
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
### Persona resolution
|
|
531
|
+
|
|
532
|
+
The active persona is selected deterministically:
|
|
533
|
+
|
|
534
|
+
1. `/tts persona <id>` local preference, if set.
|
|
535
|
+
2. `messages.tts.persona`, if set.
|
|
536
|
+
3. No persona.
|
|
537
|
+
|
|
538
|
+
Provider selection runs explicit-first:
|
|
539
|
+
|
|
540
|
+
1. Direct overrides (CLI, gateway, Talk, allowed TTS directives).
|
|
541
|
+
2. `/tts provider <id>` local preference.
|
|
542
|
+
3. Active persona's `provider`.
|
|
543
|
+
4. `messages.tts.provider`.
|
|
544
|
+
5. Registry auto-select.
|
|
545
|
+
|
|
546
|
+
For each provider attempt, Nodmix merges configs in this order:
|
|
547
|
+
|
|
548
|
+
1. `messages.tts.providers.<id>`
|
|
549
|
+
2. `messages.tts.personas.<persona>.providers.<id>`
|
|
550
|
+
3. Trusted request overrides
|
|
551
|
+
4. Allowed model-emitted TTS directive overrides
|
|
552
|
+
|
|
553
|
+
### How providers use persona prompts
|
|
554
|
+
|
|
555
|
+
Persona prompt fields (`profile`, `scene`, `sampleContext`, `style`, `accent`,
|
|
556
|
+
`pacing`, `constraints`) are **provider-neutral**. Each provider decides how
|
|
557
|
+
to use them:
|
|
558
|
+
|
|
559
|
+
<AccordionGroup>
|
|
560
|
+
<Accordion title="Google Gemini">
|
|
561
|
+
Wraps persona prompt fields in a Gemini TTS prompt structure **only when**
|
|
562
|
+
the effective Google provider config sets `promptTemplate: "audio-profile-v1"`
|
|
563
|
+
or `personaPrompt`. The older `audioProfile` and `speakerName` fields are
|
|
564
|
+
still prepended as Google-specific prompt text. Inline audio tags such as
|
|
565
|
+
`[whispers]` or `[laughs]` inside a `[[tts:text]]` block are preserved
|
|
566
|
+
inside the Gemini transcript; Nodmix does not generate these tags.
|
|
567
|
+
</Accordion>
|
|
568
|
+
<Accordion title="OpenAI">
|
|
569
|
+
Maps persona prompt fields to the request `instructions` field **only when**
|
|
570
|
+
no explicit OpenAI `instructions` is configured. Explicit `instructions`
|
|
571
|
+
always wins.
|
|
572
|
+
</Accordion>
|
|
573
|
+
<Accordion title="Other providers">
|
|
574
|
+
Use only the provider-specific persona bindings under
|
|
575
|
+
`personas.<id>.providers.<provider>`. Persona prompt fields are ignored
|
|
576
|
+
unless the provider implements its own persona-prompt mapping.
|
|
577
|
+
</Accordion>
|
|
578
|
+
</AccordionGroup>
|
|
579
|
+
|
|
580
|
+
### Fallback policy
|
|
581
|
+
|
|
582
|
+
`fallbackPolicy` controls behavior when a persona has **no binding** for the
|
|
583
|
+
attempted provider:
|
|
584
|
+
|
|
585
|
+
| Policy | Behavior |
|
|
586
|
+
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
587
|
+
| `preserve-persona` | **Default.** Provider-neutral prompt fields stay available; the provider may use them or ignore them. |
|
|
588
|
+
| `provider-defaults` | Persona is omitted from prompt preparation for that attempt; the provider uses its neutral defaults while fallback to other providers continues. |
|
|
589
|
+
| `fail` | Skip that provider attempt with `reasonCode: "not_configured"` and `personaBinding: "missing"`. Fallback providers are still tried. |
|
|
590
|
+
|
|
591
|
+
The whole TTS request only fails when **every** attempted provider is skipped
|
|
592
|
+
or fails.
|
|
593
|
+
|
|
594
|
+
Talk session provider selection is session-scoped. A Talk client should choose
|
|
595
|
+
provider ids, model ids, voice ids, and locales from `talk.catalog` and pass
|
|
596
|
+
them through the Talk session or handoff request. Opening a voice session should
|
|
597
|
+
not mutate `messages.tts` or global Talk provider defaults.
|
|
598
|
+
|
|
599
|
+
## Model-driven directives
|
|
600
|
+
|
|
601
|
+
By default, the assistant **can** emit `[[tts:...]]` directives to override
|
|
602
|
+
voice, model, or speed for a single reply, plus an optional
|
|
603
|
+
`[[tts:text]]...[[/tts:text]]` block for expressive cues that should appear in
|
|
604
|
+
audio only:
|
|
605
|
+
|
|
606
|
+
```text
|
|
607
|
+
Here you go.
|
|
608
|
+
|
|
609
|
+
[[tts:voiceId=pMsXgVXv3BLzUgSXRplE model=eleven_v3 speed=1.1]]
|
|
610
|
+
[[tts:text]](laughs) Read the song once more.[[/tts:text]]
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
When `messages.tts.auto` is `"tagged"`, **directives are required** to trigger
|
|
614
|
+
audio. Streaming block delivery strips directives from visible text before the
|
|
615
|
+
channel sees them, even when split across adjacent blocks.
|
|
616
|
+
|
|
617
|
+
`provider=...` is ignored unless `modelOverrides.allowProvider: true`. When a
|
|
618
|
+
reply declares `provider=...`, the other keys in that directive are parsed
|
|
619
|
+
only by that provider; unsupported keys are stripped and reported as TTS
|
|
620
|
+
directive warnings.
|
|
621
|
+
|
|
622
|
+
**Available directive keys:**
|
|
623
|
+
|
|
624
|
+
- `provider` (registered provider id; requires `allowProvider: true`)
|
|
625
|
+
- `voice` / `voiceName` / `voice_name` / `google_voice` / `voiceId`
|
|
626
|
+
- `model` / `google_model`
|
|
627
|
+
- `stability`, `similarityBoost`, `style`, `speed`, `useSpeakerBoost`
|
|
628
|
+
- `vol` / `volume` (MiniMax volume, 0–10)
|
|
629
|
+
- `pitch` (MiniMax integer pitch, −12 to 12; fractional values are truncated)
|
|
630
|
+
- `emotion` (Volcengine emotion tag)
|
|
631
|
+
- `applyTextNormalization` (`auto|on|off`)
|
|
632
|
+
- `languageCode` (ISO 639-1)
|
|
633
|
+
- `seed`
|
|
634
|
+
|
|
635
|
+
**Disable model overrides entirely:**
|
|
636
|
+
|
|
637
|
+
```json5
|
|
638
|
+
{ messages: { tts: { modelOverrides: { enabled: false } } } }
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
**Allow provider switching while keeping other knobs configurable:**
|
|
642
|
+
|
|
643
|
+
```json5
|
|
644
|
+
{ messages: { tts: { modelOverrides: { enabled: true, allowProvider: true, allowSeed: false } } } }
|
|
645
|
+
```
|
|
646
|
+
|
|
647
|
+
## Slash commands
|
|
648
|
+
|
|
649
|
+
Single command `/tts`. On Discord, Nodmix also registers `/voice` because
|
|
650
|
+
`/tts` is a built-in Discord command — text `/tts ...` still works.
|
|
651
|
+
|
|
652
|
+
```text
|
|
653
|
+
/tts off | on | status
|
|
654
|
+
/tts chat on | off | default
|
|
655
|
+
/tts latest
|
|
656
|
+
/tts provider <id>
|
|
657
|
+
/tts persona <id> | off
|
|
658
|
+
/tts limit <chars>
|
|
659
|
+
/tts summary off
|
|
660
|
+
/tts audio <text>
|
|
661
|
+
```
|
|
662
|
+
|
|
663
|
+
<Note>
|
|
664
|
+
Commands require an authorized sender (allowlist/owner rules apply) and either
|
|
665
|
+
`commands.text` or native command registration must be enabled.
|
|
666
|
+
</Note>
|
|
667
|
+
|
|
668
|
+
Behavior notes:
|
|
669
|
+
|
|
670
|
+
- `/tts on` writes the local TTS preference to `always`; `/tts off` writes it to `off`.
|
|
671
|
+
- `/tts chat on|off|default` writes a session-scoped auto-TTS override for the current chat.
|
|
672
|
+
- `/tts persona <id>` writes the local persona preference; `/tts persona off` clears it.
|
|
673
|
+
- `/tts latest` reads the latest assistant reply from the current session transcript and sends it as audio once. It stores only a hash of that reply on the session entry to suppress duplicate voice sends.
|
|
674
|
+
- `/tts audio` generates a one-off audio reply (does **not** toggle TTS on).
|
|
675
|
+
- `limit` and `summary` are stored in **local prefs**, not the main config.
|
|
676
|
+
- `/tts status` includes fallback diagnostics for the latest attempt — `Fallback: <primary> -> <used>`, `Attempts: ...`, and per-attempt detail (`provider:outcome(reasonCode) latency`).
|
|
677
|
+
- `/status` shows the active TTS mode plus configured provider, model, voice, and sanitized custom endpoint metadata when TTS is enabled.
|
|
678
|
+
|
|
679
|
+
## Per-user preferences
|
|
680
|
+
|
|
681
|
+
Slash commands write local overrides to `prefsPath`. The default is
|
|
682
|
+
`~/.nodmix/settings/tts.json`; override with the `NODMIX_TTS_PREFS` env var
|
|
683
|
+
or `messages.tts.prefsPath`.
|
|
684
|
+
|
|
685
|
+
| Stored field | Effect |
|
|
686
|
+
| ------------ | -------------------------------------------- |
|
|
687
|
+
| `auto` | Local auto-TTS override (`always`, `off`, …) |
|
|
688
|
+
| `provider` | Local primary provider override |
|
|
689
|
+
| `persona` | Local persona override |
|
|
690
|
+
| `maxLength` | Summary threshold (default `1500` chars) |
|
|
691
|
+
| `summarize` | Summary toggle (default `true`) |
|
|
692
|
+
|
|
693
|
+
These override the effective config from `messages.tts` plus the active
|
|
694
|
+
`agents.list[].tts` block for that host.
|
|
695
|
+
|
|
696
|
+
## Output formats (fixed)
|
|
697
|
+
|
|
698
|
+
TTS voice delivery is channel-capability driven. Channel plugins advertise
|
|
699
|
+
whether voice-style TTS should ask providers for a native `voice-note` target or
|
|
700
|
+
keep normal `audio-file` synthesis and only mark compatible output for voice
|
|
701
|
+
delivery.
|
|
702
|
+
|
|
703
|
+
- **Voice-note capable channels**: voice-note replies prefer Opus (`opus_48000_64` from ElevenLabs, `opus` from OpenAI).
|
|
704
|
+
- 48kHz / 64kbps is a good voice message tradeoff.
|
|
705
|
+
- **Feishu / WhatsApp**: when a voice-note reply is produced as MP3/WebM/WAV/M4A
|
|
706
|
+
or another likely audio file, the channel plugin transcodes it to 48kHz
|
|
707
|
+
Ogg/Opus with `ffmpeg` before sending the native voice message. WhatsApp sends
|
|
708
|
+
the result through the Baileys `audio` payload with `ptt: true` and
|
|
709
|
+
`audio/ogg; codecs=opus`. If conversion fails, Feishu receives the original
|
|
710
|
+
file as an attachment; WhatsApp send fails rather than posting an incompatible
|
|
711
|
+
PTT payload.
|
|
712
|
+
- **Other channels**: MP3 (`mp3_44100_128` from ElevenLabs, `mp3` from OpenAI).
|
|
713
|
+
- 44.1kHz / 128kbps is the default balance for speech clarity.
|
|
714
|
+
- **MiniMax**: MP3 (`speech-2.8-hd` model, 32kHz sample rate) for normal audio attachments. For channel-advertised voice-note targets, Nodmix transcodes the MiniMax MP3 to 48kHz Opus with `ffmpeg` before delivery when the channel advertises transcoding.
|
|
715
|
+
- **Xiaomi MiMo**: MP3 by default, or WAV when configured. For channel-advertised voice-note targets, Nodmix transcodes Xiaomi output to 48kHz Opus with `ffmpeg` before delivery when the channel advertises transcoding.
|
|
716
|
+
- **Local CLI**: uses the configured `outputFormat`. Voice-note targets are
|
|
717
|
+
converted to Ogg/Opus and telephony output is converted to raw 16 kHz mono PCM
|
|
718
|
+
with `ffmpeg`.
|
|
719
|
+
- **Google Gemini**: Gemini API TTS returns raw 24kHz PCM. Nodmix wraps it as WAV for audio attachments, transcodes it to 48kHz Opus for voice-note targets, and returns PCM directly for Talk/telephony.
|
|
720
|
+
- **Gradium**: WAV for audio attachments, Opus for voice-note targets, and `ulaw_8000` at 8 kHz for telephony.
|
|
721
|
+
- **Inworld**: MP3 for normal audio attachments, native `OGG_OPUS` for voice-note targets, and raw `PCM` at 22050 Hz for Talk/telephony.
|
|
722
|
+
- **xAI**: MP3 by default; `responseFormat` may be `mp3`, `wav`, `pcm`, `mulaw`, or `alaw`. Nodmix uses xAI's batch REST TTS endpoint and returns a complete audio attachment; xAI's streaming TTS WebSocket is not used by this provider path. Native Opus voice-note format is not supported by this path.
|
|
723
|
+
- **Microsoft**: uses `microsoft.outputFormat` (default `audio-24khz-48kbitrate-mono-mp3`).
|
|
724
|
+
- The bundled transport accepts an `outputFormat`, but not all formats are available from the service.
|
|
725
|
+
- Output format values follow Microsoft Speech output formats (including Ogg/WebM Opus).
|
|
726
|
+
- Telegram `sendVoice` accepts OGG/MP3/M4A; use OpenAI/ElevenLabs if you need
|
|
727
|
+
guaranteed Opus voice messages.
|
|
728
|
+
- If the configured Microsoft output format fails, Nodmix retries with MP3.
|
|
729
|
+
|
|
730
|
+
OpenAI/ElevenLabs output formats are fixed per channel (see above).
|
|
731
|
+
|
|
732
|
+
## Auto-TTS behavior
|
|
733
|
+
|
|
734
|
+
When `messages.tts.auto` is enabled, Nodmix:
|
|
735
|
+
|
|
736
|
+
- Skips TTS if the reply already contains media or a `MEDIA:` directive.
|
|
737
|
+
- Skips very short replies (under 10 chars).
|
|
738
|
+
- Summarizes long replies when summaries are enabled, using
|
|
739
|
+
`summaryModel` (or `agents.defaults.model.primary`).
|
|
740
|
+
- Attaches the generated audio to the reply.
|
|
741
|
+
- In `mode: "final"`, still sends audio-only TTS for streamed final replies
|
|
742
|
+
after the text stream completes; the generated media goes through the same
|
|
743
|
+
channel media normalization as normal reply attachments.
|
|
744
|
+
|
|
745
|
+
If the reply exceeds `maxLength` and summary is off (or no API key for the
|
|
746
|
+
summary model), audio is skipped and the normal text reply is sent.
|
|
747
|
+
|
|
748
|
+
```text
|
|
749
|
+
Reply -> TTS enabled?
|
|
750
|
+
no -> send text
|
|
751
|
+
yes -> has media / MEDIA: / short?
|
|
752
|
+
yes -> send text
|
|
753
|
+
no -> length > limit?
|
|
754
|
+
no -> TTS -> attach audio
|
|
755
|
+
yes -> summary enabled?
|
|
756
|
+
no -> send text
|
|
757
|
+
yes -> summarize -> TTS -> attach audio
|
|
758
|
+
```
|
|
759
|
+
|
|
760
|
+
## Output formats by channel
|
|
761
|
+
|
|
762
|
+
| Target | Format |
|
|
763
|
+
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
|
|
764
|
+
| Feishu / Matrix / Telegram / WhatsApp | Voice-note replies prefer **Opus** (`opus_48000_64` from ElevenLabs, `opus` from OpenAI). 48 kHz / 64 kbps balances clarity and size. |
|
|
765
|
+
| Other channels | **MP3** (`mp3_44100_128` from ElevenLabs, `mp3` from OpenAI). 44.1 kHz / 128 kbps default for speech. |
|
|
766
|
+
| Talk / telephony | Provider-native **PCM** (Inworld 22050 Hz, Google 24 kHz), or `ulaw_8000` from Gradium for telephony. |
|
|
767
|
+
|
|
768
|
+
Per-provider notes:
|
|
769
|
+
|
|
770
|
+
- **Feishu / WhatsApp transcoding:** When a voice-note reply lands as MP3/WebM/WAV/M4A, the channel plugin transcodes to 48 kHz Ogg/Opus with `ffmpeg`. WhatsApp sends through Baileys with `ptt: true` and `audio/ogg; codecs=opus`. If conversion fails: Feishu falls back to attaching the original file; WhatsApp send fails rather than posting an incompatible PTT payload.
|
|
771
|
+
- **MiniMax / Xiaomi MiMo:** Default MP3 (32 kHz for MiniMax `speech-2.8-hd`); transcoded to 48 kHz Opus for voice-note targets via `ffmpeg`.
|
|
772
|
+
- **Local CLI:** Uses configured `outputFormat`. Voice-note targets are converted to Ogg/Opus and telephony output to raw 16 kHz mono PCM.
|
|
773
|
+
- **Google Gemini:** Returns raw 24 kHz PCM. Nodmix wraps as WAV for attachments, transcodes to 48 kHz Opus for voice-note targets, returns PCM directly for Talk/telephony.
|
|
774
|
+
- **Inworld:** MP3 attachments, native `OGG_OPUS` voice-note, raw `PCM` 22050 Hz for Talk/telephony.
|
|
775
|
+
- **xAI:** MP3 by default; `responseFormat` may be `mp3|wav|pcm|mulaw|alaw`. Uses xAI's batch REST endpoint — streaming WebSocket TTS is **not** used. Native Opus voice-note format is **not** supported.
|
|
776
|
+
- **Microsoft:** Uses `microsoft.outputFormat` (default `audio-24khz-48kbitrate-mono-mp3`). Telegram `sendVoice` accepts OGG/MP3/M4A; use OpenAI/ElevenLabs if you need guaranteed Opus voice messages. If the configured Microsoft format fails, Nodmix retries with MP3.
|
|
777
|
+
|
|
778
|
+
OpenAI and ElevenLabs output formats are fixed per channel as listed above.
|
|
779
|
+
|
|
780
|
+
## Field reference
|
|
781
|
+
|
|
782
|
+
<AccordionGroup>
|
|
783
|
+
<Accordion title="Top-level messages.tts.*">
|
|
784
|
+
<ParamField path="auto" type='"off" | "always" | "inbound" | "tagged"'>
|
|
785
|
+
Auto-TTS mode. `inbound` only sends audio after an inbound voice message; `tagged` only sends audio when the reply includes `[[tts:...]]` directives or a `[[tts:text]]` block.
|
|
786
|
+
</ParamField>
|
|
787
|
+
<ParamField path="enabled" type="boolean" deprecated>
|
|
788
|
+
Legacy toggle. `nodmix doctor --fix` migrates this to `auto`.
|
|
789
|
+
</ParamField>
|
|
790
|
+
<ParamField path="mode" type='"final" | "all"' default="final">
|
|
791
|
+
`"all"` includes tool/block replies in addition to final replies.
|
|
792
|
+
</ParamField>
|
|
793
|
+
<ParamField path="provider" type="string">
|
|
794
|
+
Speech provider id. When unset, Nodmix uses the first configured provider in registry auto-select order. Legacy `provider: "edge"` is rewritten to `"microsoft"` by `nodmix doctor --fix`.
|
|
795
|
+
</ParamField>
|
|
796
|
+
<ParamField path="persona" type="string">
|
|
797
|
+
Active persona id from `personas`. Normalized to lowercase.
|
|
798
|
+
</ParamField>
|
|
799
|
+
<ParamField path="personas.<id>" type="object">
|
|
800
|
+
Stable spoken identity. Fields: `label`, `description`, `provider`, `fallbackPolicy`, `prompt`, `providers.<provider>`. See [Personas](#personas).
|
|
801
|
+
</ParamField>
|
|
802
|
+
<ParamField path="summaryModel" type="string">
|
|
803
|
+
Cheap model for auto-summary; defaults to `agents.defaults.model.primary`. Accepts `provider/model` or a configured model alias.
|
|
804
|
+
</ParamField>
|
|
805
|
+
<ParamField path="modelOverrides" type="object">
|
|
806
|
+
Allow the model to emit TTS directives. `enabled` defaults to `true`; `allowProvider` defaults to `false`.
|
|
807
|
+
</ParamField>
|
|
808
|
+
<ParamField path="providers.<id>" type="object">
|
|
809
|
+
Provider-owned settings keyed by speech provider id. Legacy direct blocks (`messages.tts.openai`, `.elevenlabs`, `.microsoft`, `.edge`) are rewritten by `nodmix doctor --fix`; commit only `messages.tts.providers.<id>`.
|
|
810
|
+
</ParamField>
|
|
811
|
+
<ParamField path="maxTextLength" type="number">
|
|
812
|
+
Hard cap for TTS input characters. `/tts audio` fails if exceeded.
|
|
813
|
+
</ParamField>
|
|
814
|
+
<ParamField path="timeoutMs" type="number">
|
|
815
|
+
Request timeout in milliseconds.
|
|
816
|
+
</ParamField>
|
|
817
|
+
<ParamField path="prefsPath" type="string">
|
|
818
|
+
Override the local prefs JSON path (provider/limit/summary). Default `~/.nodmix/settings/tts.json`.
|
|
819
|
+
</ParamField>
|
|
820
|
+
</Accordion>
|
|
821
|
+
|
|
822
|
+
<Accordion title="Azure Speech">
|
|
823
|
+
<ParamField path="apiKey" type="string">Env: `AZURE_SPEECH_KEY`, `AZURE_SPEECH_API_KEY`, or `SPEECH_KEY`.</ParamField>
|
|
824
|
+
<ParamField path="region" type="string">Azure Speech region (e.g. `eastus`). Env: `AZURE_SPEECH_REGION` or `SPEECH_REGION`.</ParamField>
|
|
825
|
+
<ParamField path="endpoint" type="string">Optional Azure Speech endpoint override (alias `baseUrl`).</ParamField>
|
|
826
|
+
<ParamField path="voice" type="string">Azure voice ShortName. Default `en-US-JennyNeural`.</ParamField>
|
|
827
|
+
<ParamField path="lang" type="string">SSML language code. Default `en-US`.</ParamField>
|
|
828
|
+
<ParamField path="outputFormat" type="string">Azure `X-Microsoft-OutputFormat` for standard audio. Default `audio-24khz-48kbitrate-mono-mp3`.</ParamField>
|
|
829
|
+
<ParamField path="voiceNoteOutputFormat" type="string">Azure `X-Microsoft-OutputFormat` for voice-note output. Default `ogg-24khz-16bit-mono-opus`.</ParamField>
|
|
830
|
+
</Accordion>
|
|
831
|
+
|
|
832
|
+
<Accordion title="ElevenLabs">
|
|
833
|
+
<ParamField path="apiKey" type="string">Falls back to `ELEVENLABS_API_KEY` or `XI_API_KEY`.</ParamField>
|
|
834
|
+
<ParamField path="model" type="string">Model id (e.g. `eleven_multilingual_v2`, `eleven_v3`).</ParamField>
|
|
835
|
+
<ParamField path="voiceId" type="string">ElevenLabs voice id.</ParamField>
|
|
836
|
+
<ParamField path="voiceSettings" type="object">
|
|
837
|
+
`stability`, `similarityBoost`, `style` (each `0..1`), `useSpeakerBoost` (`true|false`), `speed` (`0.5..2.0`, `1.0` = normal).
|
|
838
|
+
</ParamField>
|
|
839
|
+
<ParamField path="applyTextNormalization" type='"auto" | "on" | "off"'>Text normalization mode.</ParamField>
|
|
840
|
+
<ParamField path="languageCode" type="string">2-letter ISO 639-1 (e.g. `en`, `de`).</ParamField>
|
|
841
|
+
<ParamField path="seed" type="number">Integer `0..4294967295` for best-effort determinism.</ParamField>
|
|
842
|
+
<ParamField path="baseUrl" type="string">Override ElevenLabs API base URL.</ParamField>
|
|
843
|
+
</Accordion>
|
|
844
|
+
|
|
845
|
+
<Accordion title="Google Gemini">
|
|
846
|
+
<ParamField path="apiKey" type="string">Falls back to `GEMINI_API_KEY` / `GOOGLE_API_KEY`. If omitted, TTS can reuse `models.providers.google.apiKey` before env fallback.</ParamField>
|
|
847
|
+
<ParamField path="model" type="string">Gemini TTS model. Default `gemini-3.1-flash-tts-preview`.</ParamField>
|
|
848
|
+
<ParamField path="voiceName" type="string">Gemini prebuilt voice name. Default `Kore`. Alias: `voice`.</ParamField>
|
|
849
|
+
<ParamField path="audioProfile" type="string">Natural-language style prompt prepended before spoken text.</ParamField>
|
|
850
|
+
<ParamField path="speakerName" type="string">Optional speaker label prepended before spoken text when your prompt uses a named speaker.</ParamField>
|
|
851
|
+
<ParamField path="promptTemplate" type='"audio-profile-v1"'>Set to `audio-profile-v1` to wrap active persona prompt fields in a deterministic Gemini TTS prompt structure.</ParamField>
|
|
852
|
+
<ParamField path="personaPrompt" type="string">Google-specific extra persona prompt text appended to the template's Director's Notes.</ParamField>
|
|
853
|
+
<ParamField path="baseUrl" type="string">Only `https://generativelanguage.googleapis.com` is accepted.</ParamField>
|
|
854
|
+
</Accordion>
|
|
855
|
+
|
|
856
|
+
<Accordion title="Gradium">
|
|
857
|
+
<ParamField path="apiKey" type="string">Env: `GRADIUM_API_KEY`.</ParamField>
|
|
858
|
+
<ParamField path="baseUrl" type="string">Default `https://api.gradium.ai`.</ParamField>
|
|
859
|
+
<ParamField path="voiceId" type="string">Default Emma (`YTpq7expH9539ERJ`).</ParamField>
|
|
860
|
+
</Accordion>
|
|
861
|
+
|
|
862
|
+
<Accordion title="Inworld">
|
|
863
|
+
### Inworld primary
|
|
864
|
+
|
|
865
|
+
<ParamField path="apiKey" type="string">Env: `INWORLD_API_KEY`.</ParamField>
|
|
866
|
+
<ParamField path="baseUrl" type="string">Default `https://api.inworld.ai`.</ParamField>
|
|
867
|
+
<ParamField path="modelId" type="string">Default `inworld-tts-1.5-max`. Also: `inworld-tts-1.5-mini`, `inworld-tts-1-max`, `inworld-tts-1`.</ParamField>
|
|
868
|
+
<ParamField path="voiceId" type="string">Default `Sarah`.</ParamField>
|
|
869
|
+
<ParamField path="temperature" type="number">Sampling temperature `0..2`.</ParamField>
|
|
870
|
+
|
|
871
|
+
</Accordion>
|
|
872
|
+
|
|
873
|
+
<Accordion title="Local CLI (tts-local-cli)">
|
|
874
|
+
<ParamField path="command" type="string">Local executable or command string for CLI TTS.</ParamField>
|
|
875
|
+
<ParamField path="args" type="string[]">Command arguments. Supports `{{Text}}`, `{{OutputPath}}`, `{{OutputDir}}`, `{{OutputBase}}` placeholders.</ParamField>
|
|
876
|
+
<ParamField path="outputFormat" type='"mp3" | "opus" | "wav"'>Expected CLI output format. Default `mp3` for audio attachments.</ParamField>
|
|
877
|
+
<ParamField path="timeoutMs" type="number">Command timeout in milliseconds. Default `120000`.</ParamField>
|
|
878
|
+
<ParamField path="cwd" type="string">Optional command working directory.</ParamField>
|
|
879
|
+
<ParamField path="env" type="Record<string, string>">Optional environment overrides for the command.</ParamField>
|
|
880
|
+
</Accordion>
|
|
881
|
+
|
|
882
|
+
<Accordion title="Microsoft (no API key)">
|
|
883
|
+
<ParamField path="enabled" type="boolean" default="true">Allow Microsoft speech usage.</ParamField>
|
|
884
|
+
<ParamField path="voice" type="string">Microsoft neural voice name (e.g. `en-US-MichelleNeural`).</ParamField>
|
|
885
|
+
<ParamField path="lang" type="string">Language code (e.g. `en-US`).</ParamField>
|
|
886
|
+
<ParamField path="outputFormat" type="string">Microsoft output format. Default `audio-24khz-48kbitrate-mono-mp3`. Not all formats are supported by the bundled Edge-backed transport.</ParamField>
|
|
887
|
+
<ParamField path="rate / pitch / volume" type="string">Percent strings (e.g. `+10%`, `-5%`).</ParamField>
|
|
888
|
+
<ParamField path="saveSubtitles" type="boolean">Write JSON subtitles alongside the audio file.</ParamField>
|
|
889
|
+
<ParamField path="proxy" type="string">Proxy URL for Microsoft speech requests.</ParamField>
|
|
890
|
+
<ParamField path="timeoutMs" type="number">Request timeout override (ms).</ParamField>
|
|
891
|
+
<ParamField path="edge.*" type="object" deprecated>Legacy alias. Run `nodmix doctor --fix` to rewrite persisted config to `providers.microsoft`.</ParamField>
|
|
892
|
+
</Accordion>
|
|
893
|
+
|
|
894
|
+
<Accordion title="MiniMax">
|
|
895
|
+
<ParamField path="apiKey" type="string">Falls back to `MINIMAX_API_KEY`. Token Plan auth via `MINIMAX_OAUTH_TOKEN`, `MINIMAX_CODE_PLAN_KEY`, or `MINIMAX_CODING_API_KEY`.</ParamField>
|
|
896
|
+
<ParamField path="baseUrl" type="string">Default `https://api.minimax.io`. Env: `MINIMAX_API_HOST`.</ParamField>
|
|
897
|
+
<ParamField path="model" type="string">Default `speech-2.8-hd`. Env: `MINIMAX_TTS_MODEL`.</ParamField>
|
|
898
|
+
<ParamField path="voiceId" type="string">Default `English_expressive_narrator`. Env: `MINIMAX_TTS_VOICE_ID`.</ParamField>
|
|
899
|
+
<ParamField path="speed" type="number">`0.5..2.0`. Default `1.0`.</ParamField>
|
|
900
|
+
<ParamField path="vol" type="number">`(0, 10]`. Default `1.0`.</ParamField>
|
|
901
|
+
<ParamField path="pitch" type="number">Integer `-12..12`. Default `0`. Fractional values are truncated before the request.</ParamField>
|
|
902
|
+
</Accordion>
|
|
903
|
+
|
|
904
|
+
<Accordion title="OpenAI">
|
|
905
|
+
<ParamField path="apiKey" type="string">Falls back to `OPENAI_API_KEY`.</ParamField>
|
|
906
|
+
<ParamField path="model" type="string">OpenAI TTS model id (e.g. `gpt-4o-mini-tts`).</ParamField>
|
|
907
|
+
<ParamField path="voice" type="string">Voice name (e.g. `alloy`, `cedar`).</ParamField>
|
|
908
|
+
<ParamField path="instructions" type="string">Explicit OpenAI `instructions` field. When set, persona prompt fields are **not** auto-mapped.</ParamField>
|
|
909
|
+
<ParamField path="extraBody / extra_body" type="Record<string, unknown>">Extra JSON fields merged into `/audio/speech` request bodies after generated OpenAI TTS fields. Use this for OpenAI-compatible endpoints such as Kokoro that require provider-specific keys like `lang`; unsafe prototype keys are ignored.</ParamField>
|
|
910
|
+
<ParamField path="baseUrl" type="string">
|
|
911
|
+
Override the OpenAI TTS endpoint. Resolution order: config → `OPENAI_TTS_BASE_URL` → `https://api.openai.com/v1`. Non-default values are treated as OpenAI-compatible TTS endpoints, so custom model and voice names are accepted.
|
|
912
|
+
</ParamField>
|
|
913
|
+
</Accordion>
|
|
914
|
+
|
|
915
|
+
<Accordion title="OpenRouter">
|
|
916
|
+
<ParamField path="apiKey" type="string">Env: `OPENROUTER_API_KEY`. Can reuse `models.providers.openrouter.apiKey`.</ParamField>
|
|
917
|
+
<ParamField path="baseUrl" type="string">Default `https://openrouter.ai/api/v1`. Legacy `https://openrouter.ai/v1` is normalized.</ParamField>
|
|
918
|
+
<ParamField path="model" type="string">Default `hexgrad/kokoro-82m`. Alias: `modelId`.</ParamField>
|
|
919
|
+
<ParamField path="voice" type="string">Default `af_alloy`. Alias: `voiceId`.</ParamField>
|
|
920
|
+
<ParamField path="responseFormat" type='"mp3" | "pcm"'>Default `mp3`.</ParamField>
|
|
921
|
+
<ParamField path="speed" type="number">Provider-native speed override.</ParamField>
|
|
922
|
+
</Accordion>
|
|
923
|
+
|
|
924
|
+
<Accordion title="Volcengine (BytePlus Seed Speech)">
|
|
925
|
+
<ParamField path="apiKey" type="string">Env: `VOLCENGINE_TTS_API_KEY` or `BYTEPLUS_SEED_SPEECH_API_KEY`.</ParamField>
|
|
926
|
+
<ParamField path="resourceId" type="string">Default `seed-tts-1.0`. Env: `VOLCENGINE_TTS_RESOURCE_ID`. Use `seed-tts-2.0` when your project has TTS 2.0 entitlement.</ParamField>
|
|
927
|
+
<ParamField path="appKey" type="string">App key header. Default `aGjiRDfUWi`. Env: `VOLCENGINE_TTS_APP_KEY`.</ParamField>
|
|
928
|
+
<ParamField path="baseUrl" type="string">Override the Seed Speech TTS HTTP endpoint. Env: `VOLCENGINE_TTS_BASE_URL`.</ParamField>
|
|
929
|
+
<ParamField path="voice" type="string">Voice type. Default `en_female_anna_mars_bigtts`. Env: `VOLCENGINE_TTS_VOICE`.</ParamField>
|
|
930
|
+
<ParamField path="speedRatio" type="number">Provider-native speed ratio.</ParamField>
|
|
931
|
+
<ParamField path="emotion" type="string">Provider-native emotion tag.</ParamField>
|
|
932
|
+
<ParamField path="appId / token / cluster" type="string" deprecated>Legacy Volcengine Speech Console fields. Env: `VOLCENGINE_TTS_APPID`, `VOLCENGINE_TTS_TOKEN`, `VOLCENGINE_TTS_CLUSTER` (default `volcano_tts`).</ParamField>
|
|
933
|
+
</Accordion>
|
|
934
|
+
|
|
935
|
+
<Accordion title="xAI">
|
|
936
|
+
<ParamField path="apiKey" type="string">Env: `XAI_API_KEY`.</ParamField>
|
|
937
|
+
<ParamField path="baseUrl" type="string">Default `https://api.x.ai/v1`. Env: `XAI_BASE_URL`.</ParamField>
|
|
938
|
+
<ParamField path="voiceId" type="string">Default `eve`. Live voices: `ara`, `eve`, `leo`, `rex`, `sal`, `una`.</ParamField>
|
|
939
|
+
<ParamField path="language" type="string">BCP-47 language code or `auto`. Default `en`.</ParamField>
|
|
940
|
+
<ParamField path="responseFormat" type='"mp3" | "wav" | "pcm" | "mulaw" | "alaw"'>Default `mp3`.</ParamField>
|
|
941
|
+
<ParamField path="speed" type="number">Provider-native speed override.</ParamField>
|
|
942
|
+
</Accordion>
|
|
943
|
+
|
|
944
|
+
<Accordion title="Xiaomi MiMo">
|
|
945
|
+
<ParamField path="apiKey" type="string">Env: `XIAOMI_API_KEY`.</ParamField>
|
|
946
|
+
<ParamField path="baseUrl" type="string">Default `https://api.xiaomimimo.com/v1`. Env: `XIAOMI_BASE_URL`.</ParamField>
|
|
947
|
+
<ParamField path="model" type="string">Default `mimo-v2.5-tts`. Env: `XIAOMI_TTS_MODEL`. Also supports `mimo-v2-tts`.</ParamField>
|
|
948
|
+
<ParamField path="voice" type="string">Default `mimo_default`. Env: `XIAOMI_TTS_VOICE`.</ParamField>
|
|
949
|
+
<ParamField path="format" type='"mp3" | "wav"'>Default `mp3`. Env: `XIAOMI_TTS_FORMAT`.</ParamField>
|
|
950
|
+
<ParamField path="style" type="string">Optional natural-language style instruction sent as the user message; not spoken.</ParamField>
|
|
951
|
+
</Accordion>
|
|
952
|
+
</AccordionGroup>
|
|
953
|
+
|
|
954
|
+
## Agent tool
|
|
955
|
+
|
|
956
|
+
The `tts` tool converts text to speech and returns an audio attachment for
|
|
957
|
+
reply delivery. On Feishu, Matrix, Telegram, and WhatsApp, the audio is
|
|
958
|
+
delivered as a voice message rather than a file attachment. Feishu and
|
|
959
|
+
WhatsApp can transcode non-Opus TTS output on this path when `ffmpeg` is
|
|
960
|
+
available.
|
|
961
|
+
|
|
962
|
+
WhatsApp sends audio through Baileys as a PTT voice note (`audio` with
|
|
963
|
+
`ptt: true`) and sends visible text **separately** from PTT audio because
|
|
964
|
+
clients do not consistently render captions on voice notes.
|
|
965
|
+
|
|
966
|
+
The tool accepts optional `channel` and `timeoutMs` fields; `timeoutMs` is a
|
|
967
|
+
per-call provider request timeout in milliseconds.
|
|
968
|
+
|
|
969
|
+
## Gateway RPC
|
|
970
|
+
|
|
971
|
+
| Method | Purpose |
|
|
972
|
+
| ----------------- | ---------------------------------------- |
|
|
973
|
+
| `tts.status` | Read current TTS state and last attempt. |
|
|
974
|
+
| `tts.enable` | Set local auto preference to `always`. |
|
|
975
|
+
| `tts.disable` | Set local auto preference to `off`. |
|
|
976
|
+
| `tts.convert` | One-off text → audio. |
|
|
977
|
+
| `tts.setProvider` | Set local provider preference. |
|
|
978
|
+
| `tts.setPersona` | Set local persona preference. |
|
|
979
|
+
| `tts.providers` | List configured providers and status. |
|
|
980
|
+
|
|
981
|
+
## Service links
|
|
982
|
+
|
|
983
|
+
- [OpenAI text-to-speech guide](https://platform.openai.com/docs/guides/text-to-speech)
|
|
984
|
+
- [OpenAI Audio API reference](https://platform.openai.com/docs/api-reference/audio)
|
|
985
|
+
- [Azure Speech REST text-to-speech](https://learn.microsoft.com/azure/ai-services/speech-service/rest-text-to-speech)
|
|
986
|
+
- [Azure Speech provider](/providers/azure-speech)
|
|
987
|
+
- [ElevenLabs Text to Speech](https://elevenlabs.io/docs/api-reference/text-to-speech)
|
|
988
|
+
- [ElevenLabs Authentication](https://elevenlabs.io/docs/api-reference/authentication)
|
|
989
|
+
- [Gradium](/providers/gradium)
|
|
990
|
+
- [Inworld TTS API](https://docs.inworld.ai/tts/tts)
|
|
991
|
+
- [MiniMax T2A v2 API](https://platform.minimaxi.com/document/T2A%20V2)
|
|
992
|
+
- [Volcengine TTS HTTP API](/providers/volcengine#text-to-speech)
|
|
993
|
+
- [Xiaomi MiMo speech synthesis](/providers/xiaomi#text-to-speech)
|
|
994
|
+
- [node-edge-tts](https://github.com/SchneeHertz/node-edge-tts)
|
|
995
|
+
- [Microsoft Speech output formats](https://learn.microsoft.com/azure/ai-services/speech-service/rest-text-to-speech#audio-outputs)
|
|
996
|
+
- [xAI text to speech](https://docs.x.ai/developers/rest-api-reference/inference/voice#text-to-speech-rest)
|
|
997
|
+
|
|
998
|
+
## Related
|
|
999
|
+
|
|
1000
|
+
- [Media overview](/tools/media-overview)
|
|
1001
|
+
- [Music generation](/tools/music-generation)
|
|
1002
|
+
- [Video generation](/tools/video-generation)
|
|
1003
|
+
- [Slash commands](/tools/slash-commands)
|
|
1004
|
+
- [Voice call plugin](/plugins/voice-call)
|