Skip to content

Fix voice-call streaming provider resolution#97170

Merged
steipete merged 1 commit into
openclaw:mainfrom
solavrc:codex/fix-voice-call-streaming-provider-resolution
Jul 6, 2026
Merged

Fix voice-call streaming provider resolution#97170
steipete merged 1 commit into
openclaw:mainfrom
solavrc:codex/fix-voice-call-streaming-provider-resolution

Conversation

@solavrc

@solavrc solavrc commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

Fixes #97738

What Problem This Solves

talk.catalog reports transcription.activeProvider from the Talk/voice-call streaming config, but realtime transcription provider listing could return only the already-active runtime registry providers.

In a Gateway configured with plugins.entries["voice-call"].config.streaming.provider = "xai", the failure mode was:

  1. Gateway starts and can discover the xAI realtime transcription provider.
  2. Another path activates an OpenAI-only runtime registry.
  3. talk.catalog still reports activeProvider: "xai", but transcription.providers only contains openai.
  4. talk.session.create for Review voice then fails with Realtime transcription provider "xai" is not configured.

Root cause: Talk/voice-call streaming provider IDs were not consistently carried into realtime transcription provider resolution. The first version of this PR fixed catalog/config building, but talk.session.create still re-listed providers without the Talk-requested provider set, so the session path could still miss a cold provider when the active registry only contained OpenAI.

This patch keeps Talk-owned provider selection in Talk code. The generic capability resolver accepts explicit requestedProviderIds, and Talk passes its configured transcription provider IDs through both catalog and session resolution. It also reads both supported Voice Call config entry IDs: voice-call and @openclaw/voice-call.

Implementation Notes

  • Adds a generic requestedProviderIds option to resolvePluginCapabilityProviders.
  • Keeps voice-call / @openclaw/voice-call streaming config parsing in talk-shared.ts.
  • Uses the same requested provider set for talk.catalog, buildTalkTranscriptionConfig, and resolveConfiguredRealtimeTranscriptionProvider.
  • Adds regression coverage for active OpenAI-only registry plus configured xAI Voice Call streaming.
  • Adds regression coverage for scoped plugins.entries["@openclaw/voice-call"] config.

Evidence

Current head: 7e648d9b51fe08476a59ffb54dbc93a07bd0f412 after merging upstream main (5d8293c1fe404f607b3ecddcb9f12d1753a4de51).

Current local validation on this branch after the upstream-main merge:

node scripts/test-projects.mjs src/gateway/server-methods/talk.test.ts src/plugins/capability-provider-runtime.test.ts
Test Files  3 passed (3)
Tests       156 passed (156)
pnpm exec oxfmt --check --threads=1 src/plugins/capability-provider-runtime.ts src/gateway/server-methods/talk-shared.ts src/gateway/server-methods/talk.ts src/gateway/server-methods/talk.test.ts src/plugins/capability-provider-runtime.test.ts src/realtime-transcription/provider-registry.ts src/gateway/server-methods/talk-session.ts
All matched files use the correct format.
pnpm exec oxlint src/plugins/capability-provider-runtime.ts src/gateway/server-methods/talk-shared.ts src/gateway/server-methods/talk.ts src/gateway/server-methods/talk.test.ts src/plugins/capability-provider-runtime.test.ts src/realtime-transcription/provider-registry.ts src/gateway/server-methods/talk-session.ts
# passed

Real Gateway proof, redacted, using the same local config/auth state with voice-call.streaming.provider = "xai":

Before the completed fix, installed Gateway 2026.6.10 (aa69b12):

{
  "activeProvider": "xai",
  "providers": [
    {
      "id": "openai",
      "configured": true,
      "transports": ["gateway-relay"],
      "brains": ["none"],
      "defaultModel": "gpt-4o-transcribe"
    }
  ]
}
{
  "ok": false,
  "error": {
    "code": "UNAVAILABLE",
    "message": "Error: Realtime transcription provider \"xai\" is not configured"
  }
}

After the completed fix, patched source Gateway on a separate local port with channels skipped:

{
  "activeProvider": "xai",
  "providers": [
    {
      "id": "xai",
      "configured": true,
      "transports": ["gateway-relay"],
      "brains": ["none"]
    }
  ]
}
{
  "provider": "xai",
  "mode": "transcription",
  "transport": "gateway-relay",
  "audio": {
    "inputEncoding": "g711_ulaw",
    "inputSampleRateHz": 8000
  },
  "brain": "none"
}

Minimal Config / OAuth State Check

I also verified the provider/config interaction separately from the full local plugin set.

Minimal config used for the clean check:

