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

  1. GET /api/setup-complete directly and inspect the status and JSON body.
  2. Confirm the backend can read/write its settings store (disk perms on the DB file for SQLite).
  3. Retry the call after the server reports online via /api/ping.
  4. 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

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


AI-assisted analysis of Mintplex-Labs/anything-llm@526360e320 (2026-08-13). Data as JSON: /api/errors/2778f0bf2ee3c9da. Report an issue: GitHub.