@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.
Files changed (137) hide show
  1. package/dist/nodes/Guardrails/Guardrails.node.js +29 -40
  2. package/dist/nodes/Guardrails/Guardrails.node.js.map +1 -1
  3. package/dist/nodes/Guardrails/actions/execute.js +68 -0
  4. package/dist/nodes/Guardrails/actions/execute.js.map +1 -0
  5. package/dist/nodes/Guardrails/actions/process.js +10 -7
  6. package/dist/nodes/Guardrails/actions/process.js.map +1 -1
  7. package/dist/nodes/Guardrails/description.js +326 -365
  8. package/dist/nodes/Guardrails/description.js.map +1 -1
  9. package/dist/nodes/Guardrails/helpers/configureNodeInputs.js +37 -3
  10. package/dist/nodes/Guardrails/helpers/configureNodeInputs.js.map +1 -1
  11. package/dist/nodes/Guardrails/helpers/model.js.map +1 -1
  12. package/dist/nodes/Guardrails/v1/GuardrailsV1.node.js +59 -0
  13. package/dist/nodes/Guardrails/v1/GuardrailsV1.node.js.map +1 -0
  14. package/dist/nodes/Guardrails/v2/GuardrailsV2.node.js +59 -0
  15. package/dist/nodes/Guardrails/v2/GuardrailsV2.node.js.map +1 -0
  16. package/dist/nodes/ToolExecutor/ToolExecutor.node.js.map +1 -1
  17. package/dist/nodes/agents/Agent/agents/ConversationalAgent/execute.js +1 -1
  18. package/dist/nodes/agents/Agent/agents/ConversationalAgent/execute.js.map +1 -1
  19. package/dist/nodes/agents/Agent/agents/OpenAiFunctionsAgent/execute.js +3 -85
  20. package/dist/nodes/agents/Agent/agents/OpenAiFunctionsAgent/execute.js.map +1 -1
  21. package/dist/nodes/agents/Agent/agents/PlanAndExecuteAgent/execute.js +1 -1
  22. package/dist/nodes/agents/Agent/agents/PlanAndExecuteAgent/execute.js.map +1 -1
  23. package/dist/nodes/agents/Agent/agents/ReActAgent/execute.js +1 -1
  24. package/dist/nodes/agents/Agent/agents/ReActAgent/execute.js.map +1 -1
  25. package/dist/nodes/agents/Agent/agents/SqlAgent/execute.js +2 -2
  26. package/dist/nodes/agents/Agent/agents/SqlAgent/execute.js.map +1 -1
  27. package/dist/nodes/agents/Agent/agents/ToolsAgent/V1/execute.js +1 -1
  28. package/dist/nodes/agents/Agent/agents/ToolsAgent/V1/execute.js.map +1 -1
  29. package/dist/nodes/agents/Agent/agents/ToolsAgent/V2/execute.js +1 -1
  30. package/dist/nodes/agents/Agent/agents/ToolsAgent/V2/execute.js.map +1 -1
  31. package/dist/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/buildExecutionContext.js.map +1 -1
  32. package/dist/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/createAgentSequence.js +1 -1
  33. package/dist/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/createAgentSequence.js.map +1 -1
  34. package/dist/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/executeBatch.js.map +1 -1
  35. package/dist/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/finalizeResult.js.map +1 -1
  36. package/dist/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/prepareItemContext.js.map +1 -1
  37. package/dist/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/runAgent.js +8 -16
  38. package/dist/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/runAgent.js.map +1 -1
  39. package/dist/nodes/agents/Agent/agents/ToolsAgent/common.js +1 -1
  40. package/dist/nodes/agents/Agent/agents/ToolsAgent/common.js.map +1 -1
  41. package/dist/nodes/agents/Agent/agents/utils.js.map +1 -1
  42. package/dist/nodes/agents/OpenAiAssistant/OpenAiAssistant.node.js +2 -2
  43. package/dist/nodes/agents/OpenAiAssistant/OpenAiAssistant.node.js.map +1 -1
  44. package/dist/nodes/chains/ChainRetrievalQA/processItem.js +2 -2
  45. package/dist/nodes/chains/ChainRetrievalQA/processItem.js.map +1 -1
  46. package/dist/nodes/chains/ChainSummarization/V1/ChainSummarizationV1.node.js +1 -1
  47. package/dist/nodes/chains/ChainSummarization/V1/ChainSummarizationV1.node.js.map +1 -1
  48. package/dist/nodes/chains/ChainSummarization/V2/processItem.js +1 -1
  49. package/dist/nodes/chains/ChainSummarization/V2/processItem.js.map +1 -1
  50. package/dist/nodes/chains/ChainSummarization/helpers.js.map +1 -1
  51. package/dist/nodes/chains/InformationExtractor/InformationExtractor.node.js +1 -1
  52. package/dist/nodes/chains/InformationExtractor/InformationExtractor.node.js.map +1 -1
  53. package/dist/nodes/chains/InformationExtractor/processItem.js.map +1 -1
  54. package/dist/nodes/chains/SentimentAnalysis/SentimentAnalysis.node.js +1 -1
  55. package/dist/nodes/chains/SentimentAnalysis/SentimentAnalysis.node.js.map +1 -1
  56. package/dist/nodes/chains/TextClassifier/TextClassifier.node.js +1 -1
  57. package/dist/nodes/chains/TextClassifier/TextClassifier.node.js.map +1 -1
  58. package/dist/nodes/chains/TextClassifier/processItem.js.map +1 -1
  59. package/dist/nodes/code/Code.node.js +66 -2
  60. package/dist/nodes/code/Code.node.js.map +1 -1
  61. package/dist/nodes/llms/LMOllama/LmOllama.node.js +1 -1
  62. package/dist/nodes/llms/LMOllama/LmOllama.node.js.map +1 -1
  63. package/dist/nodes/mcp/McpClientTool/utils.js +1 -1
  64. package/dist/nodes/mcp/McpClientTool/utils.js.map +1 -1
  65. package/dist/nodes/memory/MemoryBufferWindow/MemoryBufferWindow.node.js +1 -1
  66. package/dist/nodes/memory/MemoryBufferWindow/MemoryBufferWindow.node.js.map +1 -1
  67. package/dist/nodes/memory/MemoryMongoDbChat/MemoryMongoDbChat.node.js +1 -1
  68. package/dist/nodes/memory/MemoryMongoDbChat/MemoryMongoDbChat.node.js.map +1 -1
  69. package/dist/nodes/memory/MemoryPostgresChat/MemoryPostgresChat.node.js +1 -1
  70. package/dist/nodes/memory/MemoryPostgresChat/MemoryPostgresChat.node.js.map +1 -1
  71. package/dist/nodes/memory/MemoryRedisChat/MemoryRedisChat.node.js +1 -1
  72. package/dist/nodes/memory/MemoryRedisChat/MemoryRedisChat.node.js.map +1 -1
  73. package/dist/nodes/memory/MemoryXata/MemoryXata.node.js +1 -1
  74. package/dist/nodes/memory/MemoryXata/MemoryXata.node.js.map +1 -1
  75. package/dist/nodes/retrievers/RetrieverContextualCompression/RetrieverContextualCompression.node.js +2 -2
  76. package/dist/nodes/retrievers/RetrieverContextualCompression/RetrieverContextualCompression.node.js.map +1 -1
  77. package/dist/nodes/retrievers/RetrieverMultiQuery/RetrieverMultiQuery.node.js +1 -1
  78. package/dist/nodes/retrievers/RetrieverMultiQuery/RetrieverMultiQuery.node.js.map +1 -1
  79. package/dist/nodes/retrievers/RetrieverVectorStore/RetrieverVectorStore.node.js +1 -1
  80. package/dist/nodes/retrievers/RetrieverVectorStore/RetrieverVectorStore.node.js.map +1 -1
  81. package/dist/nodes/tools/ToolThink/ToolThink.node.js +1 -1
  82. package/dist/nodes/tools/ToolThink/ToolThink.node.js.map +1 -1
  83. package/dist/nodes/tools/ToolVectorStore/ToolVectorStore.node.js +2 -2
  84. package/dist/nodes/tools/ToolVectorStore/ToolVectorStore.node.js.map +1 -1
  85. package/dist/nodes/tools/ToolWorkflow/v2/utils/WorkflowToolService.js +5 -21
  86. package/dist/nodes/tools/ToolWorkflow/v2/utils/WorkflowToolService.js.map +1 -1
  87. package/dist/nodes/trigger/ChatTrigger/Chat.node.js +2 -2
  88. package/dist/nodes/trigger/ChatTrigger/Chat.node.js.map +1 -1
  89. package/dist/nodes/trigger/ChatTrigger/ChatTrigger.node.js +1 -1
  90. package/dist/nodes/trigger/ChatTrigger/ChatTrigger.node.js.map +1 -1
  91. package/dist/nodes/vector_store/VectorStoreAzureAISearch/VectorStoreAzureAISearch.node.js +65 -17
  92. package/dist/nodes/vector_store/VectorStoreAzureAISearch/VectorStoreAzureAISearch.node.js.map +1 -1
  93. package/dist/nodes/vector_store/VectorStoreInMemory/VectorStoreInMemory.node.js.map +1 -1
  94. package/dist/nodes/vector_store/VectorStoreInMemoryInsert/VectorStoreInMemoryInsert.node.js.map +1 -1
  95. package/dist/nodes/vector_store/VectorStoreQdrant/qdrant.svg +23 -19
  96. package/dist/nodes/vector_store/shared/MemoryManager/MemoryCalculator.js.map +1 -1
  97. package/dist/nodes/vector_store/shared/MemoryManager/MemoryVectorStoreManager.js +1 -1
  98. package/dist/nodes/vector_store/shared/MemoryManager/MemoryVectorStoreManager.js.map +1 -1
  99. package/dist/nodes/vector_store/shared/MemoryManager/StoreCleanupService.js.map +1 -1
  100. package/dist/nodes/vector_store/shared/MemoryManager/types.js.map +1 -1
  101. package/dist/nodes/vector_store/shared/createVectorStoreNode/operations/retrieveAsToolOperation.js +18 -16
  102. package/dist/nodes/vector_store/shared/createVectorStoreNode/operations/retrieveAsToolOperation.js.map +1 -1
  103. package/dist/nodes/vendors/GoogleGemini/actions/image/edit.operation.js +6 -1
  104. package/dist/nodes/vendors/GoogleGemini/actions/image/edit.operation.js.map +1 -1
  105. package/dist/nodes/vendors/GoogleGemini/actions/image/generate.operation.js +1 -1
  106. package/dist/nodes/vendors/GoogleGemini/actions/image/generate.operation.js.map +1 -1
  107. package/dist/nodes/vendors/GoogleGemini/methods/listSearch.js +23 -8
  108. package/dist/nodes/vendors/GoogleGemini/methods/listSearch.js.map +1 -1
  109. package/dist/nodes/vendors/OpenAi/helpers/utils.js.map +1 -1
  110. package/dist/nodes/vendors/OpenAi/v1/actions/assistant/message.operation.js +2 -2
  111. package/dist/nodes/vendors/OpenAi/v1/actions/assistant/message.operation.js.map +1 -1
  112. package/dist/types/nodes.json +7 -6
  113. package/dist/utils/N8nBinaryLoader.js +2 -2
  114. package/dist/utils/N8nBinaryLoader.js.map +1 -1
  115. package/dist/utils/N8nJsonLoader.js +2 -2
  116. package/dist/utils/N8nJsonLoader.js.map +1 -1
  117. package/dist/utils/N8nTool.js +1 -1
  118. package/dist/utils/N8nTool.js.map +1 -1
  119. package/dist/utils/agent-execution/buildSteps.js +12 -8
  120. package/dist/utils/agent-execution/buildSteps.js.map +1 -1
  121. package/dist/utils/agent-execution/createEngineRequests.js +19 -1
  122. package/dist/utils/agent-execution/createEngineRequests.js.map +1 -1
  123. package/dist/utils/agent-execution/index.js +4 -4
  124. package/dist/utils/agent-execution/index.js.map +1 -1
  125. package/dist/utils/agent-execution/memoryManagement.js +15 -14
  126. package/dist/utils/agent-execution/memoryManagement.js.map +1 -1
  127. package/dist/utils/agent-execution/processEventStream.js +1 -47
  128. package/dist/utils/agent-execution/processEventStream.js.map +1 -1
  129. package/dist/utils/agent-execution/types.js.map +1 -1
  130. package/dist/utils/fromAIToolFactory.js +61 -0
  131. package/dist/utils/fromAIToolFactory.js.map +1 -0
  132. package/dist/utils/helpers.js +1 -1
  133. package/dist/utils/helpers.js.map +1 -1
  134. package/dist/utils/logWrapper.js.map +1 -1
  135. package/dist/utils/output_parsers/N8nStructuredOutputParser.js +1 -1
  136. package/dist/utils/output_parsers/N8nStructuredOutputParser.js.map +1 -1
  137. 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 import_process = require("./actions/process");
25
- var import_description = require("./description");
26
- var import_model = require("./helpers/model");
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
- this.description = import_description.versionDescription;
30
- }
31
- async execute() {
32
- const items = this.getInputData();
33
- const operation = this.getNodeParameter("operation", 0);
34
- const model = operation === "classify" ? await import_model.getChatModel.call(this) : null;
35
- const failedItems = [];
36
- const passedItems = [];
37
- for (let i = 0; i < items.length; i++) {
38
- try {
39
- const responseData = await import_process.process.call(this, i, model);
40
- if (responseData.passed) {
41
- passedItems.push({
42
- json: { guardrailsInput: responseData.guardrailsInput, ...responseData.passed },
43
- pairedItem: { item: i }
44
- });
45
- }
46
- if (responseData.failed) {
47
- failedItems.push({
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
- if (operation === "classify") {
64
- return [passedItems, failedItems];
65
- }
66
- return [passedItems];
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 type { IExecuteFunctions, INodeExecutionData, INodeType } from 'n8n-workflow';\n\nimport { process } from './actions/process';\nimport { versionDescription } from './description';\nimport { getChatModel } from './helpers/model';\n\nexport class Guardrails implements INodeType {\n\tdescription = versionDescription;\n\n\tasync execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {\n\t\tconst items = this.getInputData();\n\t\tconst operation = this.getNodeParameter('operation', 0) as 'classify' | 'sanitize';\n\t\tconst model = operation === 'classify' ? await getChatModel.call(this) : null;\n\n\t\tconst failedItems: INodeExecutionData[] = [];\n\t\tconst passedItems: INodeExecutionData[] = [];\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\ttry {\n\t\t\t\tconst responseData = await process.call(this, i, model);\n\t\t\t\tif (responseData.passed) {\n\t\t\t\t\tpassedItems.push({\n\t\t\t\t\t\tjson: { guardrailsInput: responseData.guardrailsInput, ...responseData.passed },\n\t\t\t\t\t\tpairedItem: { item: i },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (responseData.failed) {\n\t\t\t\t\tfailedItems.push({\n\t\t\t\t\t\tjson: { guardrailsInput: responseData.guardrailsInput, ...responseData.failed },\n\t\t\t\t\t\tpairedItem: { item: i },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\tfailedItems.push({\n\t\t\t\t\t\tjson: { error: error.message, guardrailsInput: '' },\n\t\t\t\t\t\tpairedItem: { item: i },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'classify') {\n\t\t\treturn [passedItems, failedItems];\n\t\t}\n\n\t\treturn [passedItems];\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,qBAAwB;AACxB,yBAAmC;AACnC,mBAA6B;AAEtB,MAAM,WAAgC;AAAA,EAAtC;AACN,uBAAc;AAAA;AAAA,EAEd,MAAM,UAAkE;AACvE,UAAM,QAAQ,KAAK,aAAa;AAChC,UAAM,YAAY,KAAK,iBAAiB,aAAa,CAAC;AACtD,UAAM,QAAQ,cAAc,aAAa,MAAM,0BAAa,KAAK,IAAI,IAAI;AAEzE,UAAM,cAAoC,CAAC;AAC3C,UAAM,cAAoC,CAAC;AAC3C,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,UAAI;AACH,cAAM,eAAe,MAAM,uBAAQ,KAAK,MAAM,GAAG,KAAK;AACtD,YAAI,aAAa,QAAQ;AACxB,sBAAY,KAAK;AAAA,YAChB,MAAM,EAAE,iBAAiB,aAAa,iBAAiB,GAAG,aAAa,OAAO;AAAA,YAC9E,YAAY,EAAE,MAAM,EAAE;AAAA,UACvB,CAAC;AAAA,QACF;AACA,YAAI,aAAa,QAAQ;AACxB,sBAAY,KAAK;AAAA,YAChB,MAAM,EAAE,iBAAiB,aAAa,iBAAiB,GAAG,aAAa,OAAO;AAAA,YAC9E,YAAY,EAAE,MAAM,EAAE;AAAA,UACvB,CAAC;AAAA,QACF;AAAA,MACD,SAAS,OAAO;AACf,YAAI,KAAK,eAAe,GAAG;AAC1B,sBAAY,KAAK;AAAA,YAChB,MAAM,EAAE,OAAO,MAAM,SAAS,iBAAiB,GAAG;AAAA,YAClD,YAAY,EAAE,MAAM,EAAE;AAAA,UACvB,CAAC;AAAA,QACF,OAAO;AACN,gBAAM;AAAA,QACP;AAAA,MACD;AAAA,IACD;AAEA,QAAI,cAAc,YAAY;AAC7B,aAAO,CAAC,aAAa,WAAW;AAAA,IACjC;AAEA,WAAO,CAAC,WAAW;AAAA,EACpB;AACD;","names":[]}
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":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,0BAAmC;AAEnC,kBAAmC;AACnC,oBAA6B;AAC7B,qBAA4E;AAC5E,mBAAiC;AACjC,uBAA4C;AAC5C,uBAAyD;AACzD,sBAAsC;AACtC,kBAAsD;AACtD,iBAA2D;AAC3D,wBAAwC;AACxC,8BAGO;AACP,kBAAkC;AAYlC,eAAsB,QAErB,WACA,OAKE;AACF,QAAM,YAAY,KAAK,iBAAiB,QAAQ,SAAS;AACzD,QAAM,YAAY,KAAK,iBAAiB,aAAa,CAAC;AACtD,QAAM,aAAa,KAAK,iBAAiB,cAAc,SAAS;AAChE,QAAM,yBACL,cAAc,cACb,KAAK,iBAAiB,0BAA0B,WAAW,KAAK;AAClE,QAAM,gBAAgB,yBAClB,KAAK,iBAAiB,iBAAiB,SAAS,IACjD;AACH,QAAM,eAAsC,CAAC;AAC7C,QAAM,eAAsC,CAAC;AAE7C,QAAM,sBAAsB,CAAC,YAA4D;AACxF,UAAM,kBAAkB,QAAQ,OAAO;AAAA,MACtC,CAAC,WACA,OAAO,WAAW,cACjB,OAAO,WAAW,eAAe,OAAO,MAAM;AAAA,IACjD;AAEA,QAAI,QAAQ,OAAO,UAAU,cAAc,YAAY;AACtD,YAAM,IAAI,uCAAmB,KAAK,QAAQ,GAAG,2BAA2B;AAAA,QACvE,iBAAa,4CAA4B,QAAQ,MAAM;AAAA,QACvD;AAAA,MACD,CAAC;AAAA,IACF;AACA,QAAI,mBAAmB,CAAC,KAAK,eAAe,GAAG;AAC9C,YAAM,QACL,gBAAgB,WAAW,aACxB,gBAAgB,SAChB,gBAAgB,MAAM;AAC1B,YAAM,IAAI,uCAAmB,KAAK,QAAQ,GAAG,OAAO;AAAA,QACnD,aAAa,OAAO,eAAe,OAAO;AAAA,QAC1C;AAAA,MACD,CAAC;AAAA,IACF;AACA,WAAO,QAAQ,OAAO,IAAI,6CAA8B;AAAA,EACzD;AAEA,QAAM,kBAAmC;AAAA,IACxC,WAAW,CAAC;AAAA,IACZ,OAAO,CAAC;AAAA,EACT;AAEA,MAAI,WAAW,KAAK,OAAO;AAC1B,UAAM,EAAE,SAAS,IAAI,WAAW,IAAI;AACpC,oBAAgB,UAAU,KAAK;AAAA,MAC9B,MAAM;AAAA,MACN,WAAO,6BAAiB;AAAA,QACvB;AAAA,MACD,CAAC;AAAA,IACF,CAAC;AAAA,EACF;AAEA,MAAI,WAAW,aAAa,OAAO;AAClC,oBAAgB,UAAU,KAAK;AAAA,MAC9B,MAAM;AAAA,MACN,WAAO,qCAAyB;AAAA,QAC/B,aAAa,WAAW,YAAY;AAAA,MACrC,CAAC;AAAA,IACF,CAAC;AAAA,EACF;AAEA,MAAI,WAAW,YAAY,OAAO;AACjC,UAAM,EAAE,eAAe,IAAI,WAAW,WAAW;AACjD,oBAAgB,UAAU,KAAK;AAAA,MAC9B,MAAM;AAAA,MACN,WAAO,2CAAwB,EAAE,WAAW,eAAe,CAAC;AAAA,IAC7D,CAAC;AAAA,EACF;AAEA,MAAI,WAAW,MAAM,OAAO;AAC3B,UAAM,EAAE,aAAa,gBAAgB,eAAe,gBAAgB,IAAI,WAAW,KAAK;AACxF,oBAAgB,UAAU,KAAK;AAAA,MAC9B,MAAM;AAAA,MACN,WAAO,+BAAkB;AAAA,QACxB,iBAAa,4BAAa,WAAW;AAAA,QACrC;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAC;AAAA,IACF,CAAC;AAAA,EACF;AAEA,MAAI,cAAc,YAAY;AAC7B,QAAI,CAAC,OAAO;AACX,YAAM,IAAI,uCAAmB,KAAK,QAAQ,GAAG,+CAA+C;AAAA,IAC7F;AAEA,QAAI,WAAW,UAAU;AACxB,sBAAgB,MAAM,KAAK;AAAA,QAC1B,MAAM;AAAA,QACN,WAAO,uCAAsB,EAAE,cAAU,4BAAa,WAAW,QAAQ,EAAE,CAAC;AAAA,MAC7E,CAAC;AAAA,IACF;AAEA,QAAI,WAAW,WAAW,OAAO;AAChC,YAAM,EAAE,QAAQ,UAAU,IAAI,WAAW,UAAU;AACnD,sBAAgB,MAAM,KAAK;AAAA,QAC1B,MAAM;AAAA,QACN,WAAO,yCAAuB;AAAA,UAC7B;AAAA,UACA,QAAQ,QAAQ,KAAK,KAAK;AAAA,UAC1B;AAAA,UACA;AAAA,QACD,CAAC;AAAA,MACF,CAAC;AAAA,IACF;AAEA,QAAI,WAAW,MAAM,OAAO;AAC3B,YAAM,EAAE,QAAQ,UAAU,IAAI,WAAW,KAAK;AAC9C,sBAAgB,MAAM,KAAK;AAAA,QAC1B,MAAM;AAAA,QACN,WAAO,+BAAkB;AAAA,UACxB;AAAA,UACA,QAAQ,QAAQ,KAAK,KAAK;AAAA,UAC1B;AAAA,UACA;AAAA,QACD,CAAC;AAAA,MACF,CAAC;AAAA,IACF;AAEA,QAAI,WAAW,kBAAkB,OAAO;AACvC,YAAM,EAAE,QAAQ,UAAU,IAAI,WAAW,iBAAiB;AAC1D,sBAAgB,MAAM,KAAK;AAAA,QAC1B,MAAM;AAAA,QACN,WAAO,uDAA8B;AAAA,UACpC;AAAA,UACA,QAAQ,QAAQ,KAAK,KAAK;AAAA,UAC1B;AAAA,UACA;AAAA,QACD,CAAC;AAAA,MACF,CAAC;AAAA,IACF;AAEA,QAAI,WAAW,QAAQ,WAAW;AACjC,iBAAW,mBAAmB,WAAW,OAAO,WAAW;AAC1D,cAAM,EAAE,QAAQ,WAAW,KAAK,IAAI;AACpC,wBAAgB,MAAM,KAAK;AAAA,UAC1B;AAAA,UACA,WAAO,+BAAiB,MAAM;AAAA,YAC7B;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACD,CAAC;AAAA,QACF,CAAC;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAEA,QAAM,mBAAmB,UAAM,gCAAmB;AAAA,IACjD;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,kBAAkB,cAAc;AAAA,EACjC,CAAC;AAED,MAAI,iBAAiB,OAAO,SAAS,GAAG;AACvC,iBAAa,KAAK,MAAM,cAAc,oBAAoB,gBAAgB,CAAC;AAC3E,WAAO;AAAA,MACN,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR,QAAQ;AAAA,QACP,QAAQ;AAAA,MACT;AAAA,IACD;AAAA,EACD,OAAO;AACN,iBAAa,KAAK;AAAA,MACjB;AAAA,MACA,iBAAiB,OAAO,IAAI,6CAA8B;AAAA,IAC3D;AAAA,EACD;AAEA,QAAM,wBAAoB;AAAA,IACzB;AAAA,IACA,iBAAiB,OAAO,IAAI,CAAC,WAAW,OAAO,KAAK;AAAA,EACrD;AAEA,QAAM,eAAe,UAAM,gCAAmB;AAAA,IAC7C,WAAW;AAAA,IACX;AAAA,IACA,OAAO;AAAA,IACP,kBAAkB,cAAc;AAAA,EACjC,CAAC;AACD,MAAI,aAAa,OAAO,SAAS,GAAG;AACnC,iBAAa,KAAK,MAAM,cAAc,oBAAoB,YAAY,CAAC;AACvE,WAAO;AAAA,MACN,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR,QAAQ;AAAA,QACP,QAAQ;AAAA,MACT;AAAA,IACD;AAAA,EACD,OAAO;AACN,iBAAa,KAAK,MAAM,cAAc,aAAa,OAAO,IAAI,6CAA8B,CAAC;AAAA,EAC9F;AAEA,SAAO;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACP,QAAQ;AAAA,IACT;AAAA,IACA,QAAQ;AAAA,EACT;AACD;","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"]}