{
  "gateway": {
    "mode": "local",
    "bind": "loopback",
    "auth": { "mode": "none" },
    "tailscale": { "mode": "off" }
  },
  "plugins": {
    "allow": ["voice-call", "xai"],
    "entries": {
      "voice-call": {
        "enabled": true,
        "config": {
          "streaming": {
            "enabled": true,
            "provider": "xai",
            "providers": {
              "xai": { "endpointingMs": 800 }
            }
          }
        }
      },
      "xai": { "enabled": true }
    }
  }
}

openclaw config validate --json passed with no warnings for that config.

With an empty temporary state dir, the same config returns the xAI provider but marks it unconfigured, as expected because no API key or OAuth profile exists there:

{
  "activeProvider": "xai",
  "providers": [
    { "id": "xai", "configured": false }
  ]
}

With the same minimal config and the existing local OpenClaw state/auth store, the xAI OAuth profile is used. No XAI_API_KEY or OPENAI_API_KEY was present in ~/.openclaw/.env during this check.

{
  "activeProvider": "xai",
  "providers": [
    {
      "id": "xai",
      "label": "xAI Realtime Transcription",
      "configured": true,
      "modes": ["transcription"],
      "transports": ["gateway-relay"],
      "brains": ["none"]
    }
  ]
}
{
  "provider": "xai",
  "mode": "transcription",
  "transport": "gateway-relay",
  "audio": {
    "inputEncoding": "g711_ulaw",
    "inputSampleRateHz": 8000
  },
  "brain": "none"
}

This confirms the expected X Premium / xAI OAuth state path works independently of the full local plugin set. The original failure is provider resolution under an already-active provider registry, not missing xAI credentials or an incorrect Voice Call config shape.

Behavior Changes Beyond the Fix

These are deliberate behavior changes that go beyond the narrow xAI session-resolution bug. Calling them out explicitly so maintainers can accept them consciously:

  1. Speech provider request collection filters models.providers keys to resolvable speech providers. collectRequestedSpeechProviderIds previously added every models.providers key (chat-model providers such as anthropic) to the speech cold-load request set, which polluted the requested scope. It now keeps only the keys that resolve to a speech-provider plugin through manifest contracts, so shared model-provider auth such as models.providers.google.apiKey (Google TTS) stays requested and cold-loadable under a partial active speech registry, while unrelated chat model providers like anthropic are excluded.

  2. Talk now reads plugins.entries["@openclaw/voice-call"] streaming config. The scoped package entry id was previously ignored by Talk (only voice-call was read), while doctor/update tooling already treats both ids as the same plugin. Precedence when both entries define streaming config: the scoped entry's provider wins, and providers maps are merged per key with the scoped entry overriding. A scoped entry with enabled: false is ignored, so stale disabled scoped config cannot override an enabled legacy entry; the legacy voice-call entry keeps its pre-existing read-regardless semantics. Impact: installs that still carry a stale scoped entry alongside the unscoped one can see the scoped values drive transcription provider selection after upgrade. The realtime section intentionally still reads only voice-call so the realtime catalog does not advertise an active provider it cannot list.

  3. requestedProviderIds on the shared capability resolver is additive-only. With an active registry it cold-loads requested providers the registry is missing and merges them in; with no active registry the load stays unscoped. Requested ids never narrow which providers are visible, so autoSelectOrder fallback keeps seeing every installed provider.

@openclaw-barnacle openclaw-barnacle Bot added size: S triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. labels Jun 27, 2026
@clawsweeper

clawsweeper Bot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed July 6, 2026, 3:20 AM ET / 07:20 UTC.

Summary
The PR adds Talk/provider-runtime logic and regression coverage to resolve configured realtime transcription providers missing from a partial active registry, while the live head also carries unrelated skill/build/docs changes already present on current main.

PR surface: Source +240, Tests +476, Docs +9, Config 0, Other 0. Total +725 across 20 files.

Reproducibility: yes. Current main still lists and resolves realtime transcription providers directly from the active registry, while the linked issue and PR proof show that path can hide the configured xAI Voice Call streaming provider.

Review metrics: 2 noteworthy metrics.

  • Current-main drift: 14 files duplicated from current-main-side changes. The PR is dirty because unrelated skill/build/session changes are already on current main and should not be reviewed as part of the Talk fix.
  • Stale PR context: body names old head 7e648d9; live head is 45bce87. Maintainers need the PR body and proof context to describe the rewritten exact head before using it for release or landing context.

