skills/add-tts-provider/SKILL.md
Add a new TTS provider to @aituber-onair/voice and wire it through engine implementation, public voice option types, internal engine handlers, factory registration, tests, docs, examples, and optional versioning updates. Use when requests include adding a TTS engine, supporting a voice provider or speech service, adding <provider> TTS, or updating supported voice providers.
npx skillsauth add shinshin86/aituber-onair add-tts-providerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Add a new TTS provider for @aituber-onair/voice while preserving the current
public API shape and usage style.
Collect missing inputs before editing:
engine_type: public engine id string (example: acmeTts)engine_class_name: engine class name (example: AcmeTtsEngine)display_name: user-facing provider name (example: Acme TTS)provider_kind: local or clouddefault_speaker: default speaker or voice id examplerequires_api_key: booleansupports_emotion: booleanoption_fields: provider-specific public option fields to add under
VoiceServiceOptionsdefault_api_url: optional default endpoint for local or overridable servicesexamples_scope: optional, one of docs-only, react-only, or
all-examples; default react-onlybump_version: boolean, default truenext_version: optional explicit target versionrg "<engine_type>|<engine_class_name>" packages/voicepackages/voice/src/services/VoiceService.tspackages/voice/src/services/internal/engineHandlers/packages/voice/src/engines/VoiceServiceOptions top-level naming style.VoiceEngineAdapter public usage unchanged.openai provider, add a new provider instead of
mutating openai.packages/voice/src/engines/<engine_class_name>.ts.VoiceEngine.packages/voice/src/constants/voiceEngine.ts.packages/voice/src/types/voiceEngine.ts.packages/voice/src/engines/index.ts.packages/voice/src/index.ts still exposes the engine via
export * from './engines';.<engine_class_name without Engine>VoiceServiceOptions to
packages/voice/src/services/VoiceService.ts.VoiceServiceOptions and VoiceServiceOptionsUpdate.<engine_type>ApiUrl, <engine_type>Speed, or provider-specific names.<engine_type>ApiUrl, <engine_type>Model, and <engine_type>Speed
instead of reusing openAi* fields.packages/voice/src/services/internal/engineHandlers/<engine_type>.ts.allowedUpdateKeysapplyOptions(engine, options)mergeOptions(current, update)packages/voice/src/services/internal/engineHandlers/index.ts.packages/voice/src/engines/VoiceEngineFactory.ts.packages/voice/tests/<engine_class_name>.test.ts.packages/voice/tests/VoiceEngineAdapter.test.ts.packages/voice/tests/index.test.ts.updateOptions() behavior for provider-specific fields.packages/voice/README.mdpackages/voice/README_ja.mdexamples_scope:
react-only, update
packages/voice/examples/react-basic/src/App.tsx
and the related example README if needed.ENGINE_DEFAULTS, engine selector options,
provider-specific controls, API key behavior, and custom API URL wiring.needsApiKey alone.all-examples, also add or update Node/Bun/Deno examples and example
READMEs.bump_version is true, prepare release updates for
@aituber-onair/voice:
next_version if provided.packages/voice/package.json.packages/voice/CHANGELOG.md.fmt, lint, test, and build.build too.<engine_type> to confirm expected placements.curl smoke test against that endpoint when the local service is
expected to be running.skills/add-tts-provider/references/voice-provider-touchpoints.mdRun commands from repository root:
npm -w @aituber-onair/voice run fmt
npm -w @aituber-onair/voice run lint
npm -w @aituber-onair/voice run test
npm -w @aituber-onair/voice run build
rg "<engine_type>|<engine_class_name>" packages/voice
VoiceEngineType includes the new engine id.VoiceServiceOptions supports the new provider without changing existing
public usage patterns.VoiceEngineFactory.getEngine() supports the new provider.updateOptions().bump_version is true.development
Wrap a practical local or self-hosted TTS engine behind an OpenAI-compatible `POST /v1/audio/speech` server, especially for Google Colab or browser-driven testing. Use when requests include exposing a TTS model as OpenAI-compatible speech, building a compatibility wrapper for a broadly usable local TTS, classifying how an upstream TTS should be adapted, adding JSON/CORS support, or debugging browser/CORS/422/500/runtime issues for custom TTS servers.
development
Apply released @aituber-onair/chat updates to @aituber-onair/core and core React examples, including dependency alignment, core re-exports, example model lists, docs, version/changelog, lockfiles, and verification. Use after chat package upgrades or when users ask to propagate chat changes into core.
testing
Add a new chat model id to @aituber-onair/chat and wire it through constants, provider implementation, tests, example UI selector, docs, and versioning updates. Use when requests include adding a new model, supporting a specific model id, adding a provider model, or updating supported models for providers such as claude, gemini, and openai.
development
Wrap a practical local or self-hosted TTS engine behind an OpenAI-compatible `POST /v1/audio/speech` server, especially for Google Colab or browser-driven testing. Use when requests include exposing a TTS model as OpenAI-compatible speech, building a compatibility wrapper for a broadly usable local TTS, classifying how an upstream TTS should be adapted, adding JSON/CORS support, or debugging browser/CORS/422/500/runtime issues for custom TTS servers.