import { AGENT_NODE_NAME, AI_TOOL_CALCULATOR_NODE_NAME, AI_LANGUAGE_MODEL_OPENAI_CHAT_MODEL_NODE_NAME, MANUAL_CHAT_TRIGGER_NODE_NAME, } from '../../../config/constants'; import { test, expect } from '../../../fixtures/base'; import type { n8nPage } from '../../../pages/n8nPage'; // Helper functions for common operations async function addOpenAILanguageModelWithCredentials( n8n: n8nPage, parentNode: string, options: { exactMatch?: boolean; closeNDV?: boolean } = { exactMatch: true, closeNDV: false }, ) { await n8n.canvas.addSupplementalNodeToParent( AI_LANGUAGE_MODEL_OPENAI_CHAT_MODEL_NODE_NAME, 'ai_languageModel', parentNode, options, ); await n8n.credentialsComposer.createFromNdv({ apiKey: 'abcd', }); await n8n.ndv.clickBackToCanvasButton(); } async function waitForWorkflowSuccess(n8n: n8nPage, timeout = 3000) { await n8n.notifications.waitForNotificationAndClose('Workflow executed successfully', { timeout, }); } async function executeChatAndWaitForResponse(n8n: n8nPage, message: string) { await n8n.canvas.logsPanel.sendManualChatMessage(message); await waitForWorkflowSuccess(n8n); } async function setupBasicAgentWorkflow(n8n: n8nPage, additionalNodes: string[] = []) { await n8n.canvas.addNode(AGENT_NODE_NAME, { closeNDV: true }); // Add additional nodes if specified for (const nodeName of additionalNodes) { await n8n.canvas.addSupplementalNodeToParent(nodeName, 'ai_tool', AGENT_NODE_NAME, { closeNDV: true, }); } // Always add OpenAI Language Model await addOpenAILanguageModelWithCredentials(n8n, AGENT_NODE_NAME); } test.use({ capability: 'proxy' }); test.describe( 'Langchain Integration @capability:proxy', { annotation: [{ type: 'owner', description: 'AI' }], }, () => { test.beforeEach(async ({ n8n, services }) => { await services.proxy.clearAllExpectations(); await services.proxy.loadExpectations('langchain'); await n8n.canvas.openNewWorkflow(); }); // @AI team to look at this test.describe('Tool Usage Notifications', () => { test.fixme(); test('should show tool info notice if no existing tools were used during execution', async ({ n8n, }) => { await setupBasicAgentWorkflow(n8n, [AI_TOOL_CALCULATOR_NODE_NAME]); await n8n.canvas.openNode(AGENT_NODE_NAME); const inputMessage = 'Hello!'; await n8n.ndv.execute(); await executeChatAndWaitForResponse(n8n, inputMessage); await n8n.canvas.closeManualChatModal(); await n8n.canvas.openNode(AGENT_NODE_NAME); await expect(n8n.ndv.getRunDataInfoCallout()).toBeVisible(); }); test('should not show tool info notice if tools were used during execution', async ({ n8n, }) => { await n8n.canvas.addNode(MANUAL_CHAT_TRIGGER_NODE_NAME, { closeNDV: true }); await n8n.canvas.addNode(AGENT_NODE_NAME, { closeNDV: false }); await expect(n8n.ndv.getRunDataInfoCallout()).toBeHidden(); await n8n.ndv.clickBackToCanvasButton(); await addOpenAILanguageModelWithCredentials(n8n, AGENT_NODE_NAME); await n8n.canvas.addSupplementalNodeToParent( AI_TOOL_CALCULATOR_NODE_NAME, 'ai_tool', AGENT_NODE_NAME, { closeNDV: true }, ); const inputMessage = 'What is 1000 * 10?'; await n8n.canvas.clickManualChatButton(); await executeChatAndWaitForResponse(n8n, inputMessage); await n8n.canvas.closeManualChatModal(); await n8n.canvas.openNode(AGENT_NODE_NAME); await expect(n8n.ndv.getRunDataInfoCallout()).toBeHidden(); }); }); }, );