Conversation
- Update aimock to latest (multimodal endpoint support) - Add video-gen to Feature type, ALL_FEATURES, and feature configs - Fix feature-support provider sets: image-gen (openai, grok), tts/transcription/video-gen (openai only). Remove fake chat-routed sets - Add media-providers.ts with adapter factories for all 4 media types (image, tts, transcription, video) following the existing providers.ts pattern
- Rewrite api.image.ts, api.tts.ts, api.transcription.ts to use media-providers adapters with testId/aimockPort support - Create HTTP stream variants (api.*.stream.ts) using toHttpResponse - Create api.video.ts + api.video.stream.ts for video generation - All routes read from body.data (connection adapter format) - Add server-functions.ts with createServerFn wrappers for fetcher transport mode. Video fetcher handles full create+poll lifecycle.
- Create ImageGenUI, TTSUI, TranscriptionUI, VideoGenUI components with mode prop (sse | http-stream | fetcher) for transport selection - Wire media features into $feature.tsx with MEDIA_FEATURES set - Rewrite fixtures: image-gen uses data URI url, tts uses base64 audio, transcription uses audio.mpeg filename match - Register transcription/video fixtures programmatically in global-setup (aimock JSON loader doesn't set match.endpoint needed by these routes) - Video fixture includes id + status for OpenAI SDK compatibility
- Add mode param to featureUrl helper for transport selection - Add fillPrompt, fillTextInput, clickGenerate, waitForGenerationComplete helpers with React hydration wait and pressSequentially fallback - Rewrite image-gen, tts, transcription specs with 3 transport modes (sse, http-stream, fetcher) per provider - Create video-gen spec with 3 transport modes (60s timeout for polling)
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (2)
📝 WalkthroughWalkthroughRefactors E2E media testing: adds media UIs, adapter factories, server functions and API routes (SSE/HTTP-stream/fetcher), new video-gen feature and fixtures, updates route tree and tests, and restricts provider support for media features. Changes
Sequence DiagramsequenceDiagram
participant UI as Media UI
participant Client as Client Mode
participant ServerFn as Server Function
participant Adapter as Media Adapter
participant Provider as Provider API
participant LLMock as LLMock Server
UI->>Client: user fills input & clicks Generate
Client->>ServerFn: POST /api/<feature> (SSE/stream) or call server fn
ServerFn->>LLMock: ensureLLMock()
ServerFn->>Adapter: create<Feature>Adapter(provider, aimockPort, testId)
Adapter->>Provider: initialize client (base URL + headers)
ServerFn->>Provider: generate<Feature>(adapter, params, stream?)
Provider-->>LLMock: request matched to fixture
LLMock-->>Provider: fixture response (image/audio/text/video)
Provider-->>ServerFn: stream/return result
ServerFn-->>Client: stream/response
Client-->>UI: render result (data-testid)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~55 minutes Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🚀 Changeset Version PreviewNo changeset entries found. Merging this PR will not cause a version bump for any packages. |
|
View your CI Pipeline Execution ↗ for commit 2de2804
☁️ Nx Cloud last updated this comment at |
@tanstack/ai
@tanstack/ai-anthropic
@tanstack/ai-client
@tanstack/ai-code-mode
@tanstack/ai-code-mode-skills
@tanstack/ai-devtools-core
@tanstack/ai-elevenlabs
@tanstack/ai-event-client
@tanstack/ai-fal
@tanstack/ai-gemini
@tanstack/ai-grok
@tanstack/ai-groq
@tanstack/ai-isolate-cloudflare
@tanstack/ai-isolate-node
@tanstack/ai-isolate-quickjs
@tanstack/ai-ollama
@tanstack/ai-openai
@tanstack/ai-openrouter
@tanstack/ai-preact
@tanstack/ai-react
@tanstack/ai-react-ui
@tanstack/ai-solid
@tanstack/ai-solid-ui
@tanstack/ai-svelte
@tanstack/ai-vue
@tanstack/ai-vue-ui
@tanstack/preact-ai-devtools
@tanstack/react-ai-devtools
@tanstack/solid-ai-devtools
commit: |
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
testing/e2e/src/routes/$provider/$feature.tsx (1)
17-25:⚠️ Potential issue | 🟠 MajorReject unknown
modevalues at the route boundary.
search.modeis cast straight toMode. A typo then flows into the media UIs, whose fallback branch uses the fetcher transport, so a transport-specific test can pass while exercising the wrong path.🛠️ Proposed fix
return { testId: typeof search.testId === 'string' ? search.testId : undefined, aimockPort: port != null && !isNaN(port) ? port : undefined, - mode: typeof search.mode === 'string' ? (search.mode as Mode) : undefined, + mode: + search.mode === 'sse' || + search.mode === 'http-stream' || + search.mode === 'fetcher' + ? search.mode + : undefined, }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@testing/e2e/src/routes/`$provider/$feature.tsx around lines 17 - 25, The validateSearch function currently casts search.mode directly to Mode, allowing typos to pass through; update validateSearch to explicitly validate that search.mode is a string and one of the allowed Mode values before casting (e.g., check membership against Object.values(Mode) or a Mode whitelist) and return undefined for any unknown/invalid mode so the route boundary rejects unexpected mode values; adjust the mode assignment in validateSearch accordingly.
🧹 Nitpick comments (7)
testing/e2e/src/routes/api.image.stream.ts (1)
3-4: Fix import order per ESLint.Type imports should precede value imports.
Proposed fix
-import { createImageAdapter } from '@/lib/media-providers' import type { Provider } from '@/lib/types' +import { createImageAdapter } from '@/lib/media-providers'🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@testing/e2e/src/routes/api.image.stream.ts` around lines 3 - 4, ESLint flagged the import order: the type import "Provider" should come before the value import "createImageAdapter"; reorder the two imports so the type import (import type { Provider } from '@/lib/types') appears above the value import (import { createImageAdapter } from '@/lib/media-providers') to satisfy the rule and keep symbols Provider and createImageAdapter correctly referenced.testing/e2e/src/routes/api.tts.stream.ts (1)
3-4: Fix import order per ESLint.Type imports should precede value imports.
Proposed fix
-import { createTTSAdapter } from '@/lib/media-providers' import type { Provider } from '@/lib/types' +import { createTTSAdapter } from '@/lib/media-providers'🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@testing/e2e/src/routes/api.tts.stream.ts` around lines 3 - 4, The import order violates ESLint: move the type-only import for Provider before the value import createTTSAdapter; specifically, ensure the import "type { Provider }" appears above the import "{ createTTSAdapter }" so type imports precede value imports (update the import statements near createTTSAdapter and Provider accordingly).testing/e2e/src/routes/api.transcription.ts (1)
3-4: Fix import order per ESLint.Type imports should precede value imports for consistency.
Proposed fix
-import { createTranscriptionAdapter } from '@/lib/media-providers' import type { Provider } from '@/lib/types' +import { createTranscriptionAdapter } from '@/lib/media-providers'🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@testing/e2e/src/routes/api.transcription.ts` around lines 3 - 4, The import order violates ESLint: place the type-only import before value imports; specifically, move the type import "Provider" so the line "import type { Provider } from '@/lib/types'" appears above the value import "import { createTranscriptionAdapter } from '@/lib/media-providers'". Ensure "import type" is used (it already is) and run lint/format to confirm the corrected order.testing/e2e/src/routes/api.tts.ts (1)
3-4: Fix import order per ESLint.Type imports should precede value imports.
Proposed fix
-import { createTTSAdapter } from '@/lib/media-providers' import type { Provider } from '@/lib/types' +import { createTTSAdapter } from '@/lib/media-providers'🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@testing/e2e/src/routes/api.tts.ts` around lines 3 - 4, Imports are out of order per ESLint: move the type import of Provider to come before the value import createTTSAdapter; specifically, swap the two import lines so "import type { Provider } from '@/lib/types'" appears above "import { createTTSAdapter } from '@/lib/media-providers'". Ensure you use the "import type" form for Provider and keep the existing module specifiers and names unchanged.testing/e2e/src/lib/server-functions.ts (1)
9-15: Fix import ordering per ESLint rules.The type import from
@/lib/typesshould come before the value import from@/lib/media-providers.🔧 Proposed fix
+import type { Provider } from '@/lib/types' import { createImageAdapter, createTTSAdapter, createTranscriptionAdapter, createVideoAdapter, } from '@/lib/media-providers' -import type { Provider } from '@/lib/types'🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@testing/e2e/src/lib/server-functions.ts` around lines 9 - 15, Reorder the imports so the type-only import comes before value imports: move the `import type { Provider } from '@/lib/types'` line to appear above the `import { createImageAdapter, createTTSAdapter, createTranscriptionAdapter, createVideoAdapter } from '@/lib/media-providers'` statement in testing/e2e/src/lib/server-functions.ts to satisfy ESLint import ordering rules.testing/e2e/src/components/TranscriptionUI.tsx (1)
1-8: Fix import ordering per ESLint rules.Static analysis flags two import order issues:
fetchServerSentEventsshould come beforefetchHttpStreamalphabetically- Type import
@/lib/typesshould come before value import@/lib/server-functions🔧 Proposed fix
import { useTranscription, - fetchServerSentEvents, fetchHttpStream, + fetchServerSentEvents, } from '@tanstack/ai-react' -import { generateTranscriptionFn } from '@/lib/server-functions' import type { TranscriptionResult } from '@tanstack/ai' import type { Mode, Provider } from '@/lib/types' +import { generateTranscriptionFn } from '@/lib/server-functions'🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@testing/e2e/src/components/TranscriptionUI.tsx` around lines 1 - 8, Reorder the imports to satisfy ESLint: within the '@tanstack/ai-react' import place fetchServerSentEvents before fetchHttpStream (alphabetical), and move the type-only import of Mode and Provider from '@/lib/types' to appear before the value import generateTranscriptionFn from '@/lib/server-functions'; keep TranscriptionResult with its type import from '@tanstack/ai' unchanged. Ensure the import statements maintain their existing specifiers and only change ordering.testing/e2e/tests/helpers.ts (1)
142-166: Consider extracting shared input-filling logic.
fillPromptandfillTextInputare nearly identical, differing only in the test-id selector. For E2E test helpers this duplication is acceptable, but if more similar helpers emerge, consider a shared helper:async function fillInput(page: Page, testId: string, text: string, buttonTestId = 'generate-button') { ... }This is a minor suggestion given the E2E test context.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@testing/e2e/tests/helpers.ts` around lines 142 - 166, fillPrompt and fillTextInput duplicate the same input-filling logic with only the test-id differing; extract the shared behavior into a single helper (e.g., fillInput) that takes Page, testId (and optional buttonTestId) and performs click, fill, dispatchEvent('input'), checks the generate-button disabled state and falls back to clear + pressSequentially when needed; then replace fillPrompt and fillTextInput to call fillInput (or remove them and update callers) so the logic in functions fillPrompt and fillTextInput is consolidated and reused.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@testing/e2e/src/components/TranscriptionUI.tsx`:
- Around line 80-84: The UI currently reads the wrong property (result.text) in
TranscriptionUI; update the rendering to use the correct path
result.transcription.text (or safer optional chaining
result?.transcription?.text) and adjust the conditional so the component only
renders when transcription text exists (referencing the TranscriptionUI
component and the result variable/prop).
In `@testing/e2e/src/routes/api.video.stream.ts`:
- Around line 21-35: createVideoAdapter() can throw before the try/catch,
causing framework-level 500s instead of the JSON error shape; move the adapter
construction into the guarded path so any error from createVideoAdapter is
caught and returned as the JSON error response. Specifically, inside the route
where createVideoAdapter(provider, aimockPort, testId) is used, instantiate the
adapter within the try block that calls generateVideo(...) and
toHttpResponse(...), and apply the same change to the other new media routes
that follow this pattern so all adapter creation errors are handled by the
existing catch.
---
Outside diff comments:
In `@testing/e2e/src/routes/`$provider/$feature.tsx:
- Around line 17-25: The validateSearch function currently casts search.mode
directly to Mode, allowing typos to pass through; update validateSearch to
explicitly validate that search.mode is a string and one of the allowed Mode
values before casting (e.g., check membership against Object.values(Mode) or a
Mode whitelist) and return undefined for any unknown/invalid mode so the route
boundary rejects unexpected mode values; adjust the mode assignment in
validateSearch accordingly.
---
Nitpick comments:
In `@testing/e2e/src/components/TranscriptionUI.tsx`:
- Around line 1-8: Reorder the imports to satisfy ESLint: within the
'@tanstack/ai-react' import place fetchServerSentEvents before fetchHttpStream
(alphabetical), and move the type-only import of Mode and Provider from
'@/lib/types' to appear before the value import generateTranscriptionFn from
'@/lib/server-functions'; keep TranscriptionResult with its type import from
'@tanstack/ai' unchanged. Ensure the import statements maintain their existing
specifiers and only change ordering.
In `@testing/e2e/src/lib/server-functions.ts`:
- Around line 9-15: Reorder the imports so the type-only import comes before
value imports: move the `import type { Provider } from '@/lib/types'` line to
appear above the `import { createImageAdapter, createTTSAdapter,
createTranscriptionAdapter, createVideoAdapter } from '@/lib/media-providers'`
statement in testing/e2e/src/lib/server-functions.ts to satisfy ESLint import
ordering rules.
In `@testing/e2e/src/routes/api.image.stream.ts`:
- Around line 3-4: ESLint flagged the import order: the type import "Provider"
should come before the value import "createImageAdapter"; reorder the two
imports so the type import (import type { Provider } from '@/lib/types') appears
above the value import (import { createImageAdapter } from
'@/lib/media-providers') to satisfy the rule and keep symbols Provider and
createImageAdapter correctly referenced.
In `@testing/e2e/src/routes/api.transcription.ts`:
- Around line 3-4: The import order violates ESLint: place the type-only import
before value imports; specifically, move the type import "Provider" so the line
"import type { Provider } from '@/lib/types'" appears above the value import
"import { createTranscriptionAdapter } from '@/lib/media-providers'". Ensure
"import type" is used (it already is) and run lint/format to confirm the
corrected order.
In `@testing/e2e/src/routes/api.tts.stream.ts`:
- Around line 3-4: The import order violates ESLint: move the type-only import
for Provider before the value import createTTSAdapter; specifically, ensure the
import "type { Provider }" appears above the import "{ createTTSAdapter }" so
type imports precede value imports (update the import statements near
createTTSAdapter and Provider accordingly).
In `@testing/e2e/src/routes/api.tts.ts`:
- Around line 3-4: Imports are out of order per ESLint: move the type import of
Provider to come before the value import createTTSAdapter; specifically, swap
the two import lines so "import type { Provider } from '@/lib/types'" appears
above "import { createTTSAdapter } from '@/lib/media-providers'". Ensure you use
the "import type" form for Provider and keep the existing module specifiers and
names unchanged.
In `@testing/e2e/tests/helpers.ts`:
- Around line 142-166: fillPrompt and fillTextInput duplicate the same
input-filling logic with only the test-id differing; extract the shared behavior
into a single helper (e.g., fillInput) that takes Page, testId (and optional
buttonTestId) and performs click, fill, dispatchEvent('input'), checks the
generate-button disabled state and falls back to clear + pressSequentially when
needed; then replace fillPrompt and fillTextInput to call fillInput (or remove
them and update callers) so the logic in functions fillPrompt and fillTextInput
is consolidated and reused.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 666d6af6-2060-4aaf-89e8-9228d9d1d04b
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (30)
testing/e2e/fixtures/image-gen/basic.jsontesting/e2e/fixtures/transcription/basic.jsontesting/e2e/fixtures/tts/basic.jsontesting/e2e/fixtures/video-gen/basic.jsontesting/e2e/global-setup.tstesting/e2e/src/components/ImageGenUI.tsxtesting/e2e/src/components/TTSUI.tsxtesting/e2e/src/components/TranscriptionUI.tsxtesting/e2e/src/components/VideoGenUI.tsxtesting/e2e/src/lib/feature-support.tstesting/e2e/src/lib/features.tstesting/e2e/src/lib/media-providers.tstesting/e2e/src/lib/server-functions.tstesting/e2e/src/lib/types.tstesting/e2e/src/routeTree.gen.tstesting/e2e/src/routes/$provider/$feature.tsxtesting/e2e/src/routes/api.image.stream.tstesting/e2e/src/routes/api.image.tstesting/e2e/src/routes/api.transcription.stream.tstesting/e2e/src/routes/api.transcription.tstesting/e2e/src/routes/api.tts.stream.tstesting/e2e/src/routes/api.tts.tstesting/e2e/src/routes/api.video.stream.tstesting/e2e/src/routes/api.video.tstesting/e2e/tests/helpers.tstesting/e2e/tests/image-gen.spec.tstesting/e2e/tests/test-matrix.tstesting/e2e/tests/transcription.spec.tstesting/e2e/tests/tts.spec.tstesting/e2e/tests/video-gen.spec.ts
| {result && ( | ||
| <p data-testid="transcription-text" className="text-gray-200"> | ||
| {result.text} | ||
| </p> | ||
| )} |
There was a problem hiding this comment.
Bug: Incorrect property path for transcription text.
According to the TranscriptionResult type (see packages/typescript/ai/src/types.ts:1107-1120), the transcribed text is at result.transcription.text, not result.text. This will cause a runtime error or display undefined.
🐛 Proposed fix
{result && (
<p data-testid="transcription-text" className="text-gray-200">
- {result.text}
+ {result.transcription.text}
</p>
)}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| {result && ( | |
| <p data-testid="transcription-text" className="text-gray-200"> | |
| {result.text} | |
| </p> | |
| )} | |
| {result && ( | |
| <p data-testid="transcription-text" className="text-gray-200"> | |
| {result.transcription.text} | |
| </p> | |
| )} |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@testing/e2e/src/components/TranscriptionUI.tsx` around lines 80 - 84, The UI
currently reads the wrong property (result.text) in TranscriptionUI; update the
rendering to use the correct path result.transcription.text (or safer optional
chaining result?.transcription?.text) and adjust the conditional so the
component only renders when transcription text exists (referencing the
TranscriptionUI component and the result variable/prop).
| const adapter = createVideoAdapter(provider, aimockPort, testId) | ||
|
|
||
| try { | ||
| const stream = generateVideo({ | ||
| adapter, | ||
| prompt, | ||
| stream: true, | ||
| pollingInterval: 500, | ||
| }) | ||
| return toHttpResponse(stream, { abortController }) | ||
| } catch (error: any) { | ||
| return new Response(JSON.stringify({ error: error.message }), { | ||
| status: 500, | ||
| headers: { 'Content-Type': 'application/json' }, | ||
| }) |
There was a problem hiding this comment.
Move adapter construction into the guarded path.
createVideoAdapter() can throw before the try runs. When that happens, this route skips the JSON error response and surfaces a framework-level 500 instead of the shape the client hooks expect. The same pattern is repeated in the other new media routes.
🛠️ Proposed fix
- const adapter = createVideoAdapter(provider, aimockPort, testId)
-
try {
+ const adapter = createVideoAdapter(provider, aimockPort, testId)
const stream = generateVideo({
adapter,
prompt,
stream: true,
pollingInterval: 500,
})
return toHttpResponse(stream, { abortController })
- } catch (error: any) {
- return new Response(JSON.stringify({ error: error.message }), {
+ } catch (error) {
+ const message =
+ error instanceof Error ? error.message : 'Unknown error'
+ return new Response(JSON.stringify({ error: message }), {
status: 500,
headers: { 'Content-Type': 'application/json' },
})
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| const adapter = createVideoAdapter(provider, aimockPort, testId) | |
| try { | |
| const stream = generateVideo({ | |
| adapter, | |
| prompt, | |
| stream: true, | |
| pollingInterval: 500, | |
| }) | |
| return toHttpResponse(stream, { abortController }) | |
| } catch (error: any) { | |
| return new Response(JSON.stringify({ error: error.message }), { | |
| status: 500, | |
| headers: { 'Content-Type': 'application/json' }, | |
| }) | |
| try { | |
| const adapter = createVideoAdapter(provider, aimockPort, testId) | |
| const stream = generateVideo({ | |
| adapter, | |
| prompt, | |
| stream: true, | |
| pollingInterval: 500, | |
| }) | |
| return toHttpResponse(stream, { abortController }) | |
| } catch (error) { | |
| const message = | |
| error instanceof Error ? error.message : 'Unknown error' | |
| return new Response(JSON.stringify({ error: message }), { | |
| status: 500, | |
| headers: { 'Content-Type': 'application/json' }, | |
| }) | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@testing/e2e/src/routes/api.video.stream.ts` around lines 21 - 35,
createVideoAdapter() can throw before the try/catch, causing framework-level
500s instead of the JSON error shape; move the adapter construction into the
guarded path so any error from createVideoAdapter is caught and returned as the
JSON error response. Specifically, inside the route where
createVideoAdapter(provider, aimockPort, testId) is used, instantiate the
adapter within the try block that calls generateVideo(...) and
toHttpResponse(...), and apply the same change to the other new media routes
that follow this pattern so all adapter creation errors are handled by the
existing catch.
- Replace allowlist approach in global-setup with exclusion list to avoid missing fixture directories (caused one-shot-text and text-tool-text failures in CI) - Fix clickGenerate helper: wait for networkidle then verify the click actually triggered React by checking status leaves idle, with retry if hydration wasn't complete (fixes transcription idle state issue)
Summary
fetchServerSentEvents), HTTP stream (fetchHttpStream), and direct fetcher (createServerFn)ImageGenUI,TTSUI,TranscriptionUI,VideoGenUI) using theuseGenerateImage,useGenerateSpeech,useTranscription,useGenerateVideohooksWhat changed
Infrastructure:
video-genfeature typemedia-providers.tsadapter factory (image/tts/transcription/video)feature-support.tsprovider sets (removed fake all-provider sets)API Routes:
api.image.ts,api.tts.ts,api.transcription.tswith proper adapter usageapi.*.stream.ts) usingtoHttpResponseapi.video.ts+ stream variantbody.data(connection adapter format)UI:
modeprop (sse/http-stream/fetcher)$feature.tsxbranches onMEDIA_FEATURESset to render correct UIcreateServerFnfor fetcher transportTests:
match.endpoint)fillPrompt,fillTextInput,clickGenerate,waitForGenerationCompleteTest plan
pnpm --filter @tanstack/ai-e2e test:e2e -- --grep "image-gen|tts|transcription|video-gen"— 15/15 pass (11 first-try, 4 flaky on retry)pnpm --filter @tanstack/ai-e2e test:e2e -- --grep "chat"— 12/12 pass, no regressionspnpm --filter @tanstack/ai-e2e build— builds successfullyGenerated with Claude Code
Summary by CodeRabbit
New Features
Updates