diff --git a/.changeset/green-ravens-enjoy.md b/.changeset/green-ravens-enjoy.md new file mode 100644 index 000000000000..490f85320fd6 --- /dev/null +++ b/.changeset/green-ravens-enjoy.md @@ -0,0 +1,5 @@ +--- +"ai": patch +--- + +Return validated elements from generateText array output diff --git a/packages/ai/src/generate-text/output.test.ts b/packages/ai/src/generate-text/output.test.ts index c4e218866c4b..e4534fe5d3a8 100644 --- a/packages/ai/src/generate-text/output.test.ts +++ b/packages/ai/src/generate-text/output.test.ts @@ -352,6 +352,36 @@ describe('Output.array', () => { }); } }); + + it('should return schema-validated values (with transforms applied)', async () => { + const arrayWithTransform = array({ + element: z + .object({ content: z.string() }) + .transform(val => ({ ...val, extra: true })), + }); + + const result = await arrayWithTransform.parseCompleteOutput( + { text: `{ "elements": [{ "content": "hello" }] }` }, + context, + ); + + expect(result).toStrictEqual([{ content: 'hello', extra: true }]); + }); + + it('should return validated values for multiple elements', async () => { + const result = await array1.parseCompleteOutput( + { + text: `{ "elements": [{ "content": "a" }, { "content": "b" }, { "content": "c" }] }`, + }, + context, + ); + + expect(result).toStrictEqual([ + { content: 'a' }, + { content: 'b' }, + { content: 'c' }, + ]); + }); }); describe('array.parsePartialOutput', () => { diff --git a/packages/ai/src/generate-text/output.ts b/packages/ai/src/generate-text/output.ts index 6a0558a7a881..259cea18a60e 100644 --- a/packages/ai/src/generate-text/output.ts +++ b/packages/ai/src/generate-text/output.ts @@ -278,6 +278,7 @@ export const array = ({ }); } + const validatedElements: Array = []; for (const element of outerValue.elements) { const validationResult = await safeValidateTypes({ value: element, @@ -294,9 +295,11 @@ export const array = ({ finishReason: context.finishReason, }); } + + validatedElements.push(validationResult.value); } - return outerValue.elements as Array; + return validatedElements; }, async parsePartialOutput({ text }: { text: string }) {