OpenAI에서 객체 생성이 실패해요
OpenAI에서 객체 생성이 실패해요 (Object generation failed with OpenAI)
OpenAI로 구조화된 출력(structured output)을 생성할 때 NoObjectGeneratedError와 content-filter finish reason이 나는 문제와 해결 방법을 알려드려요. 주로 Zod 스키마에 OpenAI가 처리할 수 없는 타입이 들어갔을 때 발생해요.
출처: 문서
본문
문제 (Issue)
OpenAI로 구조화된 출력 생성 시 NoObjectGeneratedError가 finish reason content-filter와 함께 발생할 수 있어요. 이 에러는 Zod 스키마가 OpenAI의 구조화 출력 기능이 처리할 수 없는 호환 불가능한 타입을 포함할 때 발생해요.
// 문제가 되는 코드 - 호환되지 않는 스키마 타입
import { generateText, Output } from 'ai';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';
const result = await generateText({
model: openai('gpt-4o-2024-08-06'),
output: Output.object({
schema: z.object({
name: z.string().nullish(), // ❌ .nullish()는 지원되지 않음
email: z.string().optional(), // ❌ .optional()은 지원되지 않음
age: z.number().nullable(), // ✅ .nullable()은 지원됨
}),
}),
prompt: 'Generate a user profile',
});
// 에러: NoObjectGeneratedError: No object generated.
// Finish reason: content-filter
배경 (Background)
OpenAI의 구조화 출력 생성은 내부적으로 JSON Schema를 사용하며 스키마 호환성에 대한 특정 요구사항이 있어요. Zod 메서드 .nullish()와 .optional()은 OpenAI 구현과 호환되지 않는 JSON Schema 패턴을 생성해서, 모델이 스키마를 거부하고 content-filter finish reason을 반환하게 해요.
해결 방법 (Solution)
OpenAI 모델로 구조화된 출력 생성 시 Zod 스키마에서 .nullish()와 .optional()을 .nullable()로 교체하세요.
import { generateText, Output } from 'ai';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';
// 올바른 접근 - .nullable() 사용
const result = await generateText({
model: openai('gpt-4o-2024-08-06'),
output: Output.object({
schema: z.object({
name: z.string().nullable(), // ✅ .nullish() 대신 .nullable() 사용
email: z.string().nullable(), // ✅ .optional() 대신 .nullable() 사용
age: z.number().nullable(),
}),
}),
prompt: 'Generate a user profile',
});
console.log(result.output);
// { name: "John Doe", email: "[email protected]", age: 30 }
// or { name: null, email: null, age: 25 }
스키마 타입 비교 (Schema Type Comparison)
| Zod Type | Compatible | JSON Schema Behavior |
|---|---|---|
.nullable() |
✅ Yes | null 또는 지정된 타입 허용 |
.optional() |
❌ No | 필드를 생략할 수 있음 (지원 안 됨) |
.nullish() |
❌ No | null, undefined 또는 생략 허용 (지원 안 됨) |
관련 정보 (Related Information)
- 구조화된 출력 생성에 대한 자세한 내용은 Generating Structured Data를 참고하세요
- OpenAI 특정 구조화 출력 구성은 OpenAI Provider - Structured Outputs를 참고하세요
더 알아보기 (Learn more)
- strange stream output — 이상한 스트림 출력
- streamText — 텍스트 생성 함수