{"record":{"id":"333e1d870af6adbf","repo":"FlowiseAI/Flowise","slug":"there-must-be-a-llm-model-connected-to-llm-filter","errorCode":null,"errorMessage":"There must be a LLM model connected to LLM Filter Retriever","messagePattern":"There must be a LLM model connected to LLM Filter Retriever","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/components/nodes/retrievers/LLMFilterRetriever/LLMFilterCompressionRetriever.ts","lineNumber":78,"sourceCode":"                description: 'Array of document objects containing metadata and pageContent',\n                baseClasses: ['Document', 'json']\n            },\n            {\n                label: 'Text',\n                name: 'text',\n                description: 'Concatenated string from pageContent of documents',\n                baseClasses: ['string', 'json']\n            }\n        ]\n    }\n\n    async init(nodeData: INodeData, input: string): Promise<any> {\n        const baseRetriever = nodeData.inputs?.baseRetriever as BaseRetriever\n        const model = nodeData.inputs?.model as BaseLanguageModel\n        const query = nodeData.inputs?.query as string\n        const output = nodeData.outputs?.output as string\n\n        if (!model) throw new Error('There must be a LLM model connected to LLM Filter Retriever')\n\n        const retriever = new ContextualCompressionRetriever({\n            baseCompressor: LLMChainExtractor.fromLLM(model),\n            baseRetriever: baseRetriever\n        })\n\n        if (output === 'retriever') return retriever\n        else if (output === 'document') return await retriever._getRelevantDocuments(query ? query : input)\n        else if (output === 'text') {\n            let finaltext = ''\n\n            const docs = await retriever._getRelevantDocuments(query ? query : input)\n\n            for (const doc of docs) finaltext += `${doc.pageContent}\\n`\n\n            return handleEscapeCharacters(finaltext, false)\n        }\n","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/FlowiseAI/Flowise/blob/abe4a8601a058047b350c260676826e21dd14101/packages/components/nodes/retrievers/LLMFilterRetriever/LLMFilterCompressionRetriever.ts#L60-L96","documentation":"Thrown by LLMFilterCompressionRetriever.init when nodeData.inputs.model is falsy. LLMChainExtractor.fromLLM requires a language model to decide which documents to keep; with no model wired the node cannot build the compressor and aborts.","triggerScenarios":"LLM Filter Retriever node has no model input connected; the connected model node errored on init and produced undefined; the wrong input type is wired (e.g. an embedding model where a chat model is expected).","commonSituations":"Forgotten edge in the chatflow graph; model node deleted after wiring; mismatch between the expected BaseLanguageModel input and what is connected.","solutions":["Connect a Chat LLM or LLM node to the LLM Filter Retriever's model input.","Confirm the connected model node initializes successfully on its own.","Ensure the model output type is BaseLanguageModel (not Embeddings)."],"exampleFix":"// before: model input unconnected\n// after: wire a ChatOpenAI / ChatAnthropic (etc.) node into the model input","handlingStrategy":"type-guard","validationCode":"import { BaseLanguageModel } from '@langchain/core/language_models/base'\nfunction ensureModel(model: unknown): BaseLanguageModel {\n  if (!model) throw new Error('Connect an LLM to the LLM Filter Retriever model input.')\n  if (typeof (model as any)._generate !== 'function' && typeof (model as any).invoke !== 'function') {\n    throw new Error('Connected node is not a BaseLanguageModel.')\n  }\n  return model as BaseLanguageModel\n}","typeGuard":"function isBaseLanguageModel(m: unknown): m is BaseLanguageModel {\n  return !!m && typeof m === 'object' && ('_generate' in m || 'invoke' in m) && '_modelType' in (m as any)\n}","tryCatchPattern":"try {\n  await retriever.init(nodeData, input)\n} catch (e) {\n  if (e instanceof Error && /LLM model connected/.test(e.message)) {\n    // highlight the model input port\n  }\n  throw e\n}","preventionTips":["Validate the chatflow graph: every LLM Filter Retriever has an incoming model edge.","Use a type guard on nodeData.inputs.model before init.","Test that the connected model node initializes in isolation."],"tags":["retriever","llm-filter","config","required-connection","model"],"backgroundTag":null,"analyzedSha":"abe4a8601a058047b350c260676826e21dd14101","analyzedAt":"2026-08-12T16:04:40.823Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}