Skip to content

feat(inworld): default to inworld-tts-2 (Realtime TTS-2)#77921

Open
cshape wants to merge 6 commits into
openclaw:mainfrom
cshape:tts-2
Open

feat(inworld): default to inworld-tts-2 (Realtime TTS-2)#77921
cshape wants to merge 6 commits into
openclaw:mainfrom
cshape:tts-2

Conversation

@cshape

@cshape cshape commented May 5, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds inworld-tts-2 to the bundled Inworld TTS provider as the new default,
while keeping inworld-tts-1.5-max and inworld-tts-1.5-mini as valid
options. Updates types, the plugin manifest, and docs accordingly.

Changes

  • extensions/inworld/tts.ts: flip DEFAULT_INWORLD_MODEL_ID to
    inworld-tts-2; prepend inworld-tts-2 to the INWORLD_TTS_MODELS
    literal union.
  • extensions/inworld/openclaw.plugin.json: update the modelId
    description so the surfaced default is inworld-tts-2.
  • docs/providers/inworld.md: default model now inworld-tts-2
    (Realtime TTS-2); configuration example, options table, and Models
    accordion updated; existing 1.5-max / 1.5-mini entries kept and
    surfaced with their human-readable names (Realtime TTS-1.5-Max /
    Realtime TTS-1.5-Mini).
  • docs/tools/tts.md: Inworld preset config example uses
    inworld-tts-2; Inworld primary modelId ParamField lists
    inworld-tts-2 as the default and keeps the older ids as
    alternatives.

Backwards compatibility

inworld-tts-1.5-max, inworld-tts-1.5-mini, inworld-tts-1-max,
and inworld-tts-1 remain in INWORLD_TTS_MODELS and are accepted
as valid modelId values. Existing configurations that pin a 1.5
model continue to work unchanged; only the default flips.

