node-llama-cpp
Version:
Run AI models locally on your machine with node.js bindings for llama.cpp. Enforce a JSON schema on the model output on the generation level
38 lines • 1.83 kB
JavaScript
import filenamify from "filenamify";
const binarySplitGgufPartsRegex = /\.gguf\.part(?<part>\d+)of(?<parts>\d+)$/;
export function resolveBinarySplitGgufPartUrls(ggufUrl) {
const parsedGgufUrl = new URL(ggufUrl);
const binaryPartsMatch = parsedGgufUrl.pathname.match(binarySplitGgufPartsRegex);
if (binaryPartsMatch != null) {
const partString = binaryPartsMatch.groups?.part;
const part = Number(partString);
const partsString = binaryPartsMatch.groups?.parts;
const parts = Number(partsString);
if (partString == null || !Number.isFinite(part) || partsString == null || !Number.isFinite(parts) || part > parts || part === 0 ||
parts === 0)
return ggufUrl;
const ggufIndex = parsedGgufUrl.pathname.indexOf(".gguf");
const pathnameWithoutPart = parsedGgufUrl.pathname.slice(0, ggufIndex + ".gguf".length);
const res = [];
for (let i = 1; i <= parts; i++) {
const url = new URL(parsedGgufUrl.href);
url.pathname = pathnameWithoutPart + `.part${String(i).padStart(partString.length, "0")}of${partsString}`;
res.push(url.href);
}
return res;
}
return ggufUrl;
}
export function getFilenameForBinarySplitGgufPartUrls(urls) {
if (urls.length === 0)
return undefined;
const firstParsedUrl = new URL(urls[0]);
if (binarySplitGgufPartsRegex.test(firstParsedUrl.pathname)) {
const ggufIndex = firstParsedUrl.pathname.toLowerCase().indexOf(".gguf");
const urlWithoutPart = firstParsedUrl.pathname.slice(0, ggufIndex + ".gguf".length);
const filename = decodeURIComponent(urlWithoutPart.split("/").pop());
return filenamify(filename);
}
return undefined;
}
//# sourceMappingURL=resolveBinarySplitGgufPartUrls.js.map