{"record":{"id":"fc72ef7de47682a2","repo":"mastra-ai/mastra","slug":"vectors-must-not-be-null-or-undefined","errorCode":null,"errorMessage":"Vectors must not be null or undefined","messagePattern":"Vectors must not be null or undefined","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/rag/src/graph-rag/index.ts","lineNumber":195,"sourceCode":"    }\n    node.content = newContent;\n  }\n\n  // Get neighbors of a node\n  private getNeighbors(nodeId: string, edgeType?: string): { id: string; weight: number }[] {\n    return this.edges\n      .filter(edge => edge.source === nodeId && (!edgeType || edge.type === edgeType))\n      .map(edge => ({\n        id: edge.target,\n        weight: edge.weight,\n      }))\n      .filter(node => node !== undefined);\n  }\n\n  // Calculate cosine similarity between two vectors\n  private cosineSimilarity(vec1: number[], vec2: number[]): number {\n    if (!vec1 || !vec2) {\n      throw new Error('Vectors must not be null or undefined');\n    }\n    const vectorLength = vec1.length;\n\n    if (vectorLength !== vec2.length) {\n      throw new Error(`Vector dimensions must match: vec1(${vec1.length}) !== vec2(${vec2.length})`);\n    }\n\n    let dotProduct = 0;\n    let normVec1 = 0;\n    let normVec2 = 0;\n\n    for (let i = 0; i < vectorLength; i++) {\n      const a = vec1[i]!; // Non-null assertion operator\n      const b = vec2[i]!;\n\n      dotProduct += a * b;\n      normVec1 += a * a;\n      normVec2 += b * b;","sourceCodeStart":177,"sourceCodeEnd":213,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/rag/src/graph-rag/index.ts#L177-L213","documentation":"cosineSimilarity(vec1, vec2) throws when either vector is null or undefined. It is private but reachable because query() passes node.embedding! into it, and createGraph() passes embeddings[i]?.vector into it, so missing embeddings surface here at runtime despite TypeScript typing.","triggerScenarios":"query({query, ...}) on a graph containing a node added without an embedding, or a node whose embedding was set to null/undefined; createGraph() where the embeddings array contains an entry without a vector property.","commonSituations":"Adding nodes via a code path that skips addNode's embedding check, then querying; embedding generation failing silently for some chunks leaving {vector: undefined}; mutating snapshot nodes and dropping the embedding field.","solutions":["Ensure every node added to the graph has a valid embedding array (addNode enforces this — route all inserts through it).","When building embeddings, assert each GraphEmbedding has a non-empty vector before createGraph().","Re-embed any nodes whose embeddings are missing instead of adding them bare.","Guard the query path by filtering out nodes without embeddings before query(), or validate snapshot.nodes all carry embeddings."],"exampleFix":"// before\nawait graph.createGraph(chunks, embeddings);\n// after\nif (embeddings.some(e => !Array.isArray(e.vector) || e.vector.length === 0)) {\n  throw new Error('Every embedding must have a non-empty vector');\n}\nawait graph.createGraph(chunks, embeddings);","handlingStrategy":"validation","validationCode":"const hasVectors = embeddings.every(e => Array.isArray(e.vector) && e.vector.length > 0);\nif (!hasVectors) throw new Error('All embeddings must contain a vector array before createGraph');","typeGuard":"const hasEmbedding = (n: GraphNode): n is GraphNode & { embedding: number[] } =>\n  Array.isArray(n.embedding) && n.embedding.length > 0;","tryCatchPattern":"try {\n  const results = graph.query({ query });\n} catch (e) {\n  if ((e as Error).message === 'Vectors must not be null or undefined') {\n    // a graph node is missing its embedding; re-index or re-embed that node\n  } else throw e;\n}","preventionTips":["Always add nodes through addNode(), which rejects missing embeddings","Assert each embedding object has a non-empty vector after the embed step","Treat embed failures as fatal for the affected chunk rather than adding a bare node","Validate snapshot.nodes all carry embeddings before deserialize"],"tags":["rag","null-check","embedding","argument-error"],"backgroundTag":"null-or-undefined-value","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}