{"record":{"id":"4853107325008fd5","repo":"FlowiseAI/Flowise","slug":"app-name-is-required-please-select-an-app","errorCode":null,"errorMessage":"App name is required. Please select an app.","messagePattern":"App name is required\\. Please select an app\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/components/nodes/tools/Composio/Composio.ts","lineNumber":257,"sourceCode":"            }\n            throw new Error('API Key Required')\n        }\n\n        const _actions = nodeData.inputs?.actions\n        let actions = []\n        if (_actions) {\n            try {\n                actions = typeof _actions === 'string' ? JSON.parse(_actions) : _actions\n            } catch (error) {\n                console.error('Error parsing actions:', error)\n            }\n        }\n\n        const toolset = new LangchainToolSet({ apiKey: composioApiKey })\n        const appName = nodeData.inputs?.appName as string\n\n        if (!appName) {\n            throw new Error('App name is required. Please select an app.')\n        }\n\n        const appInfo = await toolset.client.apps.get({ appKey: appName.toLowerCase() })\n        const requiresAuth = (appInfo as any)?.no_auth !== true\n\n        if (!requiresAuth) {\n            const tools = await toolset.getTools({ actions })\n            return tools\n        }\n\n        const selectedConnectionId = nodeData.inputs?.connectedAccountId as string\n\n        if (!selectedConnectionId) {\n            throw new Error(`Please select a connected account for ${appName}`)\n        }\n\n        const activeConnection = await toolset.client.connectedAccounts.get({ connectedAccountId: selectedConnectionId })\n","sourceCodeStart":239,"sourceCodeEnd":275,"githubUrl":"https://github.com/FlowiseAI/Flowise/blob/abe4a8601a058047b350c260676826e21dd14101/packages/components/nodes/tools/Composio/Composio.ts#L239-L275","documentation":"Thrown in Composio_Tools.init when appName is falsy. The tool calls toolset.client.apps.get({ appKey: appName.toLowerCase() }) right after, so appName is both the selection and the lookup key — without it the Composio client cannot resolve which integration to load tools for.","triggerScenarios":"The user did not pick an app from the dropdown (which only populates after a valid API key is supplied, see error 358); appName was cleared when the API key was missing (the init resets appName to undefined); flow JSON edited to remove appName.","commonSituations":"Adding a Composio node without first configuring the API key, so the app dropdown never loaded; switching workspaces where the previously selected app is unavailable.","solutions":["Ensure a valid Composio API key is configured first so the app dropdown populates.","Select an explicit app (e.g. 'github', 'slack') from the dropdown.","If setting appName programmatically, pass the lower-cased appKey exactly as Composio expects."],"exampleFix":"// before\nconst appName = nodeData.inputs?.appName as string\nif (!appName) {\n  throw new Error('App name is required. Please select an app.')\n}\n// after\nconst appName = (nodeData.inputs?.appName as string)?.trim()\nif (!appName) {\n  throw new Error('App name is required. Please select an app from the dropdown (it populates after a valid Composio API key is set).')\n}","handlingStrategy":"validation","validationCode":"function assertComposioApp(appName: string | undefined): asserts appName is string {\n  if (!appName || !appName.trim()) {\n    throw new Error('App name is required. Select an app from the dropdown (it populates after a valid Composio API key is set).')\n  }\n}","typeGuard":"function isComposioAppKey(v: unknown): v is string {\n  return typeof v === 'string' && /^[a-z0-9-_]+$/i.test(v) && v.length > 0\n}","tryCatchPattern":null,"preventionTips":["Configure the Composio API key first so the app dropdown populates.","Select the app explicitly rather than relying on a default.","Pass the lower-cased appKey exactly as Composio expects when setting programmatically."],"tags":["composio","config","validation","dropdown"],"backgroundTag":null,"analyzedSha":"abe4a8601a058047b350c260676826e21dd14101","analyzedAt":"2026-08-12T16:04:40.823Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}