danny-avila/LibreChat · error

Error uploading file: ${result.message}

Error message

Error uploading file: ${result.message}

What it means

Thrown by the single-file upload path (Code/crud.js) when the code server's POST /upload returns a 2xx response but result.message is not the literal 'success'. The server is reachable but rejected the upload at the application layer.

Source

Thrown at api/server/services/Files/Code/crud.js:178

        ...form.getHeaders(),
        'Content-Type': 'multipart/form-data',
        'User-Agent': 'LibreChat/1.0',
        'User-Id': req.user.id,
        ...authHeaders,
      },
      httpAgent: codeServerHttpAgent,
      httpsAgent: codeServerHttpsAgent,
      timeout: 120000,
      maxContentLength: MAX_FILE_SIZE,
      maxBodyLength: MAX_FILE_SIZE,
    };

    const response = await axios.post(`${baseURL}/upload`, form, options);

    /** @type {{ message: string; storage_session_id: string; files: Array<{ fileId: string; filename: string }> }} */
    const result = response.data;
    if (result.message !== 'success') {
      throw new Error(`Error uploading file: ${result.message}`);
    }

    return {
      storage_session_id: result.storage_session_id,
      file_id: result.files[0].fileId,
    };
  } catch (error) {
    throw new Error(
      logAxiosError({
        message: `Error uploading code environment file: ${error.message}`,
        error,
      }),
    );
  }
}

/**
 * Uploads multiple files to the code execution environment in a single request.

View on GitHub (pinned to 5ff282f900)

Solutions

  1. Inspect result.message in the response — it carries the code server's own rejection reason.
  2. Confirm the multipart form (FormData) is well-formed and includes the expected fields.
  3. Check the code server's accepted MIME types and per-user quotas.
  4. Verify codeapi version matches the contract that returns `{ message: 'success' }`.
Defensive patterns

Strategy: try-catch

Validate before calling

// Validate file kind/size before uploading
const accepted = ['image/png', 'image/jpeg', 'application/pdf', 'text/plain'];
if (!accepted.includes(mimeType)) throw new Error(`Unsupported type: ${mimeType}`);

Try / catch

try {
  await uploadCodeEnvFile(params);
} catch (err) {
  const m = /^Error uploading file: (.+)$/.exec(err.message);
  if (m) {
    return res.status(422).json({ message: `Code server rejected upload: ${m[1]}` });
  }
  throw err;
}

Prevention

When it happens

Trigger: codeapi responds 200 with `{ message: 'invalid_file', ... }` or any non-'success' message — e.g. unsupported MIME type, filename collision policy, quota exceeded, or a malformed multipart form.

Common situations: Uploaded a file type the code server rejects; filename contains characters the server forbids; per-user storage quota hit; codeapi version that returns a different success sentinel.

Related errors


AI-assisted analysis of danny-avila/LibreChat@5ff282f900 (2026-08-12). Data as JSON: /api/errors/7c6fb3dc774ba7f1. Report an issue: GitHub.