diff --git a/packages/@n8n/nodes-langchain/nodes/tools/ToolHttpRequest/ToolHttpRequest.node.ts b/packages/@n8n/nodes-langchain/nodes/tools/ToolHttpRequest/ToolHttpRequest.node.ts index 1756abf549..fc948c7bbb 100644 --- a/packages/@n8n/nodes-langchain/nodes/tools/ToolHttpRequest/ToolHttpRequest.node.ts +++ b/packages/@n8n/nodes-langchain/nodes/tools/ToolHttpRequest/ToolHttpRequest.node.ts @@ -63,6 +63,8 @@ export class ToolHttpRequest implements INodeType { ], }, }, + // Replaced by a `usableAsTool` version of the standalone HttpRequest node + hidden: true, // eslint-disable-next-line n8n-nodes-base/node-class-description-inputs-wrong-regular-node inputs: [], // eslint-disable-next-line n8n-nodes-base/node-class-description-outputs-wrong diff --git a/packages/nodes-base/nodes/HttpRequest/V3/HttpRequestV3.node.ts b/packages/nodes-base/nodes/HttpRequest/V3/HttpRequestV3.node.ts index a2ed5897c8..e0aedc829d 100644 --- a/packages/nodes-base/nodes/HttpRequest/V3/HttpRequestV3.node.ts +++ b/packages/nodes-base/nodes/HttpRequest/V3/HttpRequestV3.node.ts @@ -71,6 +71,15 @@ export class HttpRequestV3 implements INodeType { }, }, ], + usableAsTool: { + replacements: { + codex: { + subcategories: { + Tools: ['Recommended Tools'], + }, + }, + }, + }, properties: mainProperties, }; } diff --git a/packages/nodes-base/nodes/HttpRequest/shared/optimizeResponse.ts b/packages/nodes-base/nodes/HttpRequest/shared/optimizeResponse.ts index 826bb6229a..001ec434f5 100644 --- a/packages/nodes-base/nodes/HttpRequest/shared/optimizeResponse.ts +++ b/packages/nodes-base/nodes/HttpRequest/shared/optimizeResponse.ts @@ -151,7 +151,19 @@ const jsonOptimizer = (ctx: IExecuteFunctions, itemIndex: number): ResponseOptim if (!Array.isArray(responseData)) { if (dataField) { + if (!Object.prototype.hasOwnProperty.call(responseData, dataField)) { + throw new NodeOperationError( + ctx.getNode(), + `Target field "${dataField}" not found in response.`, + { + itemIndex, + description: `The response contained these fields: [${Object.keys(responseData).join(', ')}]`, + }, + ); + } + const data = responseData[dataField] as IDataObject | IDataObject[]; + if (Array.isArray(data)) { responseData = data; } else {