Skip to content

FEAT: Add tts and image generation support to xai extension#68694

Merged
steipete merged 2 commits into
openclaw:mainfrom
KateWilkins:main
Apr 22, 2026
Merged

FEAT: Add tts and image generation support to xai extension#68694
steipete merged 2 commits into
openclaw:mainfrom
KateWilkins:main

Conversation

@KateWilkins

@KateWilkins KateWilkins commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Summary

  • xAI extension lacked image generation and tts support (only video/speech).
  • Enables unified generateImage (both /v1/images/generations + /v1/images/edits with exact user-provided payload {image: {url, type:"image_url"}}), both models (grok-imagine-image default + grok-imagine-image-pro), main provider URL, b64 handling, and provider-http reuse (no duplication).
  • Added image-generation-provider.ts + test (modeled on openai + xai/video patterns), registration/manifest updates, model defs, and fixed all surfaced lint/TS errors (unused OpenAI imports/consts, SDK reexports for asFiniteNumber/trimToUndefined, type assertions,no-unused-vars/no-explicit-any).
  • Added tts.ts + test
  • What did NOT change (scope boundary): core SDK/image-generation contract, other providers/channels, no new deps, no breaking changes, no core edits.

Change Type (select all)

  • Feature

Scope (select all touched areas)

  • Integrations
  • API / contracts

Linked Issue/PR

N/A

Root Cause (if applicable)

N/A

Regression Test Plan (if applicable)

  • Coverage level that should have caught this: Existing coverage already
    sufficient + new unit test
  • Target test or file: extensions/xai/image-generation-provider.test.ts +
    plugin-registration.contract.test.ts
  • Scenario the test should lock in: capabilities (generate/edit/geometry),
    main URL, exact edit payload with singular image object, b64 -> asset
    conversion
  • Why this is the smallest reliable guardrail: Directly exercises provider
    contract + xAI-specific payload/HTTP path
  • Existing test that already covers this (if any): openai image provider +
    video pattern tests

User-visible / Behavior Changes

xAI now registers as an image generation provider (models selectable via XAI_IMAGE_MODELS; edit support via standard inputImages). No config/UI changes.

Diagram (if applicable)

N/A

Security Impact (required)

  • New permissions/capabilities? (No)
  • Secrets/tokens handling changed? (No)
  • New/changed network calls? (No — reuses existing resolveProviderHttpRequestConfig + postJsonRequest)
  • Command/tool execution surface changed? (No)
  • Data access scope changed? (No)
  • If any Yes, explain risk + mitigation: N/A

Repro + Verification

Environment

  • OS: macOS
  • Runtime/container: Node 22+/Bun
  • Model/provider: xAI (grok-imagine-image + pro)
  • Relevant config (redacted): models.providers.xai.apiKey=...

Steps

  1. openclaw config set models.providers.xai.apiKey=...
  2. Use image gen with provider=xai (prompt or inputImages for edit)
  3. Verify capabilities, edit payload matches xAI spec, b64 assets returned

Expected

  • Provider registers, supports generate/edit/geometry, uses correct URL/models/payload
  • No lint/TS errors

Actual

  • Matches (tests + tsgo clean)

Evidence

  • Failing test/log before + passing after (pnpm test extensions/xai)
  • Trace/log snippets (tsgo output clean)

Human Verification (required)

  • Verified scenarios: capabilities registration, generate/edit paths, exact edit payload with image: {url: dataUrl, type: "image_url"}, b64 conversion, model selection, main provider URL
  • Edge cases checked: invalid resolution/aspect (falls back), timeout/deadline, non-JSON errors (via shared tts test path)
  • What you did not verify: live image gen with real keys (mocked), mobile
    pairing impact

Review Conversations

  • I replied to or resolved every bot review conversation I addressed in
    this PR.
  • I left unresolved only the conversations that still need reviewer or
    maintainer judgment.

