Skip to content

Conversation

@silasalberti
Copy link

Add warning for .optional() usage in OpenAI API schemas

This PR adds a warning when .optional() is used in schemas for OpenAI API Structured Outputs, recommending the use of .nullable() instead since optional fields are not currently supported.

Changes

  • Added warning in optional.ts that triggers when openaiStrictMode is true
  • Warning includes explanation and link to documentation
  • Added test to verify warning behavior

Testing

✅ All tests passing (411 total)

  • Added new test case to verify warning is emitted
  • Verified warning message contains correct information
  • Ran full test suite to ensure no regressions

Implementation Details

The warning is implemented in the optional field parser and only triggers when generating schemas specifically for OpenAI API usage (when openaiStrictMode is true). This ensures developers get immediate feedback about unsupported optional fields while keeping the warning relevant only to OpenAI API usage.

Created with help from Devin: https://preview.devin.ai/devin/13e97f93e3b1445c91e60da01b88febd

Fixes #1180

This commit adds a warning when .optional() is used in schemas for OpenAI API
Structured Outputs, recommending the use of .nullable() instead.

- Added warning in optional.ts that triggers when openaiStrictMode is true
- Added test to verify warning behavior

Fixes openai#1180

export const parseOptionalDef = (def: ZodOptionalDef, refs: Refs): JsonSchema7Type | undefined => {
if (refs.openaiStrictMode) {
const fieldName = refs.propertyPath?.slice(-1)[0] || 'unknown';

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since refs.propertyPath is an array, can we replace .slice(-1)[0] with .at(-1) here? Using .at(-1) improves readability and performance by directly accessing the last element without creating a new array.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/at

`See: https://platform.openai.com/docs/guides/structured-outputs#all-fields-must-be-required`,
);
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unnecessary use of string concatenation (+) since we are already using template literals.

expect(consoleSpy).toHaveBeenCalledWith(
expect.stringContaining('uses .optional() which is not supported by OpenAI API Structured Outputs'),
);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we also test expect(consoleSpy).toHaveBeenCalledTimes(1); to ensure this is called only once.

@RobertCraigie
Copy link
Collaborator

Thanks for the PR and sorry for the delayed response! I did this separately in #1469 as I wanted to take a slightly different approach.

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.

Model seems to ignore .optional() fields, and instead uses fasly values such as 0, empty strings etc'

3 participants