Object generation failed with OpenAI

Issue

When using generateObject or streamObject with OpenAI's structured output generation, you may encounter a NoObjectGeneratedError with the finish reason content-filter. This error occurs when your Zod schema contains incompatible types that OpenAI's structured output feature cannot process.

// Problematic code - incompatible schema types
import { generateObject } from 'ai';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';
const result = await generateObject({
model: openai('gpt-4o-2024-08-06'),
schema: z.object({
name: z.string().nullish(), // ❌ .nullish() is not supported
email: z.string().optional(), // ❌ .optional() is not supported
age: z.number().nullable(), // ✅ .nullable() is supported
}),
prompt: 'Generate a user profile',
});
// Error: NoObjectGeneratedError: No object generated.
// Finish reason: content-filter

Background

OpenAI's structured output generation uses JSON Schema under the hood and has specific requirements for schema compatibility. The Zod methods .nullish() and .optional() generate JSON Schema patterns that are incompatible with OpenAI's implementation, causing the model to reject the schema and return a content-filter finish reason.

Solution

Replace .nullish() and .optional() with .nullable() in your Zod schemas when using structured output generation with OpenAI models.

import { generateObject } from 'ai';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';
// Correct approach - use .nullable()
const result = await generateObject({
model: openai('gpt-4o-2024-08-06'),
schema: z.object({
name: z.string().nullable(), // ✅ Use .nullable() instead of .nullish()
email: z.string().nullable(), // ✅ Use .nullable() instead of .optional()
age: z.number().nullable(),
}),
prompt: 'Generate a user profile',
});
console.log(result.object);
// { name: "John Doe", email: "john@example.com", age: 30 }
// or { name: null, email: null, age: 25 }

Schema Type Comparison

Zod TypeCompatibleJSON Schema Behavior
.nullable()✅ YesAllows null or the specified type
.optional()❌ NoField can be omitted (not supported)
.nullish()❌ NoAllows null, undefined, or omitted (not supported)