Skip to content

feat(ai): add the input option to fakeText - #1695

Merged
AlemTuzlak merged 1 commit into
mainfrom
feat/fake-text-input
Oct 9, 2026
Merged

AlemTuzlak merged 1 commit into
mainfrom
feat/fake-text-input

Conversation

@AlemTuzlak

@AlemTuzlak AlemTuzlak commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

fakeText() takes an input option again, for example fakeText({ input: ['text', 'image'] }). It sets the fake's inputModalities, so you can test code that checks what a model accepts with no network. #1682 left the option out, because inputModalities was not on main yet. #1685 has landed since then.

🎯 Changes

  • FakeTextOptions and FakeTextAdapter get a TInput type parameter. Its default is ReadonlyArray<Modality>, so existing code does not change.
  • input sets inputModalities at run time and '~types'.inputModalities at type level.
  • inputModalities stays optional, as on TextAdapter, so the fake is still an adapter under exactOptionalPropertyTypes.
  • Note: chat() accepts a plain ModelMessage too, on purpose, so that wire payloads can be forwarded. So input: ['text'] does not make an image a type error in chat(). It types the adapter's modality data for the helper types.
  • Docs: an input row in the Options table of advanced/testing.md.
  • Changeset: @tanstack/ai minor.

✅ Checklist

  • I have followed the steps in the Contributing guide.
  • I have tested code changes locally with pnpm run test:pr, or these tests do not apply to this pull request.
  • I fully understand the code in this pull request, including any code generated with AI assistance.
  • Docs: I updated docs/ for this change, or this change is not user-facing.
  • Changeset: I added a changeset (pnpm changeset), or this PR does not change a published package.

🚀 Release Impact

  • This change affects published code, and I have generated a changeset.
  • This change is docs/CI/dev-only (no release).

Testing

Commands run

  • vitest run in packages/ai: 2116 tests pass, including the new sets inputModalities from the input option.
  • tsc for packages/ai, with type tests in fake-text.test-d.ts. They check two things:
    • input gives readonly ['text', 'image'].
    • inputModalities stays optional.
  • test:oxlint: clean. pnpm test:docs: no broken links.
  • Not run locally: pnpm test:pr and the E2E suite. CI runs them.

Manual test

  1. Run pnpm --dir packages/ai exec vitest run tests/fake-text.test.ts.
  2. In a scratch test, check that fakeText({ input: ['text', 'image'] }).inputModalities gives ['text', 'image'], and that fakeText().inputModalities is undefined.

How this PR makes testing easy: a unit test and a type test.

Risk / rollback

Low. This is a new optional option with a default type parameter. To undo, revert this PR.

Public API change

After

const fake = fakeText({ input: ['text', 'image'] })
fake.inputModalities // ['text', 'image']

Summary by CodeRabbit

  • New Features
    • Fake text models can now declare the input modalities they support, such as text or images. This information is available for checking model input support during tests.
  • Documentation
    • Updated the testing guide to explain how to specify and inspect a fake model’s input modalities.

@coderabbitai

coderabbitai Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository: TanStack/ai/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: a5fd31be-4964-43af-97de-b940b2c3d60a

📥 Commits

Reviewing files that changed from the base of the PR and between d84a49e and 32a38e3.


📒 Files selected for processing (6)
  • .changeset/fake-text-input.md
  • docs/advanced/testing.md
  • docs/config.json
  • packages/ai/src/testing/fake-text.ts
  • packages/ai/tests/fake-text.test-d.ts
  • packages/ai/tests/fake-text.test.ts

Included review availability: This review used your included allowance. Your plan provides up to 8 included reviews per hour; 7 remain after this review.



📝 Walkthrough

Walkthrough

fakeText accepts an optional input modality array and exposes it as inputModalities. Its generic types preserve the supplied modality tuple. Tests and documentation cover the option and its behavior.

Changes

Fake text input modalities

Layer / File(s) Summary
Input option, adapter, and validation
packages/ai/src/testing/fake-text.ts, packages/ai/tests/fake-text.test-d.ts, packages/ai/tests/fake-text.test.ts, docs/advanced/testing.md, docs/config.json, .changeset/fake-text-input.md
FakeTextOptions and fakeText carry a generic input modality type. FakeTextAdapter assigns the provided input array to inputModalities; the option remains unset when omitted. Type and runtime tests verify these behaviors. The testing documentation and changeset describe the option. The documentation entry’s updatedAt date is set to 2026-10-09.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Feature


Merge Risk: ⚪ Minimal · up to 32a38

The input option and its documented behavior appear ready to merge after normal checks.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check Passed The title clearly and concisely identifies the main change: adding the input option to fakeText().
Description check Passed The description includes the required Changes, Checklist, and Release Impact sections. It also documents implementation details, testing results, risks, and the public API change. The author clearly s…
Docstring Coverage Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 3 files. (3 skipped: 3 …
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.


✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR

🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR


  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@nx-cloud

nx-cloud Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

View your CI Pipeline Execution ↗ for commit 32a38e3

Command Status Duration Result
nx run-many --targets=build --exclude=examples/... ✅ Succeeded 2m 23s View ↗

☁️ Nx Cloud last updated this comment at 2026-10-09 15:25:15 UTC

@pkg-pr-new

pkg-pr-new Bot commented Oct 9, 2026

Copy link
Copy Markdown

Open in StackBlitz

@tanstack/ai

npm i https://pkg.pr.new/@tanstack/ai@1695

@tanstack/ai-acp

npm i https://pkg.pr.new/@tanstack/ai-acp@1695

@tanstack/ai-angular

npm i https://pkg.pr.new/@tanstack/ai-angular@1695

@tanstack/ai-anthropic

npm i https://pkg.pr.new/@tanstack/ai-anthropic@1695

@tanstack/ai-bedrock

npm i https://pkg.pr.new/@tanstack/ai-bedrock@1695

@tanstack/ai-byteplus

npm i https://pkg.pr.new/@tanstack/ai-byteplus@1695

@tanstack/ai-claude-code

npm i https://pkg.pr.new/@tanstack/ai-claude-code@1695

@tanstack/ai-client

npm i https://pkg.pr.new/@tanstack/ai-client@1695

@tanstack/ai-cloudflare

npm i https://pkg.pr.new/@tanstack/ai-cloudflare@1695

@tanstack/ai-code-mode

npm i https://pkg.pr.new/@tanstack/ai-code-mode@1695

@tanstack/ai-code-mode-snippets

npm i https://pkg.pr.new/@tanstack/ai-code-mode-snippets@1695

@tanstack/ai-codex

npm i https://pkg.pr.new/@tanstack/ai-codex@1695

@tanstack/ai-cohere

npm i https://pkg.pr.new/@tanstack/ai-cohere@1695

@tanstack/ai-compaction

npm i https://pkg.pr.new/@tanstack/ai-compaction@1695

@tanstack/ai-devtools-core

npm i https://pkg.pr.new/@tanstack/ai-devtools-core@1695

@tanstack/ai-durable-stream

npm i https://pkg.pr.new/@tanstack/ai-durable-stream@1695

@tanstack/ai-elevenlabs

npm i https://pkg.pr.new/@tanstack/ai-elevenlabs@1695

@tanstack/ai-event-client

npm i https://pkg.pr.new/@tanstack/ai-event-client@1695

@tanstack/ai-fal

npm i https://pkg.pr.new/@tanstack/ai-fal@1695

@tanstack/ai-gemini

npm i https://pkg.pr.new/@tanstack/ai-gemini@1695

@tanstack/ai-grok

npm i https://pkg.pr.new/@tanstack/ai-grok@1695

@tanstack/ai-grok-build

npm i https://pkg.pr.new/@tanstack/ai-grok-build@1695

@tanstack/ai-groq

npm i https://pkg.pr.new/@tanstack/ai-groq@1695

@tanstack/ai-isolate-cloudflare

npm i https://pkg.pr.new/@tanstack/ai-isolate-cloudflare@1695

@tanstack/ai-isolate-daytona

npm i https://pkg.pr.new/@tanstack/ai-isolate-daytona@1695

@tanstack/ai-isolate-e2b

npm i https://pkg.pr.new/@tanstack/ai-isolate-e2b@1695

@tanstack/ai-isolate-node

npm i https://pkg.pr.new/@tanstack/ai-isolate-node@1695

@tanstack/ai-isolate-quickjs

npm i https://pkg.pr.new/@tanstack/ai-isolate-quickjs@1695

@tanstack/ai-isolate-quickjs-bun

npm i https://pkg.pr.new/@tanstack/ai-isolate-quickjs-bun@1695

@tanstack/ai-llmgateway

npm i https://pkg.pr.new/@tanstack/ai-llmgateway@1695

@tanstack/ai-lovable

npm i https://pkg.pr.new/@tanstack/ai-lovable@1695

@tanstack/ai-mcp

npm i https://pkg.pr.new/@tanstack/ai-mcp@1695

@tanstack/ai-memory

npm i https://pkg.pr.new/@tanstack/ai-memory@1695

@tanstack/ai-mistral

npm i https://pkg.pr.new/@tanstack/ai-mistral@1695

@tanstack/ai-octane

npm i https://pkg.pr.new/@tanstack/ai-octane@1695

@tanstack/ai-ollama

npm i https://pkg.pr.new/@tanstack/ai-ollama@1695

@tanstack/ai-ollaya

npm i https://pkg.pr.new/@tanstack/ai-ollaya@1695

@tanstack/ai-openai

npm i https://pkg.pr.new/@tanstack/ai-openai@1695

@tanstack/ai-opencode

npm i https://pkg.pr.new/@tanstack/ai-opencode@1695

@tanstack/ai-openrouter

npm i https://pkg.pr.new/@tanstack/ai-openrouter@1695

@tanstack/ai-perplexity

npm i https://pkg.pr.new/@tanstack/ai-perplexity@1695

@tanstack/ai-persistence

npm i https://pkg.pr.new/@tanstack/ai-persistence@1695

@tanstack/ai-preact

npm i https://pkg.pr.new/@tanstack/ai-preact@1695

@tanstack/ai-react

npm i https://pkg.pr.new/@tanstack/ai-react@1695

@tanstack/ai-react-ui

npm i https://pkg.pr.new/@tanstack/ai-react-ui@1695

@tanstack/ai-reactor

npm i https://pkg.pr.new/@tanstack/ai-reactor@1695

@tanstack/ai-remix

npm i https://pkg.pr.new/@tanstack/ai-remix@1695

@tanstack/ai-sandbox

npm i https://pkg.pr.new/@tanstack/ai-sandbox@1695

@tanstack/ai-sandbox-blaxel

npm i https://pkg.pr.new/@tanstack/ai-sandbox-blaxel@1695

@tanstack/ai-sandbox-boxd

npm i https://pkg.pr.new/@tanstack/ai-sandbox-boxd@1695

@tanstack/ai-sandbox-cloudflare

npm i https://pkg.pr.new/@tanstack/ai-sandbox-cloudflare@1695

@tanstack/ai-sandbox-daytona

npm i https://pkg.pr.new/@tanstack/ai-sandbox-daytona@1695

@tanstack/ai-sandbox-docker

npm i https://pkg.pr.new/@tanstack/ai-sandbox-docker@1695

@tanstack/ai-sandbox-e2b

npm i https://pkg.pr.new/@tanstack/ai-sandbox-e2b@1695

@tanstack/ai-sandbox-local-process

npm i https://pkg.pr.new/@tanstack/ai-sandbox-local-process@1695

@tanstack/ai-sandbox-railway

npm i https://pkg.pr.new/@tanstack/ai-sandbox-railway@1695

@tanstack/ai-sandbox-sprites

npm i https://pkg.pr.new/@tanstack/ai-sandbox-sprites@1695

@tanstack/ai-sandbox-upstash-box

npm i https://pkg.pr.new/@tanstack/ai-sandbox-upstash-box@1695

@tanstack/ai-sandbox-vercel

npm i https://pkg.pr.new/@tanstack/ai-sandbox-vercel@1695

@tanstack/ai-skills

npm i https://pkg.pr.new/@tanstack/ai-skills@1695

@tanstack/ai-solid

npm i https://pkg.pr.new/@tanstack/ai-solid@1695

@tanstack/ai-solid-ui

npm i https://pkg.pr.new/@tanstack/ai-solid-ui@1695

@tanstack/ai-svelte

npm i https://pkg.pr.new/@tanstack/ai-svelte@1695

@tanstack/ai-typesafe

npm i https://pkg.pr.new/@tanstack/ai-typesafe@1695

@tanstack/ai-utils

npm i https://pkg.pr.new/@tanstack/ai-utils@1695

@tanstack/ai-vercel-gateway

npm i https://pkg.pr.new/@tanstack/ai-vercel-gateway@1695

@tanstack/ai-vertex

npm i https://pkg.pr.new/@tanstack/ai-vertex@1695

@tanstack/ai-vue

npm i https://pkg.pr.new/@tanstack/ai-vue@1695

@tanstack/ai-vue-ui

npm i https://pkg.pr.new/@tanstack/ai-vue-ui@1695

@tanstack/ai-worldlabs

npm i https://pkg.pr.new/@tanstack/ai-worldlabs@1695

@tanstack/openai-base

npm i https://pkg.pr.new/@tanstack/openai-base@1695

@tanstack/preact-ai-devtools

npm i https://pkg.pr.new/@tanstack/preact-ai-devtools@1695

@tanstack/react-ai-devtools

npm i https://pkg.pr.new/@tanstack/react-ai-devtools@1695

@tanstack/solid-ai-devtools

npm i https://pkg.pr.new/@tanstack/solid-ai-devtools@1695

@tanstack/svelte-ai-devtools

npm i https://pkg.pr.new/@tanstack/svelte-ai-devtools@1695

commit: 32a38e3

@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Coverage

✅ Coverage held across 66 compared package(s).

Each package is measured twice in this job — on this PR and on its merge-base with main — and compared. A metric fails only when it is at or above 60% on the merge-base and under 60% on this PR. Other drops are listed but do not fail. Packages your PR doesn't affect are not measured and not listed.

package statements branches functions lines
ai 90.77% (0.00) 83.52% (0.00) 91.51% (0.00) 92.45% (+0.01) ok
ai-acp 77.30% (0.00) 64.77% (0.00) 69.17% (0.00) 79.12% (0.00) ok
ai-angular 73.37% (0.00) 60.66% (0.00) 62.14% (0.00) 75.13% (0.00) ok
ai-anthropic 90.32% (0.00) 82.55% (0.00) 94.38% (0.00) 90.61% (0.00) ok
ai-bedrock 86.10% (0.00) 77.93% (0.00) 86.40% (0.00) 86.90% (0.00) ok
ai-byteplus 97.00% (0.00) 91.54% (0.00) 98.23% (0.00) 98.46% (0.00) ok
ai-claude-code 88.31% (0.00) 76.00% (0.00) 86.20% (0.00) 89.89% (0.00) ok
ai-client 86.46% (0.00) 79.22% (0.00) 84.61% (0.00) 88.40% (0.00) ok
ai-cloudflare 83.68% (0.00) 73.91% (0.00) 83.63% (0.00) 85.08% (0.00) ok
ai-code-mode 91.71% (0.00) 83.12% (0.00) 86.27% (0.00) 92.63% (0.00) ok
ai-code-mode-snippets 87.13% (0.00) 75.67% (0.00) 91.11% (0.00) 88.39% (0.00) ok
ai-codex 94.20% (0.00) 84.50% (0.00) 88.67% (0.00) 95.31% (0.00) ok
ai-cohere 88.97% (0.00) 88.37% (0.00) 85.71% (0.00) 91.80% (0.00) ok
ai-compaction 95.70% (0.00) 82.35% (0.00) 100.00% (0.00) 97.88% (0.00) ok
ai-devtools 83.13% (0.00) 72.77% (0.00) 87.07% (0.00) 85.22% (0.00) ok
ai-durable-stream 86.70% (0.00) 82.25% (0.00) 92.30% (0.00) 88.72% (0.00) ok
ai-elevenlabs 74.68% (0.00) 69.59% (0.00) 59.13% (0.00) 75.46% (0.00) ok
ai-fal 91.10% (0.00) 82.63% (0.00) 92.40% (0.00) 91.60% (0.00) ok
ai-gemini 65.55% (0.00) 64.41% (0.00) 60.95% (0.00) 66.34% (0.00) ok
ai-grok 48.31% (0.00) 52.65% (0.00) 55.86% (0.00) 49.12% (0.00) ok
ai-grok-build 77.70% (0.00) 61.78% (0.00) 76.10% (0.00) 79.42% (0.00) ok
ai-groq 50.22% (0.00) 47.17% (0.00) 64.28% (0.00) 52.33% (0.00) ok
ai-isolate-cloudflare 94.11% (0.00) 70.66% (0.00) 100.00% (0.00) 93.96% (0.00) ok
ai-isolate-daytona 90.25% (0.00) 80.59% (0.00) 100.00% (0.00) 90.15% (0.00) ok
ai-isolate-e2b 92.11% (0.00) 81.48% (-0.74) 97.36% (0.00) 95.05% (0.00) ok
ai-isolate-node 84.00% (0.00) 43.39% (0.00) 100.00% (0.00) 83.78% (0.00) ok
ai-isolate-quickjs 89.07% (0.00) 76.41% (0.00) 90.90% (0.00) 90.30% (0.00) ok
ai-isolate-quickjs-bun 7.76% (0.00) 8.08% (0.00) 5.00% (0.00) 8.33% (0.00) ok
ai-llmgateway 97.05% (0.00) 100.00% (0.00) 87.50% (0.00) 97.05% (0.00) ok
ai-lovable 72.35% (0.00) 55.63% (0.00) 84.61% (0.00) 73.08% (0.00) ok
ai-mcp 96.52% (0.00) 91.68% (0.00) 96.88% (0.00) 98.48% (0.00) ok
ai-memory 73.87% (0.00) 52.70% (0.00) 79.74% (0.00) 76.04% (0.00) ok
ai-mistral 83.81% (0.00) 75.20% (0.00) 92.95% (0.00) 84.29% (0.00) ok
ai-octane 90.56% (0.00) 71.48% (0.00) 86.60% (0.00) 90.75% (0.00) ok
ai-ollama 32.91% (0.00) 72.48% (0.00) 90.00% (0.00) 32.78% (0.00) ok
ai-ollaya 86.84% (0.00) 89.28% (0.00) 85.71% (0.00) 91.66% (0.00) ok
ai-openai 63.37% (0.00) 62.91% (0.00) 64.43% (0.00) 63.89% (0.00) ok
ai-opencode 66.33% (0.00) 56.77% (0.00) 61.62% (0.00) 68.68% (0.00) ok
ai-openrouter 85.12% (0.00) 67.97% (0.00) 89.24% (0.00) 86.97% (0.00) ok
ai-perplexity 91.34% (0.00) 90.43% (0.00) 100.00% (0.00) 93.87% (0.00) ok
ai-persistence 90.76% (0.00) 79.80% (0.00) 97.32% (0.00) 94.33% (0.00) ok
ai-preact 87.80% (0.00) 75.87% (0.00) 88.73% (0.00) 89.66% (0.00) ok
ai-react 73.13% (0.00) 52.16% (0.00) 75.54% (0.00) 73.08% (0.00) ok
ai-reactor 94.91% (0.00) 83.33% (0.00) 93.33% (0.00) 96.55% (0.00) ok
ai-remix 39.39% (0.00) 23.35% (0.00) 35.51% (0.00) 41.58% (0.00) ok
ai-sandbox 77.45% (0.00) 82.80% (0.00) 74.47% (0.00) 77.97% (0.00) ok
ai-sandbox-blaxel 87.64% (0.00) 77.18% (0.00) 82.26% (0.00) 89.71% (0.00) ok
ai-sandbox-boxd 95.86% (0.00) 87.12% (0.00) 95.31% (0.00) 98.17% (0.00) ok
ai-sandbox-cloudflare 67.91% (0.00) 57.47% (0.00) 71.79% (0.00) 69.62% (0.00) ok
ai-sandbox-daytona 82.70% (0.00) 81.89% (0.00) 67.14% (0.00) 85.18% (0.00) ok
ai-sandbox-docker 80.15% (0.00) 71.49% (0.00) 77.38% (0.00) 82.13% (0.00) ok
ai-sandbox-e2b 94.42% (0.00) 88.97% (0.00) 93.24% (0.00) 98.63% (0.00) ok
ai-sandbox-local-process 68.00% (0.00) 53.59% (0.00) 75.86% (0.00) 68.88% (0.00) ok
ai-sandbox-railway 94.75% (0.00) 92.68% (0.00) 90.90% (0.00) 97.59% (0.00) ok
ai-sandbox-sprites 73.23% (0.00) 59.70% (0.00) 73.83% (0.00) 76.17% (0.00) ok
ai-sandbox-upstash-box 94.82% (0.00) 91.52% (0.00) 91.04% (0.00) 97.76% (0.00) ok
ai-sandbox-vercel 44.67% (0.00) 38.18% (0.00) 35.18% (0.00) 45.76% (0.00) ok
ai-skills 80.38% (0.00) 64.05% (0.00) 84.86% (0.00) 82.44% (0.00) ok
ai-solid 53.73% (0.00) 40.45% (0.00) 51.94% (0.00) 57.78% (0.00) ok
ai-svelte 70.44% (0.00) 54.50% (0.00) 69.86% (0.00) 75.99% (0.00) ok
ai-typesafe 78.04% (0.00) 84.61% (0.00) 66.66% (0.00) 82.05% (0.00) ok
ai-vercel-gateway 69.45% (0.00) 52.98% (0.00) 84.78% (0.00) 73.18% (0.00) ok
ai-vertex 96.77% (0.00) 97.22% (0.00) 100.00% (0.00) 96.77% (0.00) ok
ai-vue 60.70% (0.00) 36.17% (0.00) 62.00% (0.00) 62.95% (0.00) ok
ai-worldlabs 79.62% (0.00) 71.50% (0.00) 91.42% (0.00) 82.66% (0.00) ok
openai-base 85.65% (0.00) 71.33% (0.00) 92.07% (0.00) 87.91% (0.00) ok

@AlemTuzlak
AlemTuzlak merged commit 723b4a4 into main Oct 9, 2026
15 checks passed
@AlemTuzlak
AlemTuzlak deleted the feat/fake-text-input branch October 9, 2026 15:35
@github-actions github-actions Bot mentioned this pull request Oct 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant