feat: HTTP request tool (#9228)

This commit is contained in:
Michael Kret
2024-06-19 10:54:13 +03:00
committed by GitHub
parent 4131408e5e
commit be2635e50e
14 changed files with 2423 additions and 144 deletions

View File

@@ -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 {