diff --git a/docs/cli/doctor.md b/docs/cli/doctor.md index 17529eecb4c..5f4c00322e1 100644 --- a/docs/cli/doctor.md +++ b/docs/cli/doctor.md @@ -42,6 +42,8 @@ Notes: - `--fix` (alias for `--repair`) writes a backup to `~/.openclaw/openclaw.json.bak` and drops unknown config keys, listing each removal. - State integrity checks now detect orphan transcript files in the sessions directory and can archive them as `.deleted.` to reclaim space safely. - Doctor also scans `~/.openclaw/cron/jobs.json` (or `cron.store`) for legacy cron job shapes and can rewrite them in place before the scheduler has to auto-normalize them at runtime. +- Doctor auto-migrates legacy flat Talk config (`talk.voiceId`, `talk.modelId`, and friends) into `talk.provider` + `talk.providers.`. +- Repeat `doctor --fix` runs no longer report/apply Talk normalization when the only difference is object key order. - Doctor includes a memory-search readiness check and can recommend `openclaw configure --section model` when embedding credentials are missing. - If sandbox mode is enabled but Docker is unavailable, doctor reports a high-signal warning with remediation (`install Docker` or `openclaw config set agents.defaults.sandbox.mode off`). - If `gateway.auth.token`/`gateway.auth.password` are SecretRef-managed and unavailable in the current command path, doctor reports a read-only warning and does not write plaintext fallback credentials. diff --git a/docs/gateway/configuration-reference.md b/docs/gateway/configuration-reference.md index 0fbac248fb2..746368112c1 100644 --- a/docs/gateway/configuration-reference.md +++ b/docs/gateway/configuration-reference.md @@ -1845,24 +1845,31 @@ Defaults for Talk mode (macOS/iOS/Android). ```json5 { talk: { - voiceId: "elevenlabs_voice_id", - voiceAliases: { - Clawd: "EXAVITQu4vr4xnSDxMaL", - Roger: "CwhRBWXzGAHq8TQ4Fs17", + provider: "elevenlabs", + providers: { + elevenlabs: { + voiceId: "elevenlabs_voice_id", + voiceAliases: { + Clawd: "EXAVITQu4vr4xnSDxMaL", + Roger: "CwhRBWXzGAHq8TQ4Fs17", + }, + modelId: "eleven_v3", + outputFormat: "mp3_44100_128", + apiKey: "elevenlabs_api_key", + }, }, - modelId: "eleven_v3", - outputFormat: "mp3_44100_128", - apiKey: "elevenlabs_api_key", silenceTimeoutMs: 1500, interruptOnSpeech: true, }, } ``` +- `talk.provider` must match a key in `talk.providers` when multiple Talk providers are configured. +- Legacy flat Talk keys (`talk.voiceId`, `talk.voiceAliases`, `talk.modelId`, `talk.outputFormat`, `talk.apiKey`) are compatibility-only and are auto-migrated into `talk.providers.`. - Voice IDs fall back to `ELEVENLABS_VOICE_ID` or `SAG_VOICE_ID`. -- `apiKey` and `providers.*.apiKey` accept plaintext strings or SecretRef objects. +- `providers.*.apiKey` accepts plaintext strings or SecretRef objects. - `ELEVENLABS_API_KEY` fallback applies only when no Talk API key is configured. -- `voiceAliases` lets Talk directives use friendly names. +- `providers.*.voiceAliases` lets Talk directives use friendly names. - `silenceTimeoutMs` controls how long Talk mode waits after user silence before it sends the transcript. Unset keeps the platform default pause window (`700 ms on macOS and Android, 900 ms on iOS`). --- diff --git a/docs/gateway/doctor.md b/docs/gateway/doctor.md index 74998d18f64..105e16bff54 100644 --- a/docs/gateway/doctor.md +++ b/docs/gateway/doctor.md @@ -63,6 +63,7 @@ cat ~/.openclaw/openclaw.json - Health check + restart prompt. - Skills status summary (eligible/missing/blocked) and plugin status. - Config normalization for legacy values. +- Talk config migration from legacy flat `talk.*` fields into `talk.provider` + `talk.providers.`. - Browser migration checks for legacy Chrome extension configs and Chrome MCP readiness. - OpenCode provider override warnings (`models.providers.opencode` / `models.providers.opencode-go`). - OAuth TLS prerequisites check for OpenAI Codex OAuth profiles. @@ -104,6 +105,11 @@ If the config contains legacy value shapes (for example `messages.ackReaction` without a channel-specific override), doctor normalizes them into the current schema. +That includes legacy Talk flat fields. Current public Talk config is +`talk.provider` + `talk.providers.`. Doctor rewrites old +`talk.voiceId` / `talk.voiceAliases` / `talk.modelId` / `talk.outputFormat` / +`talk.apiKey` shapes into the provider map. + ### 2) Legacy config key migrations When the config contains deprecated keys, other commands refuse to run and ask @@ -128,6 +134,7 @@ Current migrations: - `routing.queue` → `messages.queue` - `routing.bindings` → top-level `bindings` - `routing.agents`/`routing.defaultAgentId` → `agents.list` + `agents.list[].default` +- legacy `talk.voiceId`/`talk.voiceAliases`/`talk.modelId`/`talk.outputFormat`/`talk.apiKey` → `talk.provider` + `talk.providers.` - `routing.agentToAgent` → `tools.agentToAgent` - `routing.transcribeAudio` → `tools.media.audio.models` - `messages.tts.` (`openai`/`elevenlabs`/`microsoft`/`edge`) → `messages.tts.providers.` @@ -216,7 +223,9 @@ These migrations are best-effort and idempotent; doctor will emit warnings when it leaves any legacy folders behind as backups. The Gateway/CLI also auto-migrates the legacy sessions + agent dir on startup so history/auth/models land in the per-agent path without a manual doctor run. WhatsApp auth is intentionally only -migrated via `openclaw doctor`. +migrated via `openclaw doctor`. Talk provider/provider-map normalization now +compares by structural equality, so key-order-only diffs no longer trigger +repeat no-op `doctor --fix` changes. ### 3a) Legacy plugin manifest migrations