@n8n/n8n-nodes-langchain 1.121.0 → 1.122.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/nodes/Guardrails/Guardrails.node.js +29 -40
- package/dist/nodes/Guardrails/Guardrails.node.js.map +1 -1
- package/dist/nodes/Guardrails/actions/execute.js +68 -0
- package/dist/nodes/Guardrails/actions/execute.js.map +1 -0
- package/dist/nodes/Guardrails/actions/process.js +10 -7
- package/dist/nodes/Guardrails/actions/process.js.map +1 -1
- package/dist/nodes/Guardrails/description.js +326 -365
- package/dist/nodes/Guardrails/description.js.map +1 -1
- package/dist/nodes/Guardrails/helpers/configureNodeInputs.js +37 -3
- package/dist/nodes/Guardrails/helpers/configureNodeInputs.js.map +1 -1
- package/dist/nodes/Guardrails/helpers/model.js.map +1 -1
- package/dist/nodes/Guardrails/v1/GuardrailsV1.node.js +59 -0
- package/dist/nodes/Guardrails/v1/GuardrailsV1.node.js.map +1 -0
- package/dist/nodes/Guardrails/v2/GuardrailsV2.node.js +59 -0
- package/dist/nodes/Guardrails/v2/GuardrailsV2.node.js.map +1 -0
- package/dist/nodes/ToolExecutor/ToolExecutor.node.js.map +1 -1
- package/dist/nodes/agents/Agent/agents/ConversationalAgent/execute.js +1 -1
- package/dist/nodes/agents/Agent/agents/ConversationalAgent/execute.js.map +1 -1
- package/dist/nodes/agents/Agent/agents/OpenAiFunctionsAgent/execute.js +3 -85
- package/dist/nodes/agents/Agent/agents/OpenAiFunctionsAgent/execute.js.map +1 -1
- package/dist/nodes/agents/Agent/agents/PlanAndExecuteAgent/execute.js +1 -1
- package/dist/nodes/agents/Agent/agents/PlanAndExecuteAgent/execute.js.map +1 -1
- package/dist/nodes/agents/Agent/agents/ReActAgent/execute.js +1 -1
- package/dist/nodes/agents/Agent/agents/ReActAgent/execute.js.map +1 -1
- package/dist/nodes/agents/Agent/agents/SqlAgent/execute.js +2 -2
- package/dist/nodes/agents/Agent/agents/SqlAgent/execute.js.map +1 -1
- package/dist/nodes/agents/Agent/agents/ToolsAgent/V1/execute.js +1 -1
- package/dist/nodes/agents/Agent/agents/ToolsAgent/V1/execute.js.map +1 -1
- package/dist/nodes/agents/Agent/agents/ToolsAgent/V2/execute.js +1 -1
- package/dist/nodes/agents/Agent/agents/ToolsAgent/V2/execute.js.map +1 -1
- package/dist/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/buildExecutionContext.js.map +1 -1
- package/dist/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/createAgentSequence.js +1 -1
- package/dist/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/createAgentSequence.js.map +1 -1
- package/dist/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/executeBatch.js.map +1 -1
- package/dist/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/finalizeResult.js.map +1 -1
- package/dist/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/prepareItemContext.js.map +1 -1
- package/dist/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/runAgent.js +8 -16
- package/dist/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/runAgent.js.map +1 -1
- package/dist/nodes/agents/Agent/agents/ToolsAgent/common.js +1 -1
- package/dist/nodes/agents/Agent/agents/ToolsAgent/common.js.map +1 -1
- package/dist/nodes/agents/Agent/agents/utils.js.map +1 -1
- package/dist/nodes/agents/OpenAiAssistant/OpenAiAssistant.node.js +2 -2
- package/dist/nodes/agents/OpenAiAssistant/OpenAiAssistant.node.js.map +1 -1
- package/dist/nodes/chains/ChainRetrievalQA/processItem.js +2 -2
- package/dist/nodes/chains/ChainRetrievalQA/processItem.js.map +1 -1
- package/dist/nodes/chains/ChainSummarization/V1/ChainSummarizationV1.node.js +1 -1
- package/dist/nodes/chains/ChainSummarization/V1/ChainSummarizationV1.node.js.map +1 -1
- package/dist/nodes/chains/ChainSummarization/V2/processItem.js +1 -1
- package/dist/nodes/chains/ChainSummarization/V2/processItem.js.map +1 -1
- package/dist/nodes/chains/ChainSummarization/helpers.js.map +1 -1
- package/dist/nodes/chains/InformationExtractor/InformationExtractor.node.js +1 -1
- package/dist/nodes/chains/InformationExtractor/InformationExtractor.node.js.map +1 -1
- package/dist/nodes/chains/InformationExtractor/processItem.js.map +1 -1
- package/dist/nodes/chains/SentimentAnalysis/SentimentAnalysis.node.js +1 -1
- package/dist/nodes/chains/SentimentAnalysis/SentimentAnalysis.node.js.map +1 -1
- package/dist/nodes/chains/TextClassifier/TextClassifier.node.js +1 -1
- package/dist/nodes/chains/TextClassifier/TextClassifier.node.js.map +1 -1
- package/dist/nodes/chains/TextClassifier/processItem.js.map +1 -1
- package/dist/nodes/code/Code.node.js +66 -2
- package/dist/nodes/code/Code.node.js.map +1 -1
- package/dist/nodes/llms/LMOllama/LmOllama.node.js +1 -1
- package/dist/nodes/llms/LMOllama/LmOllama.node.js.map +1 -1
- package/dist/nodes/mcp/McpClientTool/utils.js +1 -1
- package/dist/nodes/mcp/McpClientTool/utils.js.map +1 -1
- package/dist/nodes/memory/MemoryBufferWindow/MemoryBufferWindow.node.js +1 -1
- package/dist/nodes/memory/MemoryBufferWindow/MemoryBufferWindow.node.js.map +1 -1
- package/dist/nodes/memory/MemoryMongoDbChat/MemoryMongoDbChat.node.js +1 -1
- package/dist/nodes/memory/MemoryMongoDbChat/MemoryMongoDbChat.node.js.map +1 -1
- package/dist/nodes/memory/MemoryPostgresChat/MemoryPostgresChat.node.js +1 -1
- package/dist/nodes/memory/MemoryPostgresChat/MemoryPostgresChat.node.js.map +1 -1
- package/dist/nodes/memory/MemoryRedisChat/MemoryRedisChat.node.js +1 -1
- package/dist/nodes/memory/MemoryRedisChat/MemoryRedisChat.node.js.map +1 -1
- package/dist/nodes/memory/MemoryXata/MemoryXata.node.js +1 -1
- package/dist/nodes/memory/MemoryXata/MemoryXata.node.js.map +1 -1
- package/dist/nodes/retrievers/RetrieverContextualCompression/RetrieverContextualCompression.node.js +2 -2
- package/dist/nodes/retrievers/RetrieverContextualCompression/RetrieverContextualCompression.node.js.map +1 -1
- package/dist/nodes/retrievers/RetrieverMultiQuery/RetrieverMultiQuery.node.js +1 -1
- package/dist/nodes/retrievers/RetrieverMultiQuery/RetrieverMultiQuery.node.js.map +1 -1
- package/dist/nodes/retrievers/RetrieverVectorStore/RetrieverVectorStore.node.js +1 -1
- package/dist/nodes/retrievers/RetrieverVectorStore/RetrieverVectorStore.node.js.map +1 -1
- package/dist/nodes/tools/ToolThink/ToolThink.node.js +1 -1
- package/dist/nodes/tools/ToolThink/ToolThink.node.js.map +1 -1
- package/dist/nodes/tools/ToolVectorStore/ToolVectorStore.node.js +2 -2
- package/dist/nodes/tools/ToolVectorStore/ToolVectorStore.node.js.map +1 -1
- package/dist/nodes/tools/ToolWorkflow/v2/utils/WorkflowToolService.js +5 -21
- package/dist/nodes/tools/ToolWorkflow/v2/utils/WorkflowToolService.js.map +1 -1
- package/dist/nodes/trigger/ChatTrigger/Chat.node.js +2 -2
- package/dist/nodes/trigger/ChatTrigger/Chat.node.js.map +1 -1
- package/dist/nodes/trigger/ChatTrigger/ChatTrigger.node.js +1 -1
- package/dist/nodes/trigger/ChatTrigger/ChatTrigger.node.js.map +1 -1
- package/dist/nodes/vector_store/VectorStoreAzureAISearch/VectorStoreAzureAISearch.node.js +65 -17
- package/dist/nodes/vector_store/VectorStoreAzureAISearch/VectorStoreAzureAISearch.node.js.map +1 -1
- package/dist/nodes/vector_store/VectorStoreInMemory/VectorStoreInMemory.node.js.map +1 -1
- package/dist/nodes/vector_store/VectorStoreInMemoryInsert/VectorStoreInMemoryInsert.node.js.map +1 -1
- package/dist/nodes/vector_store/VectorStoreQdrant/qdrant.svg +23 -19
- package/dist/nodes/vector_store/shared/MemoryManager/MemoryCalculator.js.map +1 -1
- package/dist/nodes/vector_store/shared/MemoryManager/MemoryVectorStoreManager.js +1 -1
- package/dist/nodes/vector_store/shared/MemoryManager/MemoryVectorStoreManager.js.map +1 -1
- package/dist/nodes/vector_store/shared/MemoryManager/StoreCleanupService.js.map +1 -1
- package/dist/nodes/vector_store/shared/MemoryManager/types.js.map +1 -1
- package/dist/nodes/vector_store/shared/createVectorStoreNode/operations/retrieveAsToolOperation.js +18 -16
- package/dist/nodes/vector_store/shared/createVectorStoreNode/operations/retrieveAsToolOperation.js.map +1 -1
- package/dist/nodes/vendors/GoogleGemini/actions/image/edit.operation.js +6 -1
- package/dist/nodes/vendors/GoogleGemini/actions/image/edit.operation.js.map +1 -1
- package/dist/nodes/vendors/GoogleGemini/actions/image/generate.operation.js +1 -1
- package/dist/nodes/vendors/GoogleGemini/actions/image/generate.operation.js.map +1 -1
- package/dist/nodes/vendors/GoogleGemini/methods/listSearch.js +23 -8
- package/dist/nodes/vendors/GoogleGemini/methods/listSearch.js.map +1 -1
- package/dist/nodes/vendors/OpenAi/helpers/utils.js.map +1 -1
- package/dist/nodes/vendors/OpenAi/v1/actions/assistant/message.operation.js +2 -2
- package/dist/nodes/vendors/OpenAi/v1/actions/assistant/message.operation.js.map +1 -1
- package/dist/types/nodes.json +7 -6
- package/dist/utils/N8nBinaryLoader.js +2 -2
- package/dist/utils/N8nBinaryLoader.js.map +1 -1
- package/dist/utils/N8nJsonLoader.js +2 -2
- package/dist/utils/N8nJsonLoader.js.map +1 -1
- package/dist/utils/N8nTool.js +1 -1
- package/dist/utils/N8nTool.js.map +1 -1
- package/dist/utils/agent-execution/buildSteps.js +12 -8
- package/dist/utils/agent-execution/buildSteps.js.map +1 -1
- package/dist/utils/agent-execution/createEngineRequests.js +19 -1
- package/dist/utils/agent-execution/createEngineRequests.js.map +1 -1
- package/dist/utils/agent-execution/index.js +4 -4
- package/dist/utils/agent-execution/index.js.map +1 -1
- package/dist/utils/agent-execution/memoryManagement.js +15 -14
- package/dist/utils/agent-execution/memoryManagement.js.map +1 -1
- package/dist/utils/agent-execution/processEventStream.js +1 -47
- package/dist/utils/agent-execution/processEventStream.js.map +1 -1
- package/dist/utils/agent-execution/types.js.map +1 -1
- package/dist/utils/fromAIToolFactory.js +61 -0
- package/dist/utils/fromAIToolFactory.js.map +1 -0
- package/dist/utils/helpers.js +1 -1
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/logWrapper.js.map +1 -1
- package/dist/utils/output_parsers/N8nStructuredOutputParser.js +1 -1
- package/dist/utils/output_parsers/N8nStructuredOutputParser.js.map +1 -1
- package/package.json +31 -30
|
@@ -21,49 +21,38 @@ __export(Guardrails_node_exports, {
|
|
|
21
21
|
Guardrails: () => Guardrails
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(Guardrails_node_exports);
|
|
24
|
-
var
|
|
25
|
-
var
|
|
26
|
-
var
|
|
27
|
-
class Guardrails {
|
|
24
|
+
var import_n8n_workflow = require("n8n-workflow");
|
|
25
|
+
var import_GuardrailsV1 = require("./v1/GuardrailsV1.node");
|
|
26
|
+
var import_GuardrailsV2 = require("./v2/GuardrailsV2.node");
|
|
27
|
+
class Guardrails extends import_n8n_workflow.VersionedNodeType {
|
|
28
28
|
constructor() {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
json: { guardrailsInput: responseData.guardrailsInput, ...responseData.failed },
|
|
49
|
-
pairedItem: { item: i }
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
} catch (error) {
|
|
53
|
-
if (this.continueOnFail()) {
|
|
54
|
-
failedItems.push({
|
|
55
|
-
json: { error: error.message, guardrailsInput: "" },
|
|
56
|
-
pairedItem: { item: i }
|
|
57
|
-
});
|
|
58
|
-
} else {
|
|
59
|
-
throw error;
|
|
29
|
+
const baseDescription = {
|
|
30
|
+
displayName: "Guardrails",
|
|
31
|
+
name: "guardrails",
|
|
32
|
+
icon: "file:guardrails.svg",
|
|
33
|
+
group: ["transform"],
|
|
34
|
+
defaultVersion: 2,
|
|
35
|
+
description: "Safeguard AI models from malicious input or prevent them from generating undesirable responses",
|
|
36
|
+
codex: {
|
|
37
|
+
alias: ["LangChain", "Guardrails", "PII", "Secret", "Injection", "Sanitize"],
|
|
38
|
+
categories: ["AI"],
|
|
39
|
+
subcategories: {
|
|
40
|
+
AI: ["Agents", "Miscellaneous", "Root Nodes"]
|
|
41
|
+
},
|
|
42
|
+
resources: {
|
|
43
|
+
primaryDocumentation: [
|
|
44
|
+
{
|
|
45
|
+
url: "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-langchain.guardrails/"
|
|
46
|
+
}
|
|
47
|
+
]
|
|
60
48
|
}
|
|
61
49
|
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
50
|
+
};
|
|
51
|
+
const nodeVersions = {
|
|
52
|
+
1: new import_GuardrailsV1.GuardrailsV1(baseDescription),
|
|
53
|
+
2: new import_GuardrailsV2.GuardrailsV2(baseDescription)
|
|
54
|
+
};
|
|
55
|
+
super(nodeVersions, baseDescription);
|
|
67
56
|
}
|
|
68
57
|
}
|
|
69
58
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../nodes/Guardrails/Guardrails.node.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../nodes/Guardrails/Guardrails.node.ts"],"sourcesContent":["import {\n\tVersionedNodeType,\n\ttype INodeTypeBaseDescription,\n\ttype IVersionedNodeType,\n} from 'n8n-workflow';\n\nimport { GuardrailsV1 } from './v1/GuardrailsV1.node';\nimport { GuardrailsV2 } from './v2/GuardrailsV2.node';\n\nexport class Guardrails extends VersionedNodeType {\n\tconstructor() {\n\t\tconst baseDescription: INodeTypeBaseDescription = {\n\t\t\tdisplayName: 'Guardrails',\n\t\t\tname: 'guardrails',\n\t\t\ticon: 'file:guardrails.svg',\n\t\t\tgroup: ['transform'],\n\t\t\tdefaultVersion: 2,\n\t\t\tdescription:\n\t\t\t\t'Safeguard AI models from malicious input or prevent them from generating undesirable responses',\n\t\t\tcodex: {\n\t\t\t\talias: ['LangChain', 'Guardrails', 'PII', 'Secret', 'Injection', 'Sanitize'],\n\t\t\t\tcategories: ['AI'],\n\t\t\t\tsubcategories: {\n\t\t\t\t\tAI: ['Agents', 'Miscellaneous', 'Root Nodes'],\n\t\t\t\t},\n\t\t\t\tresources: {\n\t\t\t\t\tprimaryDocumentation: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\turl: 'https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-langchain.guardrails/',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\tconst nodeVersions: IVersionedNodeType['nodeVersions'] = {\n\t\t\t1: new GuardrailsV1(baseDescription),\n\t\t\t2: new GuardrailsV2(baseDescription),\n\t\t};\n\n\t\tsuper(nodeVersions, baseDescription);\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAIO;AAEP,0BAA6B;AAC7B,0BAA6B;AAEtB,MAAM,mBAAmB,sCAAkB;AAAA,EACjD,cAAc;AACb,UAAM,kBAA4C;AAAA,MACjD,aAAa;AAAA,MACb,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,CAAC,WAAW;AAAA,MACnB,gBAAgB;AAAA,MAChB,aACC;AAAA,MACD,OAAO;AAAA,QACN,OAAO,CAAC,aAAa,cAAc,OAAO,UAAU,aAAa,UAAU;AAAA,QAC3E,YAAY,CAAC,IAAI;AAAA,QACjB,eAAe;AAAA,UACd,IAAI,CAAC,UAAU,iBAAiB,YAAY;AAAA,QAC7C;AAAA,QACA,WAAW;AAAA,UACV,sBAAsB;AAAA,YACrB;AAAA,cACC,KAAK;AAAA,YACN;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,UAAM,eAAmD;AAAA,MACxD,GAAG,IAAI,iCAAa,eAAe;AAAA,MACnC,GAAG,IAAI,iCAAa,eAAe;AAAA,IACpC;AAEA,UAAM,cAAc,eAAe;AAAA,EACpC;AACD;","names":[]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var execute_exports = {};
|
|
20
|
+
__export(execute_exports, {
|
|
21
|
+
execute: () => execute
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(execute_exports);
|
|
24
|
+
var import_process = require("./process");
|
|
25
|
+
var import_configureNodeInputs = require("../helpers/configureNodeInputs");
|
|
26
|
+
var import_model = require("../helpers/model");
|
|
27
|
+
async function execute() {
|
|
28
|
+
const items = this.getInputData();
|
|
29
|
+
const operation = this.getNodeParameter("operation", 0);
|
|
30
|
+
const model = (0, import_configureNodeInputs.hasLLMGuardrails)(this.getNodeParameter("guardrails", 0)) ? await import_model.getChatModel.call(this) : null;
|
|
31
|
+
const failedItems = [];
|
|
32
|
+
const passedItems = [];
|
|
33
|
+
for (let i = 0; i < items.length; i++) {
|
|
34
|
+
try {
|
|
35
|
+
const responseData = await import_process.process.call(this, i, model);
|
|
36
|
+
if (responseData.passed) {
|
|
37
|
+
passedItems.push({
|
|
38
|
+
json: { guardrailsInput: responseData.guardrailsInput, ...responseData.passed },
|
|
39
|
+
pairedItem: { item: i }
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (responseData.failed) {
|
|
43
|
+
failedItems.push({
|
|
44
|
+
json: { guardrailsInput: responseData.guardrailsInput, ...responseData.failed },
|
|
45
|
+
pairedItem: { item: i }
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
} catch (error) {
|
|
49
|
+
if (this.continueOnFail()) {
|
|
50
|
+
failedItems.push({
|
|
51
|
+
json: { error: error.message, guardrailsInput: "" },
|
|
52
|
+
pairedItem: { item: i }
|
|
53
|
+
});
|
|
54
|
+
} else {
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (operation === "classify") {
|
|
60
|
+
return [passedItems, failedItems];
|
|
61
|
+
}
|
|
62
|
+
return [passedItems];
|
|
63
|
+
}
|
|
64
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
65
|
+
0 && (module.exports = {
|
|
66
|
+
execute
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../nodes/Guardrails/actions/execute.ts"],"sourcesContent":["import type { IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';\n\nimport { process } from './process';\nimport type { GuardrailsOptions } from './types';\nimport { hasLLMGuardrails } from '../helpers/configureNodeInputs';\nimport { getChatModel } from '../helpers/model';\n\nexport async function execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {\n\tconst items = this.getInputData();\n\tconst operation = this.getNodeParameter('operation', 0) as 'classify' | 'sanitize';\n\tconst model = hasLLMGuardrails(this.getNodeParameter('guardrails', 0) as GuardrailsOptions)\n\t\t? await getChatModel.call(this)\n\t\t: null;\n\n\tconst failedItems: INodeExecutionData[] = [];\n\tconst passedItems: INodeExecutionData[] = [];\n\tfor (let i = 0; i < items.length; i++) {\n\t\ttry {\n\t\t\tconst responseData = await process.call(this, i, model);\n\t\t\tif (responseData.passed) {\n\t\t\t\tpassedItems.push({\n\t\t\t\t\tjson: { guardrailsInput: responseData.guardrailsInput, ...responseData.passed },\n\t\t\t\t\tpairedItem: { item: i },\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (responseData.failed) {\n\t\t\t\tfailedItems.push({\n\t\t\t\t\tjson: { guardrailsInput: responseData.guardrailsInput, ...responseData.failed },\n\t\t\t\t\tpairedItem: { item: i },\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (this.continueOnFail()) {\n\t\t\t\tfailedItems.push({\n\t\t\t\t\tjson: { error: error.message, guardrailsInput: '' },\n\t\t\t\t\tpairedItem: { item: i },\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (operation === 'classify') {\n\t\treturn [passedItems, failedItems];\n\t}\n\n\treturn [passedItems];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,qBAAwB;AAExB,iCAAiC;AACjC,mBAA6B;AAE7B,eAAsB,UAAkE;AACvF,QAAM,QAAQ,KAAK,aAAa;AAChC,QAAM,YAAY,KAAK,iBAAiB,aAAa,CAAC;AACtD,QAAM,YAAQ,6CAAiB,KAAK,iBAAiB,cAAc,CAAC,CAAsB,IACvF,MAAM,0BAAa,KAAK,IAAI,IAC5B;AAEH,QAAM,cAAoC,CAAC;AAC3C,QAAM,cAAoC,CAAC;AAC3C,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,QAAI;AACH,YAAM,eAAe,MAAM,uBAAQ,KAAK,MAAM,GAAG,KAAK;AACtD,UAAI,aAAa,QAAQ;AACxB,oBAAY,KAAK;AAAA,UAChB,MAAM,EAAE,iBAAiB,aAAa,iBAAiB,GAAG,aAAa,OAAO;AAAA,UAC9E,YAAY,EAAE,MAAM,EAAE;AAAA,QACvB,CAAC;AAAA,MACF;AACA,UAAI,aAAa,QAAQ;AACxB,oBAAY,KAAK;AAAA,UAChB,MAAM,EAAE,iBAAiB,aAAa,iBAAiB,GAAG,aAAa,OAAO;AAAA,UAC9E,YAAY,EAAE,MAAM,EAAE;AAAA,QACvB,CAAC;AAAA,MACF;AAAA,IACD,SAAS,OAAO;AACf,UAAI,KAAK,eAAe,GAAG;AAC1B,oBAAY,KAAK;AAAA,UAChB,MAAM,EAAE,OAAO,MAAM,SAAS,iBAAiB,GAAG;AAAA,UAClD,YAAY,EAAE,MAAM,EAAE;AAAA,QACvB,CAAC;AAAA,MACF,OAAO;AACN,cAAM;AAAA,MACP;AAAA,IACD;AAAA,EACD;AAEA,MAAI,cAAc,YAAY;AAC7B,WAAO,CAAC,aAAa,WAAW;AAAA,EACjC;AAEA,SAAO,CAAC,WAAW;AACpB;","names":[]}
|
|
@@ -65,6 +65,12 @@ async function process(itemIndex, model) {
|
|
|
65
65
|
preflight: [],
|
|
66
66
|
input: []
|
|
67
67
|
};
|
|
68
|
+
const checkModelAvailable = (model2) => {
|
|
69
|
+
if (!model2) {
|
|
70
|
+
throw new import_n8n_workflow.NodeOperationError(this.getNode(), "Chat Model is required");
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
};
|
|
68
74
|
if (guardrails.pii?.value) {
|
|
69
75
|
const { entities } = guardrails.pii.value;
|
|
70
76
|
stageGuardrails.preflight.push({
|
|
@@ -102,16 +108,13 @@ async function process(itemIndex, model) {
|
|
|
102
108
|
});
|
|
103
109
|
}
|
|
104
110
|
if (operation === "classify") {
|
|
105
|
-
if (!model) {
|
|
106
|
-
throw new import_n8n_workflow.NodeOperationError(this.getNode(), "Chat Model is required for classify operation");
|
|
107
|
-
}
|
|
108
111
|
if (guardrails.keywords) {
|
|
109
112
|
stageGuardrails.input.push({
|
|
110
113
|
name: "keywords",
|
|
111
114
|
check: (0, import_keywords.createKeywordsCheckFn)({ keywords: (0, import_common.splitByComma)(guardrails.keywords) })
|
|
112
115
|
});
|
|
113
116
|
}
|
|
114
|
-
if (guardrails.jailbreak?.value) {
|
|
117
|
+
if (guardrails.jailbreak?.value && checkModelAvailable(model)) {
|
|
115
118
|
const { prompt, threshold } = guardrails.jailbreak.value;
|
|
116
119
|
stageGuardrails.input.push({
|
|
117
120
|
name: "jailbreak",
|
|
@@ -123,7 +126,7 @@ async function process(itemIndex, model) {
|
|
|
123
126
|
})
|
|
124
127
|
});
|
|
125
128
|
}
|
|
126
|
-
if (guardrails.nsfw?.value) {
|
|
129
|
+
if (guardrails.nsfw?.value && checkModelAvailable(model)) {
|
|
127
130
|
const { prompt, threshold } = guardrails.nsfw.value;
|
|
128
131
|
stageGuardrails.input.push({
|
|
129
132
|
name: "nsfw",
|
|
@@ -135,7 +138,7 @@ async function process(itemIndex, model) {
|
|
|
135
138
|
})
|
|
136
139
|
});
|
|
137
140
|
}
|
|
138
|
-
if (guardrails.topicalAlignment?.value) {
|
|
141
|
+
if (guardrails.topicalAlignment?.value && checkModelAvailable(model)) {
|
|
139
142
|
const { prompt, threshold } = guardrails.topicalAlignment.value;
|
|
140
143
|
stageGuardrails.input.push({
|
|
141
144
|
name: "topicalAlignment",
|
|
@@ -147,7 +150,7 @@ async function process(itemIndex, model) {
|
|
|
147
150
|
})
|
|
148
151
|
});
|
|
149
152
|
}
|
|
150
|
-
if (guardrails.custom?.guardrail) {
|
|
153
|
+
if (guardrails.custom?.guardrail && checkModelAvailable(model)) {
|
|
151
154
|
for (const customGuardrail of guardrails.custom.guardrail) {
|
|
152
155
|
const { prompt, threshold, name } = customGuardrail;
|
|
153
156
|
stageGuardrails.input.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../nodes/Guardrails/actions/process.ts"],"sourcesContent":["import type { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport type { IExecuteFunctions } from 'n8n-workflow';\nimport { NodeOperationError } from 'n8n-workflow';\n\nimport { runStageGuardrails } from '../helpers/base';\nimport { splitByComma } from '../helpers/common';\nimport { mapGuardrailErrorsToMessage, mapGuardrailResultToUserResult } from '../helpers/mappers';\nimport { createLLMCheckFn } from '../helpers/model';\nimport { applyPreflightModifications } from '../helpers/preflight';\nimport { createJailbreakCheckFn, JAILBREAK_PROMPT } from './checks/jailbreak';\nimport { createKeywordsCheckFn } from './checks/keywords';\nimport { createNSFWCheckFn, NSFW_SYSTEM_PROMPT } from './checks/nsfw';\nimport { createCustomRegexCheckFn, createPiiCheckFn } from './checks/pii';\nimport { createSecretKeysCheckFn } from './checks/secretKeys';\nimport {\n\tcreateTopicalAlignmentCheckFn,\n\tTOPICAL_ALIGNMENT_SYSTEM_PROMPT,\n} from './checks/topicalAlignment';\nimport { createUrlsCheckFn } from './checks/urls';\nimport type {\n\tGroupedGuardrailResults,\n\tGuardrailsOptions,\n\tGuardrailUserResult,\n\tStageGuardRails,\n} from './types';\n\ninterface Result {\n\tchecks: GuardrailUserResult[];\n}\n\nexport async function process(\n\tthis: IExecuteFunctions,\n\titemIndex: number,\n\tmodel: BaseChatModel | null,\n): Promise<{\n\tguardrailsInput: string;\n\tpassed: Result | null;\n\tfailed: Result | null;\n}> {\n\tconst inputText = this.getNodeParameter('text', itemIndex) as string;\n\tconst operation = this.getNodeParameter('operation', 0) as 'classify' | 'sanitize';\n\tconst guardrails = this.getNodeParameter('guardrails', itemIndex) as GuardrailsOptions;\n\tconst customizeSystemMessage =\n\t\toperation === 'classify' &&\n\t\t(this.getNodeParameter('customizeSystemMessage', itemIndex, false) as boolean);\n\tconst systemMessage = customizeSystemMessage\n\t\t? (this.getNodeParameter('systemMessage', itemIndex) as string)\n\t\t: undefined;\n\tconst failedChecks: GuardrailUserResult[] = [];\n\tconst passedChecks: GuardrailUserResult[] = [];\n\n\tconst handleFailedResults = (results: GroupedGuardrailResults): GuardrailUserResult[] => {\n\t\tconst unexpectedError = results.failed.find(\n\t\t\t(result) =>\n\t\t\t\tresult.status === 'rejected' ||\n\t\t\t\t(result.status === 'fulfilled' && result.value.executionFailed),\n\t\t);\n\n\t\tif (results.failed.length && operation === 'sanitize') {\n\t\t\tthrow new NodeOperationError(this.getNode(), 'Failed to sanitize text', {\n\t\t\t\tdescription: mapGuardrailErrorsToMessage(results.failed),\n\t\t\t\titemIndex,\n\t\t\t});\n\t\t}\n\t\tif (unexpectedError && !this.continueOnFail()) {\n\t\t\tconst error =\n\t\t\t\tunexpectedError.status === 'rejected'\n\t\t\t\t\t? unexpectedError.reason\n\t\t\t\t\t: unexpectedError.value.originalException;\n\t\t\tthrow new NodeOperationError(this.getNode(), error, {\n\t\t\t\tdescription: error?.description || error?.message,\n\t\t\t\titemIndex,\n\t\t\t});\n\t\t}\n\t\treturn results.failed.map(mapGuardrailResultToUserResult);\n\t};\n\n\tconst stageGuardrails: StageGuardRails = {\n\t\tpreflight: [],\n\t\tinput: [],\n\t};\n\n\tif (guardrails.pii?.value) {\n\t\tconst { entities } = guardrails.pii.value;\n\t\tstageGuardrails.preflight.push({\n\t\t\tname: 'personalData',\n\t\t\tcheck: createPiiCheckFn({\n\t\t\t\tentities,\n\t\t\t}),\n\t\t});\n\t}\n\n\tif (guardrails.customRegex?.regex) {\n\t\tstageGuardrails.preflight.push({\n\t\t\tname: 'customRegex',\n\t\t\tcheck: createCustomRegexCheckFn({\n\t\t\t\tcustomRegex: guardrails.customRegex.regex,\n\t\t\t}),\n\t\t});\n\t}\n\n\tif (guardrails.secretKeys?.value) {\n\t\tconst { permissiveness } = guardrails.secretKeys.value;\n\t\tstageGuardrails.preflight.push({\n\t\t\tname: 'secretKeys',\n\t\t\tcheck: createSecretKeysCheckFn({ threshold: permissiveness }),\n\t\t});\n\t}\n\n\tif (guardrails.urls?.value) {\n\t\tconst { allowedUrls, allowedSchemes, blockUserinfo, allowSubdomains } = guardrails.urls.value;\n\t\tstageGuardrails.preflight.push({\n\t\t\tname: 'urls',\n\t\t\tcheck: createUrlsCheckFn({\n\t\t\t\tallowedUrls: splitByComma(allowedUrls),\n\t\t\t\tallowedSchemes,\n\t\t\t\tblockUserinfo,\n\t\t\t\tallowSubdomains,\n\t\t\t}),\n\t\t});\n\t}\n\n\tif (operation === 'classify') {\n\t\tif (!model) {\n\t\t\tthrow new NodeOperationError(this.getNode(), 'Chat Model is required for classify operation');\n\t\t}\n\n\t\tif (guardrails.keywords) {\n\t\t\tstageGuardrails.input.push({\n\t\t\t\tname: 'keywords',\n\t\t\t\tcheck: createKeywordsCheckFn({ keywords: splitByComma(guardrails.keywords) }),\n\t\t\t});\n\t\t}\n\n\t\tif (guardrails.jailbreak?.value) {\n\t\t\tconst { prompt, threshold } = guardrails.jailbreak.value;\n\t\t\tstageGuardrails.input.push({\n\t\t\t\tname: 'jailbreak',\n\t\t\t\tcheck: createJailbreakCheckFn({\n\t\t\t\t\tmodel,\n\t\t\t\t\tprompt: prompt?.trim() || JAILBREAK_PROMPT,\n\t\t\t\t\tthreshold,\n\t\t\t\t\tsystemMessage,\n\t\t\t\t}),\n\t\t\t});\n\t\t}\n\n\t\tif (guardrails.nsfw?.value) {\n\t\t\tconst { prompt, threshold } = guardrails.nsfw.value;\n\t\t\tstageGuardrails.input.push({\n\t\t\t\tname: 'nsfw',\n\t\t\t\tcheck: createNSFWCheckFn({\n\t\t\t\t\tmodel,\n\t\t\t\t\tprompt: prompt?.trim() || NSFW_SYSTEM_PROMPT,\n\t\t\t\t\tthreshold,\n\t\t\t\t\tsystemMessage,\n\t\t\t\t}),\n\t\t\t});\n\t\t}\n\n\t\tif (guardrails.topicalAlignment?.value) {\n\t\t\tconst { prompt, threshold } = guardrails.topicalAlignment.value;\n\t\t\tstageGuardrails.input.push({\n\t\t\t\tname: 'topicalAlignment',\n\t\t\t\tcheck: createTopicalAlignmentCheckFn({\n\t\t\t\t\tmodel,\n\t\t\t\t\tprompt: prompt?.trim() || TOPICAL_ALIGNMENT_SYSTEM_PROMPT,\n\t\t\t\t\tsystemMessage,\n\t\t\t\t\tthreshold,\n\t\t\t\t}),\n\t\t\t});\n\t\t}\n\n\t\tif (guardrails.custom?.guardrail) {\n\t\t\tfor (const customGuardrail of guardrails.custom.guardrail) {\n\t\t\t\tconst { prompt, threshold, name } = customGuardrail;\n\t\t\t\tstageGuardrails.input.push({\n\t\t\t\t\tname,\n\t\t\t\t\tcheck: createLLMCheckFn(name, {\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tprompt,\n\t\t\t\t\t\tthreshold,\n\t\t\t\t\t\tsystemMessage,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tconst preflightResults = await runStageGuardrails({\n\t\tinputText,\n\t\tstageGuardrails,\n\t\tstage: 'preflight',\n\t\tfailOnlyOnErrors: operation === 'sanitize',\n\t});\n\n\tif (preflightResults.failed.length > 0) {\n\t\tfailedChecks.push.apply(failedChecks, handleFailedResults(preflightResults));\n\t\treturn {\n\t\t\tguardrailsInput: inputText,\n\t\t\tpassed: null,\n\t\t\tfailed: {\n\t\t\t\tchecks: failedChecks,\n\t\t\t},\n\t\t};\n\t} else {\n\t\tpassedChecks.push.apply(\n\t\t\tpassedChecks,\n\t\t\tpreflightResults.passed.map(mapGuardrailResultToUserResult),\n\t\t);\n\t}\n\n\tconst modifiedInputText = applyPreflightModifications(\n\t\tinputText,\n\t\tpreflightResults.passed.map((result) => result.value),\n\t);\n\n\tconst inputResults = await runStageGuardrails({\n\t\tinputText: modifiedInputText,\n\t\tstageGuardrails,\n\t\tstage: 'input',\n\t\tfailOnlyOnErrors: operation === 'sanitize',\n\t});\n\tif (inputResults.failed.length > 0) {\n\t\tfailedChecks.push.apply(failedChecks, handleFailedResults(inputResults));\n\t\treturn {\n\t\t\tguardrailsInput: modifiedInputText,\n\t\t\tpassed: null,\n\t\t\tfailed: {\n\t\t\t\tchecks: failedChecks,\n\t\t\t},\n\t\t};\n\t} else {\n\t\tpassedChecks.push.apply(passedChecks, inputResults.passed.map(mapGuardrailResultToUserResult));\n\t}\n\n\treturn {\n\t\tguardrailsInput: modifiedInputText,\n\t\tpassed: {\n\t\t\tchecks: passedChecks,\n\t\t},\n\t\tfailed: null,\n\t};\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../nodes/Guardrails/actions/process.ts"],"sourcesContent":["import type { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport type { IExecuteFunctions } from 'n8n-workflow';\nimport { NodeOperationError } from 'n8n-workflow';\n\nimport { runStageGuardrails } from '../helpers/base';\nimport { splitByComma } from '../helpers/common';\nimport { mapGuardrailErrorsToMessage, mapGuardrailResultToUserResult } from '../helpers/mappers';\nimport { createLLMCheckFn } from '../helpers/model';\nimport { applyPreflightModifications } from '../helpers/preflight';\nimport { createJailbreakCheckFn, JAILBREAK_PROMPT } from './checks/jailbreak';\nimport { createKeywordsCheckFn } from './checks/keywords';\nimport { createNSFWCheckFn, NSFW_SYSTEM_PROMPT } from './checks/nsfw';\nimport { createCustomRegexCheckFn, createPiiCheckFn } from './checks/pii';\nimport { createSecretKeysCheckFn } from './checks/secretKeys';\nimport {\n\tcreateTopicalAlignmentCheckFn,\n\tTOPICAL_ALIGNMENT_SYSTEM_PROMPT,\n} from './checks/topicalAlignment';\nimport { createUrlsCheckFn } from './checks/urls';\nimport type {\n\tGroupedGuardrailResults,\n\tGuardrailsOptions,\n\tGuardrailUserResult,\n\tStageGuardRails,\n} from './types';\n\ninterface Result {\n\tchecks: GuardrailUserResult[];\n}\n\nexport async function process(\n\tthis: IExecuteFunctions,\n\titemIndex: number,\n\tmodel: BaseChatModel | null,\n): Promise<{\n\tguardrailsInput: string;\n\tpassed: Result | null;\n\tfailed: Result | null;\n}> {\n\tconst inputText = this.getNodeParameter('text', itemIndex) as string;\n\tconst operation = this.getNodeParameter('operation', 0) as 'classify' | 'sanitize';\n\tconst guardrails = this.getNodeParameter('guardrails', itemIndex) as GuardrailsOptions;\n\tconst customizeSystemMessage =\n\t\toperation === 'classify' &&\n\t\t(this.getNodeParameter('customizeSystemMessage', itemIndex, false) as boolean);\n\tconst systemMessage = customizeSystemMessage\n\t\t? (this.getNodeParameter('systemMessage', itemIndex) as string)\n\t\t: undefined;\n\tconst failedChecks: GuardrailUserResult[] = [];\n\tconst passedChecks: GuardrailUserResult[] = [];\n\n\tconst handleFailedResults = (results: GroupedGuardrailResults): GuardrailUserResult[] => {\n\t\tconst unexpectedError = results.failed.find(\n\t\t\t(result) =>\n\t\t\t\tresult.status === 'rejected' ||\n\t\t\t\t(result.status === 'fulfilled' && result.value.executionFailed),\n\t\t);\n\n\t\tif (results.failed.length && operation === 'sanitize') {\n\t\t\tthrow new NodeOperationError(this.getNode(), 'Failed to sanitize text', {\n\t\t\t\tdescription: mapGuardrailErrorsToMessage(results.failed),\n\t\t\t\titemIndex,\n\t\t\t});\n\t\t}\n\t\tif (unexpectedError && !this.continueOnFail()) {\n\t\t\tconst error =\n\t\t\t\tunexpectedError.status === 'rejected'\n\t\t\t\t\t? unexpectedError.reason\n\t\t\t\t\t: unexpectedError.value.originalException;\n\t\t\tthrow new NodeOperationError(this.getNode(), error, {\n\t\t\t\tdescription: error?.description || error?.message,\n\t\t\t\titemIndex,\n\t\t\t});\n\t\t}\n\t\treturn results.failed.map(mapGuardrailResultToUserResult);\n\t};\n\n\tconst stageGuardrails: StageGuardRails = {\n\t\tpreflight: [],\n\t\tinput: [],\n\t};\n\n\tconst checkModelAvailable = (model: BaseChatModel | null): model is BaseChatModel => {\n\t\tif (!model) {\n\t\t\tthrow new NodeOperationError(this.getNode(), 'Chat Model is required');\n\t\t}\n\t\treturn true;\n\t};\n\n\tif (guardrails.pii?.value) {\n\t\tconst { entities } = guardrails.pii.value;\n\t\tstageGuardrails.preflight.push({\n\t\t\tname: 'personalData',\n\t\t\tcheck: createPiiCheckFn({\n\t\t\t\tentities,\n\t\t\t}),\n\t\t});\n\t}\n\n\tif (guardrails.customRegex?.regex) {\n\t\tstageGuardrails.preflight.push({\n\t\t\tname: 'customRegex',\n\t\t\tcheck: createCustomRegexCheckFn({\n\t\t\t\tcustomRegex: guardrails.customRegex.regex,\n\t\t\t}),\n\t\t});\n\t}\n\n\tif (guardrails.secretKeys?.value) {\n\t\tconst { permissiveness } = guardrails.secretKeys.value;\n\t\tstageGuardrails.preflight.push({\n\t\t\tname: 'secretKeys',\n\t\t\tcheck: createSecretKeysCheckFn({ threshold: permissiveness }),\n\t\t});\n\t}\n\n\tif (guardrails.urls?.value) {\n\t\tconst { allowedUrls, allowedSchemes, blockUserinfo, allowSubdomains } = guardrails.urls.value;\n\t\tstageGuardrails.preflight.push({\n\t\t\tname: 'urls',\n\t\t\tcheck: createUrlsCheckFn({\n\t\t\t\tallowedUrls: splitByComma(allowedUrls),\n\t\t\t\tallowedSchemes,\n\t\t\t\tblockUserinfo,\n\t\t\t\tallowSubdomains,\n\t\t\t}),\n\t\t});\n\t}\n\n\tif (operation === 'classify') {\n\t\tif (guardrails.keywords) {\n\t\t\tstageGuardrails.input.push({\n\t\t\t\tname: 'keywords',\n\t\t\t\tcheck: createKeywordsCheckFn({ keywords: splitByComma(guardrails.keywords) }),\n\t\t\t});\n\t\t}\n\n\t\tif (guardrails.jailbreak?.value && checkModelAvailable(model)) {\n\t\t\tconst { prompt, threshold } = guardrails.jailbreak.value;\n\t\t\tstageGuardrails.input.push({\n\t\t\t\tname: 'jailbreak',\n\t\t\t\tcheck: createJailbreakCheckFn({\n\t\t\t\t\tmodel,\n\t\t\t\t\tprompt: prompt?.trim() || JAILBREAK_PROMPT,\n\t\t\t\t\tthreshold,\n\t\t\t\t\tsystemMessage,\n\t\t\t\t}),\n\t\t\t});\n\t\t}\n\n\t\tif (guardrails.nsfw?.value && checkModelAvailable(model)) {\n\t\t\tconst { prompt, threshold } = guardrails.nsfw.value;\n\t\t\tstageGuardrails.input.push({\n\t\t\t\tname: 'nsfw',\n\t\t\t\tcheck: createNSFWCheckFn({\n\t\t\t\t\tmodel,\n\t\t\t\t\tprompt: prompt?.trim() || NSFW_SYSTEM_PROMPT,\n\t\t\t\t\tthreshold,\n\t\t\t\t\tsystemMessage,\n\t\t\t\t}),\n\t\t\t});\n\t\t}\n\n\t\tif (guardrails.topicalAlignment?.value && checkModelAvailable(model)) {\n\t\t\tconst { prompt, threshold } = guardrails.topicalAlignment.value;\n\t\t\tstageGuardrails.input.push({\n\t\t\t\tname: 'topicalAlignment',\n\t\t\t\tcheck: createTopicalAlignmentCheckFn({\n\t\t\t\t\tmodel,\n\t\t\t\t\tprompt: prompt?.trim() || TOPICAL_ALIGNMENT_SYSTEM_PROMPT,\n\t\t\t\t\tsystemMessage,\n\t\t\t\t\tthreshold,\n\t\t\t\t}),\n\t\t\t});\n\t\t}\n\n\t\tif (guardrails.custom?.guardrail && checkModelAvailable(model)) {\n\t\t\tfor (const customGuardrail of guardrails.custom.guardrail) {\n\t\t\t\tconst { prompt, threshold, name } = customGuardrail;\n\t\t\t\tstageGuardrails.input.push({\n\t\t\t\t\tname,\n\t\t\t\t\tcheck: createLLMCheckFn(name, {\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tprompt,\n\t\t\t\t\t\tthreshold,\n\t\t\t\t\t\tsystemMessage,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tconst preflightResults = await runStageGuardrails({\n\t\tinputText,\n\t\tstageGuardrails,\n\t\tstage: 'preflight',\n\t\tfailOnlyOnErrors: operation === 'sanitize',\n\t});\n\n\tif (preflightResults.failed.length > 0) {\n\t\tfailedChecks.push.apply(failedChecks, handleFailedResults(preflightResults));\n\t\treturn {\n\t\t\tguardrailsInput: inputText,\n\t\t\tpassed: null,\n\t\t\tfailed: {\n\t\t\t\tchecks: failedChecks,\n\t\t\t},\n\t\t};\n\t} else {\n\t\tpassedChecks.push.apply(\n\t\t\tpassedChecks,\n\t\t\tpreflightResults.passed.map(mapGuardrailResultToUserResult),\n\t\t);\n\t}\n\n\tconst modifiedInputText = applyPreflightModifications(\n\t\tinputText,\n\t\tpreflightResults.passed.map((result) => result.value),\n\t);\n\n\tconst inputResults = await runStageGuardrails({\n\t\tinputText: modifiedInputText,\n\t\tstageGuardrails,\n\t\tstage: 'input',\n\t\tfailOnlyOnErrors: operation === 'sanitize',\n\t});\n\tif (inputResults.failed.length > 0) {\n\t\tfailedChecks.push.apply(failedChecks, handleFailedResults(inputResults));\n\t\treturn {\n\t\t\tguardrailsInput: modifiedInputText,\n\t\t\tpassed: null,\n\t\t\tfailed: {\n\t\t\t\tchecks: failedChecks,\n\t\t\t},\n\t\t};\n\t} else {\n\t\tpassedChecks.push.apply(passedChecks, inputResults.passed.map(mapGuardrailResultToUserResult));\n\t}\n\n\treturn {\n\t\tguardrailsInput: modifiedInputText,\n\t\tpassed: {\n\t\t\tchecks: passedChecks,\n\t\t},\n\t\tfailed: null,\n\t};\n}\n"],"mappings":"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","names":["model"]}
|