Test plan

  • pnpm tsgo (or repo's typecheck lane) on extensions/inworld
  • pnpm test extensions/inworld
  • Manual: smoke test a reply through the Inworld provider with no
    modelId configured and confirm the request payload sends
    inworld-tts-2
openclawtts2.mp4

@openclaw-barnacle openclaw-barnacle Bot added triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. docs Improvements or additions to documentation extensions: tts-local-cli extensions: inworld Extension: inworld plugin: azure-speech Azure Speech plugin size: XS labels May 5, 2026
@clawsweeper

clawsweeper Bot commented May 5, 2026

Copy link
Copy Markdown
Contributor

Codex review: found issues before merge. Reviewed July 3, 2026, 5:12 PM ET / 21:12 UTC.

Summary
This PR adds inworld-tts-2 to the Inworld speech provider, makes it the default, adds X-User-Agent: openclaw to Inworld requests, and updates tests, docs, config baseline hashes, and CHANGELOG.md.

PR surface: Source +4, Tests +2, Docs +6, Generated 0. Total +12 across 7 files.

Reproducibility: not applicable. as a bug reproduction; this is a feature/default-change PR. The upgrade-risk path is source-proven because missing Inworld modelId resolves through DEFAULT_INWORLD_MODEL_ID.

Review metrics: 1 noteworthy metric.

  • Provider default/model surfaces: 1 default changed, 1 accepted model added, 0 new config keys. The changed default affects existing unpinned Inworld users during upgrade even though the PR does not add a new config key.

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🦞 diamond lobster ✨ media proof bonus
Patch quality: 🦐 gold shrimp
Result: needs maintainer review before merge.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • Get maintainer sign-off on the default flip or keep inworld-tts-1.5-max as the default while adding TTS-2 as an option.
  • Rebase against current main and preserve response-read hardening plus speakerVoiceId docs wording.
  • Move the changelog text into the PR body or squash message and remove the CHANGELOG.md edit.

Risk before merge

  • [P1] Changing the default moves existing Inworld configurations that omit modelId from the shipped inworld-tts-1.5-max behavior to TTS-2 unless maintainers explicitly accept that upgrade behavior.
  • [P1] The PR is currently conflicting against main and must be refreshed without losing current bounded response-read hardening or current speakerVoiceId docs terminology.
  • [P1] Adding X-User-Agent: openclaw changes provider request metadata; it looks low-risk but should be an intentional provider behavior change.
  • [P1] The direct CHANGELOG.md edit conflicts with the repository's release-owned changelog workflow.

Maintainer options:

  1. Keep The Shipped Default (recommended)
    Preserve inworld-tts-1.5-max as the default, add TTS-2 as a selectable model, refresh docs/tests on current main, and remove the changelog edit.
  2. Accept The Default Flip
    Maintainers can intentionally approve moving unpinned Inworld users to TTS-2, then require a clean branch refresh that preserves current hardening and docs terminology.
  3. Pause Without Sponsorship
    If no maintainer wants to own the provider-default policy change, pause this PR or ask for a narrower PR that only exposes TTS-2 as an option.

Next step before merge

  • [P2] Needs maintainer product/upgrade judgment for the default flip plus an author branch refresh; this is not a safe autonomous repair lane as-is.

Security
Cleared: No concrete security or supply-chain issue was found; the diff changes provider request headers but not dependencies, scripts, permissions, credential storage, or secret handling.

Review findings

  • [P1] Preserve the shipped default unless maintainers accept it — extensions/inworld/tts.ts:6
  • [P3] Keep Inworld docs on speakerVoiceId — docs/providers/inworld.md:53-54
  • [P3] Remove the release-owned changelog edit — CHANGELOG.md:151
Review details

Best possible solution:

Expose TTS-2 as a supported Inworld model, preserve the shipped default unless maintainers explicitly sponsor the default flip, refresh the branch on current main, and keep release-note text in the PR body or squash message.

Do we have a high-confidence way to reproduce the issue?

Not applicable as a bug reproduction; this is a feature/default-change PR. The upgrade-risk path is source-proven because missing Inworld modelId resolves through DEFAULT_INWORLD_MODEL_ID.

Is this the best way to solve the issue?

No as-is: adding TTS-2 is provider-local and maintainable, but flipping the default requires maintainer product and upgrade acceptance. The safer path keeps the shipped default and adds TTS-2 as an option unless maintainers sponsor the default flip.

Full review comments:

  • [P1] Preserve the shipped default unless maintainers accept it — extensions/inworld/tts.ts:6
    Changing this constant moves every Inworld config without modelId from the shipped inworld-tts-1.5-max default to TTS-2. Keep the old default while adding TTS-2 as an option, or carry explicit maintainer acceptance and upgrade proof for the default flip.
    Confidence: 0.93
  • [P3] Keep Inworld docs on speakerVoiceId — docs/providers/inworld.md:53-54
    Current main documents speakerVoiceId as the docs-facing Inworld voice key, with voiceId as legacy wording. Refresh the docs against current main so the changed example and table do not reintroduce the old key as the primary path.
    Confidence: 0.87
  • [P3] Remove the release-owned changelog edit — CHANGELOG.md:151
    CHANGELOG.md is release-generated in this repo, so this PR should keep release-note context in the PR body or squash message instead of editing the changelog directly.
    Confidence: 0.89

Overall correctness: patch is incorrect
Overall confidence: 0.9

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 010b61746379.

Label changes

Label justifications:

  • P2: This is a normal provider model/default update with limited blast radius but meaningful compatibility review before merge.
  • merge-risk: 🚨 compatibility: Changing the default model can alter behavior for existing Inworld configurations that do not pin modelId.
  • merge-risk: 🚨 auth-provider: The PR changes provider model-selection behavior and provider request metadata for the Inworld speech provider.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (recording): The PR includes a GitHub-hosted MP4 recording tied by the body and comments to the no-modelId TTS-2 smoke path, and the artifact was verified as media.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR includes a GitHub-hosted MP4 recording tied by the body and comments to the no-modelId TTS-2 smoke path, and the artifact was verified as media.
  • proof: 🎥 video: Contributor real behavior proof includes video or recording evidence. The PR includes a GitHub-hosted MP4 recording tied by the body and comments to the no-modelId TTS-2 smoke path, and the artifact was verified as media.
Evidence reviewed

PR surface:

Source +4, Tests +2, Docs +6, Generated 0. Total +12 across 7 files.

View PR surface stats
Area Files Added Removed Net
Source 2 6 2 +4
Tests 1 3 1 +2
Docs 3 20 14 +6
Config 0 0 0 0
Generated 1 3 3 0
Other 0 0 0 0
Total 7 32 20 +12

What I checked:

  • Repository policy applied: Root AGENTS.md was read fully; it treats provider routing, config/default changes, docs, and changelog edits as compatibility or release-policy review surfaces. (AGENTS.md:23, 010b61746379)
  • Scoped policies applied: The extensions guide requires plugin metadata to stay accurate and the docs guide applies Mintlify/content rules; both scopes are touched by this PR. (extensions/AGENTS.md:1, 010b61746379)
  • Current main default: Current main still resolves missing Inworld modelId through DEFAULT_INWORLD_MODEL_ID, which is inworld-tts-1.5-max. (extensions/inworld/tts.ts:9, 010b61746379)
  • Current main config path: The provider normalizer uses trimToUndefined(raw?.modelId) ?? DEFAULT_INWORLD_MODEL_ID, so existing configs that omit modelId follow the default constant. (extensions/inworld/speech-provider.ts:53, 010b61746379)
  • Latest release default: The latest release tag v2026.6.11 also ships DEFAULT_INWORLD_MODEL_ID = "inworld-tts-1.5-max", so the PR changes shipped upgrade behavior for unpinned configs. (extensions/inworld/tts.ts:7, e085fa1a3ffd)
  • PR diff changes default and metadata: The PR diff changes DEFAULT_INWORLD_MODEL_ID to inworld-tts-2, prepends that model id, and adds X-User-Agent: openclaw to TTS and voices requests. (extensions/inworld/tts.ts:6, 752d8645c7f0)

Likely related people:

  • cshape: Authored the merged Inworld speech provider PR that introduced this model/default surface and authored the current default-change branch. (role: original feature contributor and current area contributor; confidence: high; commits: 0bcb4c95c185, 68cd2352c484; files: extensions/inworld/tts.ts, extensions/inworld/speech-provider.ts, docs/providers/inworld.md)
  • steipete: Merged the original Inworld speech provider PR and authored follow-up hardening in the same provider area. (role: reviewer, merger, and adjacent contributor; confidence: medium; commits: 0bcb4c95c185, a49957ad76a0; files: extensions/inworld/tts.ts, extensions/inworld/speech-provider.ts, extensions/inworld/tts.test.ts)
  • Alix-007: Authored the merged bounded-read hardening for Inworld TTS and voices, which is part of the current-main conflict this branch must preserve. (role: recent area contributor; confidence: medium; commits: 4c8470c0699c, dde714102644, a3acea84d4f1; files: extensions/inworld/tts.ts, extensions/inworld/tts.test.ts)
  • vincentkoc: Merged recent Inworld TTS hardening and malformed-response fixes, making them relevant to any branch refresh in this area. (role: recent reviewer/merger; confidence: medium; commits: 4c8470c0699c, c914f896a236; files: extensions/inworld/tts.ts, extensions/inworld/tts.test.ts)
  • solodmd: Authored the recent malformed voices JSON response guard in the same Inworld runtime file. (role: recent adjacent contributor; confidence: medium; commits: a8d0a1ff9228, c914f896a236; files: extensions/inworld/tts.ts, extensions/inworld/tts.test.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@cshape

cshape commented May 5, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper I've added proof of human-ness :)

@cshape

cshape commented May 5, 2026

Copy link
Copy Markdown
Contributor Author

Re Codex P0 "Real behavior proof": the smoke video is already linked at the bottom of the PR description (user-attachments/assets/998782bb-…); it shows the no-modelId path resolving to inworld-tts-2 and returning audio.

P2 (default-model assertion in extensions/inworld/tts.test.ts) and P3 (Unreleased ### Changes entry) are addressed in 39b321ecdb. Local proof: pnpm test extensions/inworld 26/26 green; pnpm config:docs:check clean (baseline regen included).

@cshape

cshape commented May 5, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper we can continue to send temperature and it's OK - it will be safely ignored in tts-2 and used in tts-1.5-max and mini.

@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 6, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 6, 2026
@cshape

cshape commented May 6, 2026

Copy link
Copy Markdown
Contributor Author

Re Codex P3 (docs/tools/tts.md:191 — TTS-2 temperature behavior): clarified in e972b30f08.

  • docs/tools/tts.md: dropped the temperature: 0.7 line from the Inworld TTS-2 example (it was misleading next to the new default) and replaced it with an inline comment noting that temperature is honored by inworld-tts-1.5-* / inworld-tts-1* and ignored by inworld-tts-2.
  • docs/providers/inworld.md: added the same model-scoped clarification to the temperature row in the Configuration options table and to the Models accordion. As I noted earlier, sending temperature against inworld-tts-2 is safe — Inworld silently ignores it — so existing pinned configs continue to work; the docs now make that explicit.

@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 6, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 6, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 6, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 6, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 7, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 7, 2026
@clawsweeper clawsweeper Bot added the rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. label May 31, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the stale Marked as stale due to inactivity label Jun 1, 2026
@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 🎥 video Contributor real behavior proof includes video or recording evidence. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 1, 2026
@openclaw-barnacle openclaw-barnacle Bot added the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label Jun 1, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 🎥 video Contributor real behavior proof includes video or recording evidence. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. labels Jun 14, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label Jun 14, 2026
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 🎥 video Contributor real behavior proof includes video or recording evidence. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 14, 2026
@openclaw-barnacle openclaw-barnacle Bot added the triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. label Jun 20, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 🎥 video Contributor real behavior proof includes video or recording evidence. labels Jun 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Improvements or additions to documentation extensions: inworld Extension: inworld extensions: tts-local-cli merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. plugin: azure-speech Azure Speech plugin proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 🎥 video Contributor real behavior proof includes video or recording evidence. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. size: XS status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant