{"record":{"id":"2778f0bf2ee3c9da","repo":"Mintplex-Labs/anything-llm","slug":"could-not-find-setup-information","errorCode":null,"errorMessage":"Could not find setup information.","messagePattern":"Could not find setup information\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"warning","filePath":"frontend/src/models/system.js","lineNumber":64,"sourceCode":"      .then((res) => res.onboardingComplete)\n      .catch(() => false);\n  },\n  /**\n   * Marks the onboarding as complete.\n   * @returns {Promise<boolean>}\n   */\n  markOnboardingComplete: async function () {\n    return await fetch(`${API_BASE}/onboarding`, {\n      method: \"POST\",\n      headers: baseHeaders(),\n    })\n      .then((res) => res.ok)\n      .catch(() => false);\n  },\n  keys: async function () {\n    return await fetch(`${API_BASE}/setup-complete`)\n      .then((res) => {\n        if (!res.ok) throw new Error(\"Could not find setup information.\");\n        return res.json();\n      })\n      .then((res) => res.results)\n      .catch(() => null);\n  },\n  /**\n   * Without a folderName, returns the folder shells for the picker.\n   * With one, returns that folder's documents.\n   * @param {string|null} folderName\n   * @param {number} offset\n   * @param {number|\"all\"} limit - \"all\" opts out of paging entirely; the\n   * server otherwise clamps this to its own maximum page size.\n   */\n  localFiles: async function (folderName = null, offset = 0, limit = 100) {\n    const params = new URLSearchParams();\n    if (folderName) {\n      params.set(\"folder\", folderName);\n      params.set(\"offset\", String(offset));","sourceCodeStart":46,"sourceCodeEnd":82,"githubUrl":"https://github.com/Mintplex-Labs/anything-llm/blob/526360e320da9d1b36074be5ed64fe76e5bbfbbd/frontend/src/models/system.js#L46-L82","documentation":"Thrown by System.keys on a non-2xx GET to /api/setup-complete. The function returns res.results describing which system keys (LLM, vector DB, embedder, etc.) are configured. The .catch() returns null, so a transient failure looks identical to an unconfigured instance.","triggerScenarios":"Calling keys() during initial setup when the server has not finished initializing the settings table, or when the route returns 500 because a settings migration is mid-flight.","commonSituations":"Right after a version upgrade that adds a new settings key; when the database file is locked by another process; on a fresh deploy where setup-complete is queried before any provider is chosen.","solutions":["GET /api/setup-complete directly and inspect the status and JSON body.","Confirm the backend can read/write its settings store (disk perms on the DB file for SQLite).","Retry the call after the server reports online via /api/ping.","Distinguish null-as-error from null-as-unset by also checking the HTTP status rather than only the resolved value."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"if (!(await System.ping())) { /* backend not ready, skip keys() */ }","typeGuard":"/** @param {any} r @returns {r is Object} */\nfunction isKeysResult(r) { return r != null && typeof r === \"object\"; }","tryCatchPattern":"const keys = await System.keys();\nif (!isKeysResult(keys)) { /* show 'setup unavailable', retry later */ }","preventionTips":["Distinguish null-as-error from null-as-unset by checking status separately when possible.","Retry after the server reports online.","Do not block the whole UI on this call."],"tags":["network","setup","settings"],"backgroundTag":null,"analyzedSha":"526360e320da9d1b36074be5ed64fe76e5bbfbbd","analyzedAt":"2026-08-13T01:45:47.170Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}