Commit 633a3d9
fix(ai): nullable wrap for optional nested objects/arrays in strict schema (#484)
fix(ai): mark optional nested objects/arrays nullable under strict schema
makeStructuredOutputCompatible adds every property to required[] under
forStructuredOutput: true, but optional nested objects/arrays were taking
the recursive branches and never reaching the 'null'-wrap — producing a
schema that OpenAI-style strict json_schema providers reject.
Wrap transformed composites as type: ['object', 'null'] / ['array', 'null']
when wasOptional. Extends the OpenRouter regression test with the
previously-untested array case and a new nested-object case.
Fixes #483
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>1 parent 3681c9e commit 633a3d9
3 files changed
Lines changed: 57 additions & 3 deletions
File tree
- .changeset
- packages/typescript
- ai-openrouter/tests
- ai/src/activities/chat/tools
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
Lines changed: 44 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
964 | 964 | | |
965 | 965 | | |
966 | 966 | | |
967 | | - | |
| 967 | + | |
968 | 968 | | |
| 969 | + | |
| 970 | + | |
| 971 | + | |
969 | 972 | | |
970 | 973 | | |
971 | 974 | | |
| |||
978 | 981 | | |
979 | 982 | | |
980 | 983 | | |
| 984 | + | |
| 985 | + | |
| 986 | + | |
| 987 | + | |
| 988 | + | |
| 989 | + | |
| 990 | + | |
| 991 | + | |
| 992 | + | |
| 993 | + | |
| 994 | + | |
| 995 | + | |
| 996 | + | |
| 997 | + | |
| 998 | + | |
| 999 | + | |
| 1000 | + | |
| 1001 | + | |
| 1002 | + | |
| 1003 | + | |
| 1004 | + | |
| 1005 | + | |
| 1006 | + | |
| 1007 | + | |
| 1008 | + | |
| 1009 | + | |
| 1010 | + | |
| 1011 | + | |
| 1012 | + | |
| 1013 | + | |
| 1014 | + | |
| 1015 | + | |
| 1016 | + | |
| 1017 | + | |
| 1018 | + | |
| 1019 | + | |
| 1020 | + | |
| 1021 | + | |
| 1022 | + | |
| 1023 | + | |
981 | 1024 | | |
982 | 1025 | | |
983 | 1026 | | |
| |||
Lines changed: 8 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
75 | 75 | | |
76 | 76 | | |
77 | 77 | | |
78 | | - | |
| 78 | + | |
79 | 79 | | |
80 | 80 | | |
81 | 81 | | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
82 | 85 | | |
83 | | - | |
| 86 | + | |
84 | 87 | | |
85 | 88 | | |
86 | 89 | | |
87 | 90 | | |
88 | 91 | | |
89 | 92 | | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
90 | 96 | | |
91 | 97 | | |
92 | 98 | | |
| |||
0 commit comments