home / skills / vercel / ai / capture-api-response-test-fixture
This skill captures and structures API response test fixtures from provider outputs to streamline testing and fixture generation.
npx playbooks add skill vercel/ai --skill capture-api-response-test-fixtureReview the files below or copy the command above to add this skill to your agents.
---
name: capture-api-response-test-fixture
description: Capture API response test fixture.
metadata:
internal: true
---
### API Response Test Fixtures
For provider response parsing tests, we aim at storing test fixtures with the true responses from the providers (unless they are too large in which case some cutting that does not change semantics is advised).
The fixtures are stored in a `__fixtures__` subfolder, e.g. `packages/openai/src/responses/__fixtures__`. See the file names in `packages/openai/src/responses/__fixtures__` for naming conventions and `packages/openai/src/responses/openai-responses-language-model.test.ts` for how to set up test helpers.
You can use our examples under `/examples/ai-functions` to generate test fixtures.
#### generateText (doGenerate testing)
For `generateText`, log the raw response output to the console and copy it into a new test fixture.
```ts
import { openai } from '@ai-sdk/openai';
import { generateText } from 'ai';
import { run } from '../lib/run';
run(async () => {
const result = await generateText({
model: openai('gpt-5-nano'),
prompt: 'Invent a new holiday and describe its traditions.',
});
console.log(JSON.stringify(result.response.body, null, 2));
});
```
#### streamText (doStream testing)
For `streamText`, you need to set `includeRawChunks` to `true` and use the special `saveRawChunks` helper. Run the script from the `/example/ai-functions` folder via `pnpm tsx src/stream-text/script-name.ts`. The result is then stored in the `/examples/ai-functions/output` folder. You can copy it to your fixtures folder and rename it.
```ts
import { openai } from '@ai-sdk/openai';
import { streamText } from 'ai';
import { run } from '../lib/run';
import { saveRawChunks } from '../lib/save-raw-chunks';
run(async () => {
const result = streamText({
model: openai('gpt-5-nano'),
prompt: 'Invent a new holiday and describe its traditions.',
includeRawChunks: true,
});
await saveRawChunks({ result, filename: 'openai-gpt-5-nano' });
});
```
This skill captures real API response test fixtures for language-model provider integrations. It helps teams record true provider outputs (or trimmed equivalents) so parser and behavior tests run against realistic data. The goal is reliable, reproducible tests for generate and stream flows.
The skill logs and saves raw provider responses into a __fixtures__ folder alongside the provider code. For standard generateText calls you serialize the response body; for streaming responses you enable includeRawChunks and use a helper that writes the raw chunks to disk. Saved fixtures become canonical inputs for parsing and unit tests.
What should I do if a response is too large?
Trim fields that don't affect parsed semantics, but keep structure and representative content intact. Document any trimming in the fixture filename or an adjacent README.
How do I capture streaming responses?
Enable includeRawChunks on the streamText call and use the provided saveRawChunks helper to write the raw chunks to the examples output folder, then move the saved file into the fixtures directory.