Stored data model
Persistent data-model change detected: serialized state: src/config/sessions/skill-suggestions.ts, serialized state: src/config/sessions/types.ts, unknown-data-model-change: src/config/sessions/skill-suggestions.ts, vector/embedding metadata: package.json, vector/embedding metadata: scripts/build-all.mjs, vector/embedding metadata: test/scripts/build-all.test.ts. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #97738
Summary: This PR is the linked candidate fix for the canonical Voice Call xAI streaming transcription provider-resolution issue.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🦞 diamond lobster
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:

  • [P2] Refresh the branch onto current main so only the Talk/provider-runtime fix remains.
  • Update the PR body/evidence to describe head 45bce87 or its refreshed successor.
  • Rerun exact-head changed checks after the refresh.

Risk before merge

  • [P1] The live branch is dirty/diverged and carries unrelated changes that current main already has, so the merge result needs a branch refresh rather than review of the stale-base diff as-is.
  • [P1] The PR body still describes older requestedProviderIds/scoped-config behavior and an older head, which no longer matches the maintainer rewrite.
  • [P1] Provider resolution is compatibility-sensitive because the fix changes which auth-backed realtime transcription provider can be cold-loaded when an active registry is already narrowed.
  • [P1] Exact-head GitHub checks currently have failing lint/docs/topology jobs; they need to pass after the branch is refreshed.

Maintainer options:

  1. Refresh and update before merge (recommended)
    Rebase or rewrite onto current main, remove duplicate drift, update the PR body to the rewritten semantics, then rerun exact-head gates.
  2. Manual maintainer landing
    A maintainer could manually resolve the dirty branch and stale PR context, but should review the exact merge result before landing.
  3. Pause if resolver ownership is disputed
    Pause the PR if provider-runtime owners want a different boundary for configured transcription provider cold-loading.

Next step before merge

  • [P2] A maintainer should refresh the dirty branch and PR body; there is no narrow code defect for ClawSweeper to repair automatically.

Maintainer decision needed

  • Question: Should maintainers refresh this PR onto current main and land the rewritten Talk/provider-runtime fix despite the compatibility-sensitive provider-resolution change?
  • Rationale: The code fix matches the reported bug, but provider routing is an upgrade-sensitive surface and the current branch state is dirty with stale PR context, so automation should not decide the exact landing path.
  • Likely owner: steipete — They authored the maintainer rewrite and have the strongest recent Talk/provider-boundary history for this merge-risk choice.
  • Options:
    • Refresh then land (recommended): Rebase or rewrite onto current main, update the PR body to the rewritten semantics, rerun exact-head gates, and land if the merge result stays limited to the Talk/provider-runtime fix.
    • Accept manually: A maintainer can manually resolve the dirty branch and stale context, but should inspect the exact merge result before merging.
    • Pause for resolver ownership: Pause the PR if provider-runtime owners want a different boundary for configured transcription provider cold-loading.

Security
Cleared: No concrete security or supply-chain issue was found; the useful Talk fix adds no dependencies, workflows, lockfile changes, or new secret storage.

Review details

Best possible solution:

Keep the bounded Talk/provider-runtime fix, refresh the branch onto current main without duplicate drift, update the PR body to the rewritten exact-head semantics, and land only after exact-head gates pass.

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

Yes. Current main still lists and resolves realtime transcription providers directly from the active registry, while the linked issue and PR proof show that path can hide the configured xAI Voice Call streaming provider.

Is this the best way to solve the issue?

Yes for the rewritten Talk/provider-runtime fix; no for the current branch as a landing artifact until the dirty duplicate drift and stale PR body are refreshed.

AGENTS.md: found and applied where relevant.

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

Label changes

Label changes:

  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • remove rating: 🐚 platinum hermit: Current PR rating is rating: 🦐 gold shrimp, so this older rating label is no longer current.

Label justifications:

  • P2: This is a focused Gateway Talk/Voice Call provider-resolution bugfix with real xAI session impact but limited blast radius.
  • merge-risk: 🚨 compatibility: The Talk fix changes provider resolution behavior when a partial active provider registry is already present.
  • merge-risk: 🚨 auth-provider: The patch changes which auth-backed realtime transcription provider can be discovered and selected under mixed xAI/OpenAI configuration.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (live_output): The PR body includes redacted before/after Gateway catalog and session output, and the maintainer comment adds Testbox proof for the rewritten Talk head; the PR body should still be refreshed for exact-head accuracy.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes redacted before/after Gateway catalog and session output, and the maintainer comment adds Testbox proof for the rewritten Talk head; the PR body should still be refreshed for exact-head accuracy.
Evidence reviewed

PR surface:

Source +240, Tests +476, Docs +9, Config 0, Other 0. Total +725 across 20 files.

View PR surface stats
Area Files Added Removed Net
Source 9 295 55 +240
Tests 7 501 25 +476
Docs 2 9 0 +9
Config 1 3 3 0
Generated 0 0 0 0
Other 1 6 6 0
Total 20 814 89 +725

Acceptance criteria:

  • [P1] exact-head PR prepare/checks after rebase or rewrite.
  • [P1] focused Talk and capability-provider runtime tests cited by the maintainer rewrite.

What I checked:

  • Root policy read: Full root AGENTS.md was read; provider routing, config loading, fallback behavior, and PR review depth are compatibility-sensitive review inputs for this PR. (AGENTS.md:25, d7d19a3a8e0f)
  • Scoped provider policy read: The plugin scoped guide requires manifest-first resolution and cautions against broad runtime materialization, which applies to the capability-provider resolver changes. (src/plugins/AGENTS.md:1, d7d19a3a8e0f)
  • Current main still lacks the Talk fix: Current main still builds transcription config and session resolution from listRealtimeTranscriptionProviders(config), so a partial active registry can hide the configured Voice Call provider. (src/gateway/server-methods/talk-shared.ts:232, d7d19a3a8e0f)
  • PR head appends configured providers: The PR head adds listTalkTranscriptionProviders and uses getRealtimeTranscriptionProvider to append configured providers missing from the active transcription provider list. (src/gateway/server-methods/talk-shared.ts:133, 45bce87cb8d6)
  • PR head catalog path uses the Talk helper: The PR head maps talk.catalog transcription providers through listTalkTranscriptionProviders with the selected provider and provider-map keys. (src/gateway/server-methods/talk.ts:287, 45bce87cb8d6)
  • PR head resolves aliases in capability provider lookup: The PR head normalizes provider ids and aliases in findProviderById and falls back to capability owners when an alias is missing from the active registry. (src/plugins/capability-provider-runtime.ts:219, 45bce87cb8d6)

