{"record":{"id":"724044bc5fdd13a7","repo":"Budibase/budibase","slug":"payload-error","errorCode":null,"errorMessage":"${payload.error}","messagePattern":"\\$\\{payload\\.error\\}","errorType":"http","errorClass":"HTTPError","httpStatus":500,"severity":"error","filePath":"packages/server/src/sdk/workspace/ai/knowledgeBase/geminiFileStore.ts","lineNumber":248,"sourceCode":"\n  const payload = (await response.json()) as RagIngestResponse\n  if (payload.status === \"failed\" && payload.error) {\n    console.error(\"Gemini ingest failed\", { error: payload.error })\n    if (payload.error.includes(\"fileSearchStores\")) {\n      if (payload.error.includes(\"403\")) {\n        throw new HTTPError(\n          \"Gemini file store is inaccessible (403 Forbidden). Use 'Reset store' to recreate it.\",\n          403\n        )\n      }\n      if (payload.error.includes(\"404\")) {\n        throw new HTTPError(\n          \"Gemini file store was not found (404). Use 'Reset store' to recreate it.\",\n          404\n        )\n      }\n    }\n    throw new HTTPError(payload.error, 500)\n  }\n  if (!payload.file_id) {\n    throw new HTTPError(\"Gemini ingest did not return file_id\", 500)\n  }\n  return {\n    fileId: payload.file_id,\n  }\n}\n\nexport async function searchGeminiFileStore({\n  vectorStoreId,\n  query,\n}: {\n  vectorStoreId: string\n  query: string\n}): Promise<RagSearchResultItem[]> {\n  const geminiApiKey = getGeminiApiKey()\n  const sessionId = getLiteLLMSessionId()","sourceCodeStart":230,"sourceCodeEnd":266,"githubUrl":"https://github.com/Budibase/budibase/blob/a81a902e9a8fe55b467d106765f6638f12e35c49/packages/server/src/sdk/workspace/ai/knowledgeBase/geminiFileStore.ts#L230-L266","documentation":"When the LiteLLM rag/ingest response has status \"failed\" with an error that is not the recognized 403/404 fileSearchStores patterns, ingestGeminiFile throws HTTPError 500 with the raw upstream error string. This is a catch-all for Gemini ingest failures not otherwise classified.","triggerScenarios":"Upstream ingest reports failed with any error other than the fileSearchStores/403/404 patterns — e.g. unsupported file type, file too large, content processing error, quota/permission errors phrased differently.","commonSituations":"Ingesting a corrupt or unsupported document; Gemini file size limits exceeded; transient Gemini processing failure; LiteLLM error format changed so the 403/404 classifiers no longer match.","solutions":["Read payload.error in the thrown message/logs for the underlying Gemini cause","Retry the upload for transient errors","Check file format/size against Gemini File Search limits and re-upload a supported file","If it is a 403/404 in disguise (message format changed), reset the store"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// validate inputs before ingest\nif (!buffer?.byteLength) throw new Error(\"Empty file\")\nif (mimetype && !SUPPORTED_GEMINI_TYPES.has(mimetype)) throw new Error(`Unsupported type: ${mimetype}`)","typeGuard":null,"tryCatchPattern":"try {\n  await ingestGeminiFile({ vectorStoreId, ... })\n} catch (e) {\n  if (e instanceof HTTPError && e.status === 500) {\n    console.error(\"Gemini ingest error:\", e.message) // raw upstream error\n    await retryWithBackoff(() => ingestGeminiFile({ ... }), 3)\n  }\n}","preventionTips":["Keep files within Gemini File Search size/type limits","Retry transient failures with backoff","Log payload.error server-side for diagnosis"],"tags":["gemini","ingest","file-search","server"],"backgroundTag":"upstream-ingest-failure","analyzedSha":"a81a902e9a8fe55b467d106765f6638f12e35c49","analyzedAt":"2026-08-29T01:03:10.972Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}