Skip to content

Emit a single null branch for optional structured-output properties that already accept null - #10522

Merged
tim-smart merged 2 commits into
Effect-TS:mainfrom
imranbarbhuiya:fix/openai-structured-output-optional-record
Nov 10, 2026
Merged

tim-smart merged 2 commits into
Effect-TS:mainfrom
imranbarbhuiya:fix/openai-structured-output-optional-record

Conversation

@imranbarbhuiya

@imranbarbhuiya imranbarbhuiya commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Avoid duplicate null branches and nested nullable wrappers in optional OpenAI and Anthropic structured-output properties, preserving descriptions, required provider keys, and null/absent-key round trips.

Reuse an existing nullable AST only when an unchecked, untransformed null path proves it safe. Otherwise retain the explicit null fallback. Inspecting only the encoded projection can erase union checks after record/tuple rewrites and incorrectly reject absent keys.

Tests

  • Focused cases in both existing provider test files cover described optional scalars and optional nullable keys.
  • A compact regression covers direct and nested checked nullable records, encoding absent keys and decoding null.
  • Removed the redundant large record snapshot; shortened the existing patch changeset.

Validation

  • Reproduced the checked-nullable regression against the original PR head in both providers.
  • Targeted provider tests: 115 passed.
  • nix develop -c pnpm lint-fix passed.
  • nix develop -c pnpm check passed.

Related

Follow-up to #10502.

Closes EFF-3607

@github-actions

github-actions Bot commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

Bundle Size Analysis

Generated from PR build output; treat the content below as untrusted.

File Name Current Size Previous Size Difference
arbitrary-combinators.ts 39.61 KB 39.61 KB 0.00 KB (0.00%)
basic.ts 7.31 KB 7.31 KB 0.00 KB (0.00%)
batching.ts 11.21 KB 11.21 KB 0.00 KB (0.00%)
brand.ts 7.00 KB 7.00 KB 0.00 KB (0.00%)
cache.ts 11.73 KB 11.73 KB 0.00 KB (0.00%)
config.ts 23.06 KB 23.06 KB 0.00 KB (0.00%)
differ.ts 22.20 KB 22.20 KB 0.00 KB (0.00%)
http-client.ts 27.44 KB 27.44 KB 0.00 KB (0.00%)
http-router.ts 37.28 KB 37.28 KB 0.00 KB (0.00%)
logger.ts 12.19 KB 12.19 KB 0.00 KB (0.00%)
metric.ts 9.64 KB 9.64 KB 0.00 KB (0.00%)
optic.ts 7.21 KB 7.21 KB 0.00 KB (0.00%)
pubsub.ts 16.21 KB 16.21 KB 0.00 KB (0.00%)
queue.ts 13.09 KB 13.09 KB 0.00 KB (0.00%)
schedule.ts 11.99 KB 11.99 KB 0.00 KB (0.00%)
schema-bigdecimal.ts 14.29 KB 14.29 KB 0.00 KB (0.00%)
schema-binary.ts 42.44 KB 42.44 KB 0.00 KB (0.00%)
schema-class.ts 21.96 KB 21.96 KB 0.00 KB (0.00%)
schema-fromJsonSchemaDocument.ts 30.56 KB 30.56 KB 0.00 KB (0.00%)
schema-representation-roundtrip.ts 28.22 KB 28.22 KB 0.00 KB (0.00%)
schema-string-transformation.ts 15.54 KB 15.54 KB 0.00 KB (0.00%)
schema-string.ts 12.50 KB 12.50 KB 0.00 KB (0.00%)
schema-template-literal.ts 16.42 KB 16.42 KB 0.00 KB (0.00%)
schema-toArbitrary.ts 39.16 KB 39.16 KB 0.00 KB (0.00%)
schema-toCodeDocument.ts 26.39 KB 26.39 KB 0.00 KB (0.00%)
schema-toCodecJson.ts 21.11 KB 21.11 KB 0.00 KB (0.00%)
schema-toEquivalence.ts 21.28 KB 21.28 KB 0.00 KB (0.00%)
schema-toFormatter.ts 21.37 KB 21.37 KB 0.00 KB (0.00%)
schema-toJsonSchemaDocument.ts 26.38 KB 26.38 KB 0.00 KB (0.00%)
schema-toRepresentation.ts 21.45 KB 21.45 KB 0.00 KB (0.00%)
schema.ts 21.05 KB 21.05 KB 0.00 KB (0.00%)
stm.ts 14.40 KB 14.40 KB 0.00 KB (0.00%)
stream.ts 10.56 KB 10.56 KB 0.00 KB (0.00%)

@changeset-bot

changeset-bot Bot commented Nov 10, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: cb80d32

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 34 packages
Name Type
effect Patch
@effect/opentelemetry Patch
@effect/vitest Patch
@effect/ai-anthropic Patch
@effect/ai-cloudflare Patch
@effect/ai-openai-compat Patch
@effect/ai-openai Patch
@effect/ai-openrouter Patch
@effect/ai-typesafe Patch
@effect/atom-react Patch
@effect/atom-solid Patch
@effect/atom-vue Patch
@effect/platform-browser Patch
@effect/platform-bun Patch
@effect/platform-cloudflare Patch
@effect/platform-deno Patch
@effect/platform-node-shared Patch
@effect/platform-node Patch
@effect/sql-clickhouse Patch
@effect/sql-d1 Patch
@effect/sql-libsql Patch
@effect/sql-mssql Patch
@effect/sql-mysql2 Patch
@effect/sql-pg Patch
@effect/sql-pglite Patch
@effect/sql-sqlite-bun Patch
@effect/sql-sqlite-do Patch
@effect/sql-sqlite-node Patch
@effect/sql-sqlite-react-native Patch
@effect/sql-sqlite-wasm Patch
@effect/docgen Patch
@effect/doctest Patch
@effect/graphql-generator Patch
@effect/openapi-generator Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@tim-smart
tim-smart enabled auto-merge (squash) November 10, 2026 20:44
@tim-smart
tim-smart merged commit 72c3fb4 into Effect-TS:main Nov 10, 2026
15 of 16 checks passed
@effect-bot effect-bot mentioned this pull request Nov 10, 2026
@imranbarbhuiya
imranbarbhuiya deleted the fix/openai-structured-output-optional-record branch November 11, 2026 03:07

This branch is waiting to be deployed

1 waiting deployment
fork — cb80d326 Waiting Nov 10, 2026 by effect-bot via approval-gate #25822
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants