Mintplex-Labs/anything-llm · warning · Error
Could not find setup information.
Error message
Could not find setup information.
What it means
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.
Source
Thrown at frontend/src/models/system.js:64
.then((res) => res.onboardingComplete)
.catch(() => false);
},
/**
* Marks the onboarding as complete.
* @returns {Promise<boolean>}
*/
markOnboardingComplete: async function () {
return await fetch(`${API_BASE}/onboarding`, {
method: "POST",
headers: baseHeaders(),
})
.then((res) => res.ok)
.catch(() => false);
},
keys: async function () {
return await fetch(`${API_BASE}/setup-complete`)
.then((res) => {
if (!res.ok) throw new Error("Could not find setup information.");
return res.json();
})
.then((res) => res.results)
.catch(() => null);
},
/**
* Without a folderName, returns the folder shells for the picker.
* With one, returns that folder's documents.
* @param {string|null} folderName
* @param {number} offset
* @param {number|"all"} limit - "all" opts out of paging entirely; the
* server otherwise clamps this to its own maximum page size.
*/
localFiles: async function (folderName = null, offset = 0, limit = 100) {
const params = new URLSearchParams();
if (folderName) {
params.set("folder", folderName);
params.set("offset", String(offset));View on GitHub (pinned to 526360e320)
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.
Defensive patterns
Strategy: fallback
Validate before calling
if (!(await System.ping())) { /* backend not ready, skip keys() */ } Type guard
/** @param {any} r @returns {r is Object} */
function isKeysResult(r) { return r != null && typeof r === "object"; } Try / catch
const keys = await System.keys();
if (!isKeysResult(keys)) { /* show 'setup unavailable', retry later */ } Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- The native whisper model failed to download from the hugging
- ${response.error || "Failed to fetch settings"}
- Failed to sync link content. ${reason}
- Failed to sync YouTube video transcript. ${reason}
- Failed to sync Confluence page content. ${reason}
AI-assisted analysis of Mintplex-Labs/anything-llm@526360e320 (2026-08-13).
Data as JSON: /api/errors/2778f0bf2ee3c9da.
Report an issue: GitHub.