Likely related people:

  • steipete: Recent Talk settings and gateway/server-method history, earlier voice-call realtime provider boundary work, and the maintainer rewrite commits make this the strongest routing signal. (role: recent area contributor and rewrite owner; confidence: high; commits: 5e0504aa437e, a23ab9b906dc, 3b4e8b70f890; files: src/gateway/server-methods/talk-shared.ts, src/gateway/server-methods/talk.ts, src/realtime-transcription/provider-registry.ts)
  • vincentkoc: History shows voice-call config extraction and voice model/provider catalog work that shaped the current Talk transcription config path. (role: adjacent voice/config contributor; confidence: medium; commits: 59683978e146, 27b15a19e84c; files: src/gateway/server-methods/talk-shared.ts, packages/speech-core/voice-models.ts)
  • Solvely-Colin: Recent merged Android readiness work changed Talk catalog readiness and provider alias semantics adjacent to this provider-resolution surface. (role: recent adjacent Talk catalog contributor; confidence: medium; commits: 7cfc66ad0746; files: src/gateway/server-methods/talk.ts, src/gateway/server-methods/talk.test.ts)
  • RomneyDa: Recent shared capability-provider runtime work touches the resolver area extended by this PR. (role: recent capability-runtime contributor; confidence: medium; commits: 1d839d33397d; files: src/plugins/capability-provider-runtime.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.
Review history (2 earlier review cycles)
  • reviewed 2026-07-03T12:50:40.516Z sha 9bb9ac7 :: needs maintainer review before merge. :: none
  • reviewed 2026-07-06T00:25:28.281Z sha 7e648d9 :: needs maintainer review before merge. :: none

@solavrc
solavrc marked this pull request as ready for review June 27, 2026 03:35
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. labels Jun 27, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 95340b88d6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/plugins/capability-provider-runtime.ts Outdated
Comment thread src/plugins/capability-provider-runtime.ts Outdated
@openclaw-barnacle openclaw-barnacle Bot added gateway Gateway runtime and removed triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. labels Jun 27, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a4c589f5fc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/gateway/server-methods/talk-shared.ts Outdated
@solavrc

solavrc commented Jun 27, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper

@solavrc

solavrc commented Jun 27, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. 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. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 27, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f3782ec54e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/plugins/capability-provider-runtime.ts Outdated
Comment thread src/gateway/server-methods/talk.ts Outdated
Comment thread src/gateway/server-methods/talk-shared.ts Outdated
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. and removed 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. labels Jun 27, 2026
@solavrc

solavrc commented Jun 27, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the ClawSweeper review findings in 7679e13:

  • Kept talk.catalog transcription provider listing unscoped so the catalog returns the active provider plus all installed candidates.
  • Limited @openclaw/voice-call compat config reads to streaming, avoiding mismatched scoped realtime active providers.
  • Changed requested capability cold-load scoping to require all requested IDs to resolve via manifest contracts before narrowing, so mixed alias requests like openai-realtime + xai do not load only xAI.

Local verification:

  • node scripts/test-projects.mjs src/gateway/server-methods/talk.test.ts src/plugins/capability-provider-runtime.test.ts
  • pnpm exec oxfmt --check --threads=1 src/plugins/capability-provider-runtime.ts src/gateway/server-methods/talk-shared.ts src/gateway/server-methods/talk.test.ts src/plugins/capability-provider-runtime.test.ts
  • pnpm exec oxlint src/plugins/capability-provider-runtime.ts src/gateway/server-methods/talk-shared.ts src/gateway/server-methods/talk.test.ts src/plugins/capability-provider-runtime.test.ts

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper clawsweeper Bot added status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jul 3, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 151cf3c9b8

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/plugins/capability-provider-runtime.ts
Comment thread src/gateway/server-methods/talk-shared.ts Outdated
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. 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. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jul 3, 2026
@solavrc

solavrc commented Jul 3, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the two current ClawSweeper P1 compatibility findings in 9bb9ac7:

  • Speech requested-provider collection keeps models.providers keys that resolve to a speech-provider plugin through manifest contracts, so a provider configured only via shared model-provider auth such as models.providers.google.apiKey stays cold-loadable under a partial active speech registry. Unrelated chat model providers such as anthropic remain excluded. Regression: keeps resolvable models.providers speech providers requested for partial active registries.
  • Voice Call streaming config now skips a scoped @openclaw/voice-call entry with enabled: false, so stale disabled scoped config cannot override an enabled legacy voice-call entry. The legacy entry keeps its pre-existing read-regardless semantics. Regression: ignores disabled scoped @openclaw/voice-call streaming config.

Resolved the two matching connector threads as fixed and updated the PR body's behavior-change notes to match the new semantics.

Local verification:

  • node scripts/test-projects.mjs src/gateway/server-methods/talk.test.ts src/plugins/capability-provider-runtime.test.ts
  • pnpm check:test-types
  • pnpm tsgo:core
  • pnpm exec oxfmt --check --threads=1 src/plugins/capability-provider-runtime.ts src/plugins/capability-provider-runtime.test.ts src/gateway/server-methods/talk-shared.ts src/gateway/server-methods/talk.test.ts
  • pnpm exec oxlint src/plugins/capability-provider-runtime.ts src/plugins/capability-provider-runtime.test.ts src/gateway/server-methods/talk-shared.ts src/gateway/server-methods/talk.test.ts

All passed locally. GitHub checks are rerunning on the updated head.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper clawsweeper Bot added 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. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jul 3, 2026
solavrc added a commit to solavrc/openclaw that referenced this pull request Jul 6, 2026
Keep PR openclaw#97170 current with upstream Talk settings changes.

Codex automation: monitor-openclaw-pr-97170
@steipete steipete self-assigned this Jul 6, 2026
@steipete
steipete force-pushed the codex/fix-voice-call-streaming-provider-resolution branch from 7e648d9 to 3b4e8b7 Compare July 6, 2026 06:53
@steipete

steipete commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Maintainer rewrite complete and land-ready.

What changed:

  • Replaced the original mixed-scope expansion with a bounded Talk/capability-provider fix.
  • Cold-loads Voice Call streaming providers selected directly or present in the streaming provider map, even when another provider registry is already active.
  • Resolves normalized runtime aliases while preserving exact canonical-provider precedence.
  • Added the changelog entry and preserved contributor credit.

Proof on rewritten head 3b4e8b70f890eb16005f3d6ce11d0111ad85244f:

  • Blacksmith Testbox tbx_01kwv1rqrvvjkxyar0mgw0cpws: focused Talk and capability-runtime suites, 137/137 tests passed.
  • Same Testbox: pnpm check:changed passed, including core/core-test typechecks, changed-file lint, dependency and architecture guards, and import-cycle verification.
  • Fresh autoreview after three fix rounds: no actionable findings.
  • Review artifacts validated with READY FOR /prepare-pr and no proof gaps.

The rewrite removes unrelated config-precedence and speech-filtering changes from the submitted patch while fixing the linked #97738 behavior at the owning boundaries. Thanks @solavrc for the report and initial implementation.

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation scripts Repository scripts labels Jul 6, 2026
@steipete

steipete commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Merged via squash.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gateway Gateway runtime 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. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. size: M status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Voice Call xAI streaming transcription provider is dropped after OpenAI-only runtime activation

2 participants