mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 18:12:04 +00:00
feat: HTTP request tool (#9228)
This commit is contained in:
@@ -59,10 +59,12 @@ export const CHAIN_SUMMARIZATION_LANGCHAIN_NODE_TYPE =
|
||||
'@n8n/n8n-nodes-langchain.chainSummarization';
|
||||
export const CODE_TOOL_LANGCHAIN_NODE_TYPE = '@n8n/n8n-nodes-langchain.toolCode';
|
||||
export const WORKFLOW_TOOL_LANGCHAIN_NODE_TYPE = '@n8n/n8n-nodes-langchain.toolWorkflow';
|
||||
export const HTTP_REQUEST_TOOL_LANGCHAIN_NODE_TYPE = '@n8n/n8n-nodes-langchain.toolHttpRequest';
|
||||
|
||||
export const LANGCHAIN_CUSTOM_TOOLS = [
|
||||
CODE_TOOL_LANGCHAIN_NODE_TYPE,
|
||||
WORKFLOW_TOOL_LANGCHAIN_NODE_TYPE,
|
||||
HTTP_REQUEST_TOOL_LANGCHAIN_NODE_TYPE,
|
||||
];
|
||||
|
||||
//nodes that would execute only once with such parameters
|
||||
|
||||
@@ -2314,6 +2314,7 @@ export interface INodeGraphItem {
|
||||
src_instance_id?: string;
|
||||
agent?: string; //@n8n/n8n-nodes-langchain.agent
|
||||
prompts?: IDataObject[] | IDataObject; //ai node's prompts, cloud only
|
||||
toolSettings?: IDataObject; //various langchain tool's settings
|
||||
}
|
||||
|
||||
export interface INodeNameIndex {
|
||||
|
||||
@@ -16,6 +16,7 @@ import {
|
||||
CHAIN_LLM_LANGCHAIN_NODE_TYPE,
|
||||
CHAIN_SUMMARIZATION_LANGCHAIN_NODE_TYPE,
|
||||
HTTP_REQUEST_NODE_TYPE,
|
||||
HTTP_REQUEST_TOOL_LANGCHAIN_NODE_TYPE,
|
||||
LANGCHAIN_CUSTOM_TOOLS,
|
||||
OPENAI_LANGCHAIN_NODE_TYPE,
|
||||
STICKY_NODE_TYPE,
|
||||
@@ -30,6 +31,34 @@ export function isNumber(value: unknown): value is number {
|
||||
return typeof value === 'number';
|
||||
}
|
||||
|
||||
const countPlaceholders = (text: string) => {
|
||||
const placeholder = /(\{[a-zA-Z0-9_]+\})/g;
|
||||
let returnData = 0;
|
||||
|
||||
try {
|
||||
const matches = text.matchAll(placeholder);
|
||||
for (const _ of matches) returnData++;
|
||||
} catch (error) {}
|
||||
|
||||
return returnData;
|
||||
};
|
||||
|
||||
const countPlaceholdersInParameters = (parameters: IDataObject[]) => {
|
||||
let returnData = 0;
|
||||
|
||||
for (const parameter of parameters) {
|
||||
if (!parameter.value) {
|
||||
//count parameters provided by model
|
||||
returnData++;
|
||||
} else {
|
||||
//check if any placeholders in user provided value
|
||||
returnData += countPlaceholders(String(parameter.value));
|
||||
}
|
||||
}
|
||||
|
||||
return returnData;
|
||||
};
|
||||
|
||||
type XYPosition = [number, number];
|
||||
|
||||
function areOverlapping(
|
||||
@@ -199,6 +228,87 @@ export function generateNodesGraph(
|
||||
nodeItem.domain_base = getDomainBase(url);
|
||||
nodeItem.domain_path = getDomainPath(url);
|
||||
nodeItem.method = node.parameters.requestMethod as string;
|
||||
} else if (HTTP_REQUEST_TOOL_LANGCHAIN_NODE_TYPE === node.type) {
|
||||
if (!nodeItem.toolSettings) nodeItem.toolSettings = {};
|
||||
|
||||
nodeItem.toolSettings.url_type = 'other';
|
||||
nodeItem.toolSettings.uses_auth = false;
|
||||
nodeItem.toolSettings.placeholders = 0;
|
||||
nodeItem.toolSettings.query_from_model_only = false;
|
||||
nodeItem.toolSettings.headers_from_model_only = false;
|
||||
nodeItem.toolSettings.body_from_model_only = false;
|
||||
|
||||
const toolUrl = (node.parameters?.url as string) ?? '';
|
||||
nodeItem.toolSettings.placeholders += countPlaceholders(toolUrl);
|
||||
|
||||
const authType = (node.parameters?.authentication as string) ?? '';
|
||||
|
||||
if (authType && authType !== 'none') {
|
||||
nodeItem.toolSettings.uses_auth = true;
|
||||
}
|
||||
|
||||
if (toolUrl.startsWith('{') && toolUrl.endsWith('}')) {
|
||||
nodeItem.toolSettings.url_type = 'any';
|
||||
} else if (toolUrl.includes('google.com')) {
|
||||
nodeItem.toolSettings.url_type = 'google';
|
||||
}
|
||||
|
||||
if (node.parameters?.sendBody) {
|
||||
if (node.parameters?.specifyBody === 'model') {
|
||||
nodeItem.toolSettings.body_from_model_only = true;
|
||||
}
|
||||
|
||||
if (node.parameters?.jsonBody) {
|
||||
nodeItem.toolSettings.placeholders += countPlaceholders(
|
||||
node.parameters?.jsonBody as string,
|
||||
);
|
||||
}
|
||||
|
||||
if (node.parameters?.parametersBody) {
|
||||
const parameters = (node.parameters?.parametersBody as IDataObject)
|
||||
.values as IDataObject[];
|
||||
|
||||
nodeItem.toolSettings.placeholders += countPlaceholdersInParameters(parameters);
|
||||
}
|
||||
}
|
||||
|
||||
if (node.parameters?.sendHeaders) {
|
||||
if (node.parameters?.specifyHeaders === 'model') {
|
||||
nodeItem.toolSettings.headers_from_model_only = true;
|
||||
}
|
||||
|
||||
if (node.parameters?.jsonHeaders) {
|
||||
nodeItem.toolSettings.placeholders += countPlaceholders(
|
||||
node.parameters?.jsonHeaders as string,
|
||||
);
|
||||
}
|
||||
|
||||
if (node.parameters?.parametersHeaders) {
|
||||
const parameters = (node.parameters?.parametersHeaders as IDataObject)
|
||||
.values as IDataObject[];
|
||||
|
||||
nodeItem.toolSettings.placeholders += countPlaceholdersInParameters(parameters);
|
||||
}
|
||||
}
|
||||
|
||||
if (node.parameters?.sendQuery) {
|
||||
if (node.parameters?.specifyQuery === 'model') {
|
||||
nodeItem.toolSettings.query_from_model_only = true;
|
||||
}
|
||||
|
||||
if (node.parameters?.jsonQuery) {
|
||||
nodeItem.toolSettings.placeholders += countPlaceholders(
|
||||
node.parameters?.jsonQuery as string,
|
||||
);
|
||||
}
|
||||
|
||||
if (node.parameters?.parametersQuery) {
|
||||
const parameters = (node.parameters?.parametersQuery as IDataObject)
|
||||
.values as IDataObject[];
|
||||
|
||||
nodeItem.toolSettings.placeholders += countPlaceholdersInParameters(parameters);
|
||||
}
|
||||
}
|
||||
} else if (node.type === WEBHOOK_NODE_TYPE) {
|
||||
webhookNodeNames.push(node.name);
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user