Compatibility / Migration

  • Backward compatible? (Yes)
  • Config/env changes? (No)
  • Migration needed? (No)

Risks and Mitigations

None.

@greptile-apps

greptile-apps Bot commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds image generation and TTS/speech providers to the xAI extension, following established patterns from the OpenAI and video-generation providers. The new image-generation-provider.ts, speech-provider.ts, and tts.ts files are well-structured with appropriate tests, and the manifest/registration updates are consistent.

Two unscoped changes in model-definitions.ts need attention before merging:

  • XAI_DEFAULT_CONTEXT_WINDOW was silently increased from 256 K to 1 M, expanding the advertised context window for grok-4 catalog entries without any mention in the PR description or changelog.
  • XAI_DEFAULT_MODEL_REF was changed from a string ("xai/grok-4") to a structured object ({ provider, model }), which alters the type re-exported by the public api.ts barrel while onboard.ts still exports the same name as a string — a type-contract collision on the public surface.

Confidence Score: 3/5

Not safe to merge as-is due to two unscoped changes in model-definitions.ts — an undocumented 4× context-window bump and a breaking type change on a public API export.

Two P1 findings in model-definitions.ts are outside the stated scope of the PR and could affect model capability reporting and downstream consumers of the public api.ts barrel. The new providers themselves look correct, but these collateral changes need explicit confirmation or revert before landing.

extensions/xai/model-definitions.ts — XAI_DEFAULT_CONTEXT_WINDOW value change and XAI_DEFAULT_MODEL_REF type change both warrant explicit reviewer sign-off.

Comments Outside Diff (3)

  1. extensions/xai/speech-provider.ts, line 562-571 (link)

    P2 Unused baseUrl parameter accepted but never read

    The first parameter baseUrl: string is declared and passed at the call site (config.baseUrl), but the function body only branches on target and configuredFormatbaseUrl is never referenced. If it was intended for custom-endpoint format selection (like tts.ts's isCustomXaiEndpoint), the logic is missing. If it's not needed, drop the parameter and the corresponding argument to avoid dead code and a likely lint warning.

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: extensions/xai/speech-provider.ts
    Line: 562-571
    
    Comment:
    **Unused `baseUrl` parameter accepted but never read**
    
    The first parameter `baseUrl: string` is declared and passed at the call site (`config.baseUrl`), but the function body only branches on `target` and `configuredFormat``baseUrl` is never referenced. If it was intended for custom-endpoint format selection (like `tts.ts`'s `isCustomXaiEndpoint`), the logic is missing. If it's not needed, drop the parameter and the corresponding argument to avoid dead code and a likely lint warning.
    
    
    
    How can I resolve this? If you propose a fix, please make it concise.
  2. extensions/xai/tts.ts, line 893 (link)

    P2 XAI_BASE_URL duplicated; already exported from model-definitions.ts via api.ts

    model-definitions.ts exports XAI_BASE_URL = "https://api.x.ai/v1" and that constant is re-exported through the public api.ts barrel. Re-declaring it here means the two values can drift if one is updated. speech-provider.ts already imports XAI_BASE_URL from ./tts.js; consider importing from ./api.js (or ./model-definitions.js) to have a single source of truth.

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: extensions/xai/tts.ts
    Line: 893
    
    Comment:
    **`XAI_BASE_URL` duplicated; already exported from `model-definitions.ts` via `api.ts`**
    
    `model-definitions.ts` exports `XAI_BASE_URL = "https://api.x.ai/v1"` and that constant is re-exported through the public `api.ts` barrel. Re-declaring it here means the two values can drift if one is updated. `speech-provider.ts` already imports `XAI_BASE_URL` from `./tts.js`; consider importing from `./api.js` (or `./model-definitions.js`) to have a single source of truth.
    
    How can I resolve this? If you propose a fix, please make it concise.
  3. extensions/xai/image-generation-provider.ts, line 422-424 (link)

    P2 fileName extension is always .png regardless of MIME type

    fileName is hardcoded to image-${idx + 1}.png even when mimeType is something other than image/png (e.g. image/webp, image/jpeg). The response type from xAI may vary. A small helper that maps the MIME type to the correct extension would keep the file name accurate.

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: extensions/xai/image-generation-provider.ts
    Line: 422-424
    
    Comment:
    **`fileName` extension is always `.png` regardless of MIME type**
    
    `fileName` is hardcoded to `image-${idx + 1}.png` even when `mimeType` is something other than `image/png` (e.g. `image/webp`, `image/jpeg`). The response type from xAI may vary. A small helper that maps the MIME type to the correct extension would keep the file name accurate.
    
    
    
    How can I resolve this? If you propose a fix, please make it concise.
Prompt To Fix All With AI
This is a comment left during a code review.
Path: extensions/xai/model-definitions.ts
Line: 7

Comment:
**Undocumented behavior change: context window silently expanded 4x**

`XAI_DEFAULT_CONTEXT_WINDOW` was quietly changed from `256_000` to `1_000_000` — a 4× increase — affecting the advertised context window of `grok-4`, `grok-4-0709`, and the fallback resolver path. The PR description says scope is limited to image gen / TTS with no model-definition behavior changes, so this looks like an unintended or at least undocumented side effect. If Grok 4 genuinely supports 1M tokens, this should be explicitly called out in the PR description and changelog so reviewers can validate the value against xAI's published limits.

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/xai/model-definitions.ts
Line: 14-17

Comment:
**`XAI_DEFAULT_MODEL_REF` type changed from `string` to `object` in the public API surface**

Before this PR, `model-definitions.ts` exported `XAI_DEFAULT_MODEL_REF = \`xai/${XAI_DEFAULT_MODEL_ID}\`` (a `string`). Now it exports `{ provider: "xai", model: "grok-4" }` (an object). Since `api.ts` re-exports `XAI_DEFAULT_MODEL_REF` from `model-definitions.ts`, any consumer of the xAI plugin's public `api.ts` barrel will now receive an object where they previously received a string — a breaking type-contract change.

`onboard.ts` still independently exports its own `XAI_DEFAULT_MODEL_REF` as a string (`\`xai/${XAI_DEFAULT_MODEL_ID}\``), so the two files now carry the same export name with different types. `index.ts` correctly imports the string from `onboard.js`, but the naming collision is fragile and will silently give callers the wrong type if they import via `api.ts`.

If the structured format is genuinely needed, it should use a distinct name (e.g. `XAI_DEFAULT_MODEL_REF_STRUCTURED`) to avoid shadowing the existing string export.

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/xai/speech-provider.ts
Line: 562-571

Comment:
**Unused `baseUrl` parameter accepted but never read**

The first parameter `baseUrl: string` is declared and passed at the call site (`config.baseUrl`), but the function body only branches on `target` and `configuredFormat``baseUrl` is never referenced. If it was intended for custom-endpoint format selection (like `tts.ts`'s `isCustomXaiEndpoint`), the logic is missing. If it's not needed, drop the parameter and the corresponding argument to avoid dead code and a likely lint warning.

```suggestion
function resolveSpeechResponseFormat(
  target: "audio-file" | "voice-note",
  configuredFormat?: XaiSpeechResponseFormat,
): XaiSpeechResponseFormat {
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/xai/index.ts
Line: 13

Comment:
**Duplicate import from the same module**

`buildXaiImageGenerationProvider` is imported in a separate statement rather than being merged into the existing `import { resolveXaiModelCompatPatch, ... } from "./api.js"` block above. This leaves two `import … from "./api.js"` declarations in the same file, which is redundant and may trigger the linter.

```suggestion
import {
  applyXaiModelCompat,
  buildXaiImageGenerationProvider,
  normalizeXaiModelId,
  resolveXaiTransport,
  resolveXaiModelCompatPatch,
  shouldContributeXaiCompat,
} from "./api.js";
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/xai/tts.ts
Line: 893

Comment:
**`XAI_BASE_URL` duplicated; already exported from `model-definitions.ts` via `api.ts`**

`model-definitions.ts` exports `XAI_BASE_URL = "https://api.x.ai/v1"` and that constant is re-exported through the public `api.ts` barrel. Re-declaring it here means the two values can drift if one is updated. `speech-provider.ts` already imports `XAI_BASE_URL` from `./tts.js`; consider importing from `./api.js` (or `./model-definitions.js`) to have a single source of truth.

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/xai/image-generation-provider.ts
Line: 422-424

Comment:
**`fileName` extension is always `.png` regardless of MIME type**

`fileName` is hardcoded to `image-${idx + 1}.png` even when `mimeType` is something other than `image/png` (e.g. `image/webp`, `image/jpeg`). The response type from xAI may vary. A small helper that maps the MIME type to the correct extension would keep the file name accurate.

```suggestion
              fileName: `image-${idx + 1}.${mimeType.split("/")[1] ?? "png"}`,
```

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "Add tts and image generation support to ..." | Re-trigger Greptile

Comment thread extensions/xai/model-definitions.ts Outdated
Comment thread extensions/xai/model-definitions.ts Outdated
Comment thread extensions/xai/index.ts Outdated

@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: e28dfee9ec

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/xai/speech-provider.ts

@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: 14cbe70abd

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/xai/tts.ts Outdated

@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: edfa1f1058

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/xai/model-definitions.ts Outdated
Comment thread extensions/xai/image-generation-provider.ts Outdated

@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: f438f8dea5

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/xai/tts.ts Outdated
Comment thread extensions/xai/tts.ts

@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: 272402a6d3

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/xai/speech-provider.ts Outdated
Comment thread extensions/xai/speech-provider.ts Outdated

@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: 8f7c132fee

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/xai/image-generation-provider.ts Outdated

@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: 39e244f148

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/xai/speech-provider.ts Outdated

@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: fabe25d5a3

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/xai/tts.ts Outdated

@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: fa5b93eee5

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/xai/speech-provider.ts Outdated

@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: aa319ef90c

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/xai/speech-provider.ts Outdated
Comment thread extensions/xai/image-generation-provider.ts Outdated

@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: 8284faf78b

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/xai/tts.ts Outdated
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation scripts Repository scripts size: XL and removed size: L labels Apr 22, 2026
@steipete
steipete merged commit f342da5 into openclaw:main Apr 22, 2026
72 checks passed
@steipete

Copy link
Copy Markdown
Contributor

Landed via temp rebase onto main and GitHub squash merge.

Validation:

  • pnpm docs:list
  • pnpm test extensions/xai
  • OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_TEST_QUIET=1 pnpm test:live -- extensions/xai/xai.live.test.ts
  • OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_TEST_QUIET=1 OPENCLAW_LIVE_IMAGE_GENERATION_PROVIDERS=xai pnpm test:live -- test/image-generation.runtime.live.test.ts
  • pnpm lint
  • pnpm build
  • pnpm check:changed
  • GitHub PR checks green on final head

Thanks @KateWilkins!

@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: 9909151713

ℹ️ 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 extensions/xai/tts.ts
return undefined;
}
const normalized = trimmed.toLowerCase();
if (normalized === "auto" || /^[a-z]{2,3}(?:-[a-z]{2,4})?$/.test(normalized)) {

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.

P2 Badge Accept full BCP-47 subtags in xAI language normalization

normalizeXaiLanguageCode currently allows only xx, xxx, or a single -subtag form, so valid BCP-47 values with multiple subtags (for example zh-Hant-TW or sr-Latn-RS) are rejected before the request is sent. This means multilingual/script-specific TTS requests fail locally despite the provider path and docs describing BCP-47 language support.

Useful? React with 👍 / 👎.

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 scripts Repository scripts size: XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants