Mintplex-Labs/anything-llm · error · Error

The native whisper model failed to download from the…

Error message

The native whisper model failed to download from the huggingface.co CDN. Your internet connection may be unstable or blocked by Huggingface.co - you will need to download the model manually and place it in the storage/models folder to use local Whisper transcription.

What it means

QDrant.namespace(client, namespace) is the internal helper that fetches collection stats; it throws when the namespace argument is falsy because there is no meaningful stat for an unnamed collection. In practice this fires when an internal caller (e.g., 'namespace-stats' in server/utils/vectorDbProviders/qdrant/index.js) or custom code passes null/undefined/'' instead of a workspace slug.

Solutions

  1. Pass a non-empty namespace string (the workspace slug) whenever calling namespace().
  2. Prefer the public surface ('namespace-stats', hasNamespace) which validates input, over the internal two-argument helper.
  3. Audit custom call sites for destructuring { namespace = null } followed by an unguarded this.namespace(client, namespace).
  4. Add a tiny wrapper that validates and gives a clearer error before delegating.

Example fix

// before
const stats = await qdrant.namespace(client, undefined);

// after
if (typeof namespace !== 'string' || namespace.length === 0) {
  throw new Error('namespace must be a non-empty workspace slug');
}
const stats = await qdrant.namespace(client, namespace);
Defensive patterns

Strategy: validation

Validate before calling

function requireNamespace(namespace) {
  if (typeof namespace !== 'string' || namespace.trim().length === 0) {
    throw new Error('namespace must be a non-empty workspace slug');
  }
  return namespace;
}

const stats = await qdrant.namespace(client, requireNamespace(namespace));

Type guard

function isNonEmptyNamespace(ns) {
  return typeof ns === 'string' && ns.trim().length > 0;
}

Try / catch

try {
  const stats = await qdrant.namespace(client, namespace);
} catch (e) {
  if (/No namespace value provided/.test(e.message)) {
    // caller passed null/'' — a programming bug: fix at the call site, don't retry
    throw new TypeError(`namespace() called with: ${String(namespace)}`);
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling vectorDB.namespace(client, null) directly; 'namespace-stats' invoked without a namespace already fails earlier with 'namespace required', so reaching this throw means a direct/internal call site skipped validation; passing an empty string after destructuring a default of null.

Common situations: Plugin or script code calling provider internals rather than the public API; refactor that dropped the namespace guard at one call site; default parameter null leaking through when reqBody is empty.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


AI-assisted analysis of Mintplex-Labs/anything-llm@3aec848f28 (2026-08-18). Data as JSON: /api/errors/5b66ae02b740499a. Report an issue: GitHub.

Appendix: source

Thrown at collector/utils/WhisperProviders/localWhisper.js:158

                    data.file
                  } ${~~data?.progress}%`
                );
              },
            }
          : {}),
      });
    } catch (error) {
      let errMsg = error.message;
      if (errMsg.includes("Could not locate file")) {
        errMsg =
          "The native whisper model failed to download from the huggingface.co CDN. Your internet connection may be unstable or blocked by Huggingface.co - you will need to download the model manually and place it in the storage/models folder to use local Whisper transcription.";
      }

      this.#log(
        `Failed to load the native whisper model: ${errMsg}`,
        error.stack
      );
      throw new Error(errMsg);
    }
  }

  async processFile(fullFilePath, filename) {
    try {
      const audioDataPromise = new Promise((resolve) =>
        this.#convertToWavAudioData(fullFilePath).then((audioData) =>
          resolve(audioData)
        )
      );
      const [audioData, transcriber] = await Promise.all([
        audioDataPromise,
        this.client(),
      ]);

      if (!audioData) {
        this.#log(`Failed to parse content from ${filename}.`);
        return {

View on GitHub (pinned to 3aec848f28)