feat: implement portable static file server and backend process manager in serve.cjs
This commit is contained in:
1 parent
bbe4fe5f09
commit
e5672cd826
1 file changed
+13
-1
+13
-1
@@ -604,7 +604,10 @@ function getBackendOptions() {
|
||||
const rocmAvailable = rocmInstalled && hasAmdGpu() && backendAccepts(BACKEND_PATHS.linuxRocm, "rocm");
|
||||
const cpuInstalled = osPlatform === "linux" && fs.existsSync(BACKEND_PATHS.linuxCpu);
|
||||
const metalInstalled = osPlatform === "darwin" && fs.existsSync(BACKEND_PATHS.mac);
|
||||
const metalAvailable = metalInstalled && backendAccepts(BACKEND_PATHS.mac, "metal");
|
||||
// Darwin release binaries are Metal builds. Treat an installed macOS backend
|
||||
// as Metal-capable so the UI does not default to CPU if a probe flag changes
|
||||
// upstream.
|
||||
const metalAvailable = metalInstalled;
|
||||
|
||||
const options = [{ id: "cpu", label: "CPU", available: true }];
|
||||
if (metalAvailable) options.push({ id: "metal", label: "Metal GPU", available: true });
|
||||
@@ -1053,6 +1056,11 @@ async function startBackend(settings = {}) {
|
||||
backendLoadState.device = deviceMatch[1].trim();
|
||||
currentSettings.backendDevice = backendLoadState.device;
|
||||
}
|
||||
const metalDeviceMatch = cleanOutput.match(/GPU name:\s*([^\r\n]+)/);
|
||||
if (metalDeviceMatch) {
|
||||
backendLoadState.device = metalDeviceMatch[1].trim();
|
||||
currentSettings.backendDevice = backendLoadState.device;
|
||||
}
|
||||
if (cleanOutput.includes("ggml_cuda_init")) {
|
||||
backendLoadState.backendMode = "CUDA GPU";
|
||||
currentSettings.backendMode = "CUDA GPU";
|
||||
@@ -1065,6 +1073,10 @@ async function startBackend(settings = {}) {
|
||||
backendLoadState.backendMode = "ROCm GPU";
|
||||
currentSettings.backendMode = "ROCm GPU";
|
||||
}
|
||||
if (cleanOutput.includes("ggml_metal")) {
|
||||
backendLoadState.backendMode = "Metal GPU";
|
||||
currentSettings.backendMode = "Metal GPU";
|
||||
}
|
||||
if (cleanOutput.includes("[ERROR]")) {
|
||||
const nextError = describeBackendError(cleanOutput.trim(), currentSettings.model);
|
||||
const hasSpecificFileError = String(backendError || "").includes("incomplete or corrupted");
|
||||
|
||||
Reference in new issue
Block a user