Skip to content

Commit 818b144

Browse files
vercel-ai-sdk[bot]AVthekinggr2m
authored
Backport: Fix(ai): correctly valiate empty arrays (#10117)
This is an automated backport of #10093 to the release-v5.0 branch --------- Co-authored-by: ANKIT VARSHNEY <132201033+AVtheking@users.noreply.github.com> Co-authored-by: Gregor Martynus <39992+gr2m@users.noreply.github.com>
1 parent 8f92f8b commit 818b144

File tree

3 files changed

+283
-198
lines changed

3 files changed

+283
-198
lines changed

.changeset/mean-mugs-swim.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'ai': patch
3+
---
4+
5+
fix not catching of empty arrays in validateUIMessage

packages/ai/src/ui/validate-ui-messages.test.ts

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,55 @@ describe('validateUIMessages', () => {
2727
[AI_InvalidArgumentError: Invalid argument for parameter messages: messages parameter must be provided]
2828
`);
2929
});
30+
31+
it('should throw TypeValidationError when messages array is empty', async () => {
32+
await expect(
33+
validateUIMessages({
34+
messages: [],
35+
}),
36+
).rejects.toThrowErrorMatchingInlineSnapshot(`
37+
[AI_TypeValidationError: Type validation failed: Value: [].
38+
Error message: [
39+
{
40+
"origin": "array",
41+
"code": "too_small",
42+
"minimum": 1,
43+
"inclusive": true,
44+
"path": [],
45+
"message": "Messages array must not be empty"
46+
}
47+
]]
48+
`);
49+
});
50+
51+
it('should throw TypeValidationError when message has empty parts array', async () => {
52+
await expect(
53+
validateUIMessages({
54+
messages: [
55+
{
56+
id: '1',
57+
role: 'user',
58+
parts: [],
59+
},
60+
],
61+
}),
62+
).rejects.toThrowErrorMatchingInlineSnapshot(`
63+
[AI_TypeValidationError: Type validation failed: Value: [{"id":"1","role":"user","parts":[]}].
64+
Error message: [
65+
{
66+
"origin": "array",
67+
"code": "too_small",
68+
"minimum": 1,
69+
"inclusive": true,
70+
"path": [
71+
0,
72+
"parts"
73+
],
74+
"message": "Message must contain at least one part"
75+
}
76+
]]
77+
`);
78+
});
3079
});
3180

3281
describe('metadata', () => {
@@ -1158,6 +1207,33 @@ describe('safeValidateUIMessages', () => {
11581207
);
11591208
});
11601209

1210+
it('should return failure result when messages array is empty', async () => {
1211+
const result = await safeValidateUIMessages({
1212+
messages: [],
1213+
});
1214+
1215+
expectToBe(result.success, false);
1216+
expect(result.error.name).toBe('AI_TypeValidationError');
1217+
expect(result.error.message).toContain('Type validation failed');
1218+
expect(result.error.message).toContain('Messages array must not be empty');
1219+
});
1220+
1221+
it('should return failure result when message has empty parts array', async () => {
1222+
const result = await safeValidateUIMessages({
1223+
messages: [
1224+
{
1225+
id: '1',
1226+
role: 'user',
1227+
parts: [],
1228+
},
1229+
],
1230+
});
1231+
1232+
expectToBe(result.success, false);
1233+
expect(result.error.name).toBe('AI_TypeValidationError');
1234+
expect(result.error.message).toContain('Type validation failed');
1235+
});
1236+
11611237
it('should return failure result when metadata validation fails', async () => {
11621238
const result = await safeValidateUIMessages<UIMessage<{ foo: string }>>({
11631239
messages: [

0 commit comments

Comments
 (0)