mirror of
https://github.com/getpaseo/paseo.git
synced 2026-07-29 12:01:31 +00:00
* feat(voice): configure OpenAI STT and TTS endpoints separately
Replace providers.openai.voice (a single apiKey/baseUrl shared by
speech-to-text and text-to-speech) with independent providers.openai.stt
and providers.openai.tts, each carrying its own apiKey/baseUrl. STT and
TTS now resolve fully independently, so they can point at different
OpenAI-compatible endpoints. The env equivalents OPENAI_VOICE_API_KEY /
OPENAI_VOICE_BASE_URL split into OPENAI_STT_* and OPENAI_TTS_*.
No backcompat: the voice key is removed and no longer read. Each feature
still falls back to providers.openai.apiKey/baseUrl, then OPENAI_API_KEY/
OPENAI_BASE_URL. Composer dictation resolves from the STT endpoint.
* fix(voice): keep daemon bootable and respect global OpenAI key
Two issues from review of the STT/TTS endpoint split:
- A config from an older release that still sets providers.openai.voice
crashed daemon startup, because the strict schema rejects the now-unknown
key. Strip it before parsing (alongside the existing local.autoDownload
strip) so the daemon boots; the value is discarded, not migrated.
- An empty endpoint env var (e.g. a copied .env.example leaving
OPENAI_STT_API_KEY= blank) shadowed the OPENAI_API_KEY fallback, so
speech was reported as missing credentials despite a configured global
key. firstDefined now skips empty/whitespace strings.
* fix(voice): isolate STT and TTS option parsing per endpoint
An STT-only OpenAI setup could be broken by a stale or invalid TTS env
var (e.g. a leftover TTS_VOICE/TTS_MODEL), because the single resolution
schema validated both endpoints' option groups before the per-endpoint
gate. Split into endpoint-key, STT-option, and TTS-option schemas and
parse each option group only when that endpoint has credentials, so an
unused endpoint's bad env can no longer take down the configured one.
* fix(voice): tag voice-config shim and update direct-daemon test callers
- Mark the providers.openai.voice strip with a COMPAT(openaiVoiceConfig)
comment + removal date so it shows up in the back-compat cleanup
inventory, per repo convention.
- Update the tests that build the daemon directly with a resolved OpenAI
config (bootstrap smoke + the real-API voice/daemon e2e suites) to the
new { stt, tts } shape; the old top-level { apiKey } is no longer read,
and these files are excluded from typecheck so the break was silent.
* fix(voice): update voice-roundtrip debug script to new OpenAI config shape
Last direct daemon caller still passing the removed top-level
openai: { apiKey }; the debug script lives outside tsconfig.scripts.json
so the stale shape wasn't caught by typecheck. Use { stt, tts }.
32 lines
1.1 KiB
Plaintext
32 lines
1.1 KiB
Plaintext
# OpenAI API Key (for GPT-4, Whisper STT, and TTS)
|
|
OPENAI_API_KEY=
|
|
|
|
# Optional: point speech-to-text and text-to-speech at different OpenAI-compatible
|
|
# endpoints. Each falls back to OPENAI_API_KEY / OPENAI_BASE_URL when unset.
|
|
# STT covers composer dictation + voice mode STT; TTS covers voice mode TTS.
|
|
OPENAI_STT_API_KEY=
|
|
OPENAI_STT_BASE_URL=
|
|
OPENAI_TTS_API_KEY=
|
|
OPENAI_TTS_BASE_URL=
|
|
|
|
# TTS Configuration (optional - defaults shown)
|
|
TTS_VOICE=alloy
|
|
# Available voices: alloy, echo, fable, onyx, nova, shimmer
|
|
TTS_MODEL=tts-1
|
|
# Available models: tts-1 (faster), tts-1-hd (higher quality)
|
|
|
|
# Server Configuration
|
|
# Location for runtime state (agents.json, etc.). Defaults to ~/.paseo
|
|
PASEO_HOME=~/.paseo
|
|
|
|
# Listen address. Defaults to 127.0.0.1:6767
|
|
# Can be host:port, /path/to/socket, or unix:///path/to/socket
|
|
PASEO_LISTEN=127.0.0.1:6767
|
|
|
|
# Debug recordings (dictation + STT input + TTS output)
|
|
# When enabled, recordings are saved under `${cwd}/.debug/recordings/`
|
|
PASEO_DICTATION_DEBUG=1
|
|
|
|
# Enable verbose Claude SDK stream logging (trace-level per-token logs)
|
|
PASEO_CLAUDE_DEBUG=1
|