diff --git a/packages/@n8n/nodes-langchain/nodes/output_parser/OutputParserStructured/test/OutputParserStructured.node.test.ts b/packages/@n8n/nodes-langchain/nodes/output_parser/OutputParserStructured/test/OutputParserStructured.node.test.ts index b0dca4905a..fb1c9f14a1 100644 --- a/packages/@n8n/nodes-langchain/nodes/output_parser/OutputParserStructured/test/OutputParserStructured.node.test.ts +++ b/packages/@n8n/nodes-langchain/nodes/output_parser/OutputParserStructured/test/OutputParserStructured.node.test.ts @@ -608,6 +608,33 @@ describe('OutputParserStructured', () => { ), ).rejects.toThrow('Required'); }); + + it('should raise schema fit error when passing in empty object', async () => { + const jsonExample = `{ + "user": { + "name": "Alice", + "email": "alice@example.com", + "profile": { + "age": 30, + "city": "New York" + } + }, + "tags": ["work", "important"] + }`; + thisArg.getNodeParameter.calledWith('schemaType', 0).mockReturnValueOnce('fromJson'); + thisArg.getNodeParameter + .calledWith('jsonSchemaExample', 0) + .mockReturnValueOnce(jsonExample); + + const { response } = (await outputParser.supplyData.call(thisArg, 0)) as { + response: N8nStructuredOutputParser; + }; + + // @ts-expect-error 2345 + await expect(response.parse({})).rejects.toThrow( + "Model output doesn't fit required format", + ); + }); }); describe('manual schema mode', () => { diff --git a/packages/@n8n/nodes-langchain/utils/output_parsers/N8nStructuredOutputParser.ts b/packages/@n8n/nodes-langchain/utils/output_parsers/N8nStructuredOutputParser.ts index 3a9191d58f..42f1e78491 100644 --- a/packages/@n8n/nodes-langchain/utils/output_parsers/N8nStructuredOutputParser.ts +++ b/packages/@n8n/nodes-langchain/utils/output_parsers/N8nStructuredOutputParser.ts @@ -66,7 +66,7 @@ export class N8nStructuredOutputParser extends StructuredOutputParser< if (e instanceof SyntaxError) { nodeError.context.outputParserFailReason = 'Invalid JSON in model output'; } else if ( - text.trim() === '{}' || + (typeof text === 'string' && text.trim() === '{}') || (e instanceof z.ZodError && e.issues?.[0] && e.issues?.[0].code === 'invalid_type' &&