The registry is providers.toml under the platform user configuration
directory printed by limb config paths. On first use, limb writes these
built-in entries:
default_stt = "listenai"
default_tts = "listenai"
[providers.listenai]
kind = "both"
driver = "listenai"
stt_endpoint = "wss://api.listenai.com/v2/asr"
tts_endpoint = "wss://api.listenai.com/v1/tts/stream"
credential_env = "LISTENAI_API_KEY"
rate = 16000
channels = 1
sample_format = "s16le"
voice = "x5_lingxiaoxuan_flow"
[providers.whisper-local]
kind = "stt"
driver = "whisper-local"
command = "whisper-cli"
credential_env = "WHISPER_MODEL"
rate = 16000
channels = 1
sample_format = "s16le"The environment variable named by credential_env takes priority over the
user-only credentials.toml file. Credentials are never accepted as command
line arguments. limb config set-credential NAME reads a value from the
terminal, while limb config remove-credential NAME removes it.
driver = "listenai" speaks the documented ListenAI WebSocket protocol and
can point at another compatible endpoint without recompiling. A provider's
kind is stt, tts, or both. Audio requirements are explicit and are
validated before any PCM is forwarded. The built-in TTS path requests raw PCM
from the v2 stream endpoint and fetches only its returned secure_url. Existing
official stream_data entries are accepted as a legacy alias and migrated in
memory; custom compatible endpoints are left unchanged.
whisper-local invokes whisper-cli after the gated capture ends. Its model
path is read from WHISPER_MODEL or the stored whisper-local credential.
Install whisper.cpp's CLI and a model to use it. It intentionally cannot emit
partial results because its command interface is batch-oriented.
To leave the first-party cloud path, set default_stt = "whisper-local" or
add another compatible provider and select it with limb listen --stt NAME.
No firmware change is involved.