node-llama-cpp 0.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +210 -0
  3. package/dist/AbortError.d.ts +3 -0
  4. package/dist/AbortError.js +6 -0
  5. package/dist/AbortError.js.map +1 -0
  6. package/dist/ChatPromptWrapper.d.ts +7 -0
  7. package/dist/ChatPromptWrapper.js +14 -0
  8. package/dist/ChatPromptWrapper.js.map +1 -0
  9. package/dist/LlamaChatSession.d.ts +24 -0
  10. package/dist/LlamaChatSession.js +86 -0
  11. package/dist/LlamaChatSession.js.map +1 -0
  12. package/dist/LlamaModel.d.ts +13 -0
  13. package/dist/LlamaModel.js +43 -0
  14. package/dist/LlamaModel.js.map +1 -0
  15. package/dist/chatWrappers/EmptyChatPromptWrapper.d.ts +3 -0
  16. package/dist/chatWrappers/EmptyChatPromptWrapper.js +4 -0
  17. package/dist/chatWrappers/EmptyChatPromptWrapper.js.map +1 -0
  18. package/dist/chatWrappers/LlamaChatPromptWrapper.d.ts +8 -0
  19. package/dist/chatWrappers/LlamaChatPromptWrapper.js +16 -0
  20. package/dist/chatWrappers/LlamaChatPromptWrapper.js.map +1 -0
  21. package/dist/cli/cli.d.ts +2 -0
  22. package/dist/cli/cli.js +33 -0
  23. package/dist/cli/cli.js.map +1 -0
  24. package/dist/cli/commands/BuildCommand.d.ts +8 -0
  25. package/dist/cli/commands/BuildCommand.js +41 -0
  26. package/dist/cli/commands/BuildCommand.js.map +1 -0
  27. package/dist/cli/commands/ChatCommand.d.ts +8 -0
  28. package/dist/cli/commands/ChatCommand.js +83 -0
  29. package/dist/cli/commands/ChatCommand.js.map +1 -0
  30. package/dist/cli/commands/ClearCommand.d.ts +7 -0
  31. package/dist/cli/commands/ClearCommand.js +42 -0
  32. package/dist/cli/commands/ClearCommand.js.map +1 -0
  33. package/dist/cli/commands/DownloadCommand.d.ts +11 -0
  34. package/dist/cli/commands/DownloadCommand.js +179 -0
  35. package/dist/cli/commands/DownloadCommand.js.map +1 -0
  36. package/dist/cli/commands/OnPostInstallCommand.d.ts +4 -0
  37. package/dist/cli/commands/OnPostInstallCommand.js +24 -0
  38. package/dist/cli/commands/OnPostInstallCommand.js.map +1 -0
  39. package/dist/commands.d.ts +4 -0
  40. package/dist/commands.js +5 -0
  41. package/dist/commands.js.map +1 -0
  42. package/dist/config.d.ts +9 -0
  43. package/dist/config.js +25 -0
  44. package/dist/config.js.map +1 -0
  45. package/dist/index.d.ts +7 -0
  46. package/dist/index.js +8 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/utils/clearLlamaBuild.d.ts +1 -0
  49. package/dist/utils/clearLlamaBuild.js +12 -0
  50. package/dist/utils/clearLlamaBuild.js.map +1 -0
  51. package/dist/utils/clearTempFolder.d.ts +1 -0
  52. package/dist/utils/clearTempFolder.js +16 -0
  53. package/dist/utils/clearTempFolder.js.map +1 -0
  54. package/dist/utils/compileLLamaCpp.d.ts +6 -0
  55. package/dist/utils/compileLLamaCpp.js +43 -0
  56. package/dist/utils/compileLLamaCpp.js.map +1 -0
  57. package/dist/utils/getBin.d.ts +18 -0
  58. package/dist/utils/getBin.js +70 -0
  59. package/dist/utils/getBin.js.map +1 -0
  60. package/dist/utils/spawnCommand.d.ts +1 -0
  61. package/dist/utils/spawnCommand.js +39 -0
  62. package/dist/utils/spawnCommand.js.map +1 -0
  63. package/dist/utils/usedBinFlag.d.ts +6 -0
  64. package/dist/utils/usedBinFlag.js +15 -0
  65. package/dist/utils/usedBinFlag.js.map +1 -0
  66. package/dist/utils/withLock.d.ts +1 -0
  67. package/dist/utils/withLock.js +19 -0
  68. package/dist/utils/withLock.js.map +1 -0
  69. package/dist/utils/withOra.d.ts +5 -0
  70. package/dist/utils/withOra.js +21 -0
  71. package/dist/utils/withOra.js.map +1 -0
  72. package/llama/.clang-format +46 -0
  73. package/llama/addon.cpp +183 -0
  74. package/llama/binding.gyp +24 -0
  75. package/llama/usedBin.json +3 -0
  76. package/llamaBins/linux-arm64-16.node +0 -0
  77. package/llamaBins/linux-arm64-17.node +0 -0
  78. package/llamaBins/linux-arm64-18.node +0 -0
  79. package/llamaBins/linux-arm64-19.node +0 -0
  80. package/llamaBins/linux-arm64-20.node +0 -0
  81. package/llamaBins/linux-armv7l-16.node +0 -0
  82. package/llamaBins/linux-armv7l-17.node +0 -0
  83. package/llamaBins/linux-armv7l-18.node +0 -0
  84. package/llamaBins/linux-armv7l-19.node +0 -0
  85. package/llamaBins/linux-armv7l-20.node +0 -0
  86. package/llamaBins/linux-ppc64le-16.node +0 -0
  87. package/llamaBins/linux-ppc64le-17.node +0 -0
  88. package/llamaBins/linux-ppc64le-18.node +0 -0
  89. package/llamaBins/linux-ppc64le-19.node +0 -0
  90. package/llamaBins/linux-ppc64le-20.node +0 -0
  91. package/llamaBins/linux-x64-16.node +0 -0
  92. package/llamaBins/linux-x64-17.node +0 -0
  93. package/llamaBins/linux-x64-18.node +0 -0
  94. package/llamaBins/linux-x64-19.node +0 -0
  95. package/llamaBins/linux-x64-20.node +0 -0
  96. package/llamaBins/mac-arm64-16.node +0 -0
  97. package/llamaBins/mac-arm64-17.node +0 -0
  98. package/llamaBins/mac-arm64-18.node +0 -0
  99. package/llamaBins/mac-arm64-19.node +0 -0
  100. package/llamaBins/mac-arm64-20.node +0 -0
  101. package/llamaBins/mac-x64-16.node +0 -0
  102. package/llamaBins/mac-x64-17.node +0 -0
  103. package/llamaBins/mac-x64-18.node +0 -0
  104. package/llamaBins/mac-x64-19.node +0 -0
  105. package/llamaBins/mac-x64-20.node +0 -0
  106. package/llamaBins/win-x64-16.node +0 -0
  107. package/llamaBins/win-x64-17.node +0 -0
  108. package/llamaBins/win-x64-18.node +0 -0
  109. package/llamaBins/win-x64-19.node +0 -0
  110. package/llamaBins/win-x64-20.node +0 -0
  111. package/package.json +71 -10
@@ -0,0 +1,83 @@
1
+ import * as readline from "readline/promises";
2
+ import process from "process";
3
+ import chalk from "chalk";
4
+ import withOra from "../../utils/withOra.js";
5
+ import { defaultChatSystemPrompt } from "../../config.js";
6
+ import { LlamaChatPromptWrapper } from "../../chatWrappers/LlamaChatPromptWrapper.js";
7
+ export const ChatCommand = {
8
+ command: "chat",
9
+ describe: "Chat with a LLama model",
10
+ builder(yargs) {
11
+ return yargs
12
+ .option("model", {
13
+ type: "string",
14
+ demandOption: true,
15
+ description: "LLama model file to use for the chat",
16
+ group: "Required:"
17
+ })
18
+ .option("systemInfo", {
19
+ type: "boolean",
20
+ default: false,
21
+ description: "Print llama.cpp system info",
22
+ group: "Optional:"
23
+ })
24
+ .option("systemPrompt", {
25
+ type: "string",
26
+ default: defaultChatSystemPrompt,
27
+ defaultDescription: "",
28
+ description: "System prompt to use against the model. " +
29
+ "[default value: " + defaultChatSystemPrompt.split("\n").join(" ") + "]",
30
+ group: "Optional:"
31
+ });
32
+ },
33
+ async handler({ model, systemInfo, systemPrompt }) {
34
+ try {
35
+ await RunChat({ model, systemInfo, systemPrompt });
36
+ }
37
+ catch (err) {
38
+ console.error(err);
39
+ process.exit(1);
40
+ }
41
+ }
42
+ };
43
+ async function RunChat({ model: modelArg, systemInfo, systemPrompt }) {
44
+ const { LlamaChatSession } = await import("../../LlamaChatSession.js");
45
+ const { LlamaModel } = await import("../../LlamaModel.js");
46
+ const model = new LlamaModel({
47
+ modelPath: modelArg
48
+ });
49
+ const session = new LlamaChatSession({
50
+ model,
51
+ printLLamaSystemInfo: systemInfo,
52
+ systemPrompt,
53
+ promptWrapper: new LlamaChatPromptWrapper()
54
+ });
55
+ await withOra({
56
+ loading: chalk.blue("Loading model"),
57
+ success: chalk.blue("Model loaded"),
58
+ fail: chalk.blue("Failed to load model")
59
+ }, async () => {
60
+ await session.init();
61
+ });
62
+ // this is for ora to not interfere with readline
63
+ await new Promise(resolve => setTimeout(resolve, 1));
64
+ const rl = readline.createInterface({
65
+ input: process.stdin,
66
+ output: process.stdout
67
+ });
68
+ // eslint-disable-next-line no-constant-condition
69
+ while (true) {
70
+ const input = await rl.question(chalk.yellow("> "));
71
+ if (input === ".exit")
72
+ break;
73
+ process.stdout.write(chalk.yellow("AI: "));
74
+ const [startColor, endColor] = chalk.blue("MIDDLE").split("MIDDLE");
75
+ process.stdout.write(startColor);
76
+ await session.prompt(input, (chunk) => {
77
+ process.stdout.write(model.decode(Uint32Array.from([chunk])));
78
+ });
79
+ process.stdout.write(endColor);
80
+ console.log();
81
+ }
82
+ }
83
+ //# sourceMappingURL=ChatCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/ChatCommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { CommandModule } from "yargs";
2
+ type ClearCommand = {
3
+ type: "source" | "build" | "all";
4
+ };
5
+ export declare const ClearCommand: CommandModule<object, ClearCommand>;
6
+ export declare function ClearLlamaCppBuildCommand({ type }: ClearCommand): Promise<void>;
7
+ export {};
@@ -0,0 +1,42 @@
1
+ import * as fs from "fs-extra";
2
+ import chalk from "chalk";
3
+ import { llamaCppDirectory } from "../../config.js";
4
+ import withOra from "../../utils/withOra.js";
5
+ import { clearLlamaBuild } from "../../utils/clearLlamaBuild.js";
6
+ import { setUsedBinFlag } from "../../utils/usedBinFlag.js";
7
+ export const ClearCommand = {
8
+ command: "clear [type]",
9
+ describe: "Clear files created by llama-cli",
10
+ builder(yargs) {
11
+ return yargs
12
+ .option("type", {
13
+ type: "string",
14
+ choices: ["source", "build", "all"],
15
+ default: "all",
16
+ description: "Files to clear"
17
+ });
18
+ },
19
+ handler: ClearLlamaCppBuildCommand
20
+ };
21
+ export async function ClearLlamaCppBuildCommand({ type }) {
22
+ if (type === "source" || type === "all") {
23
+ await withOra({
24
+ loading: chalk.blue("Clearing source"),
25
+ success: chalk.blue("Cleared source"),
26
+ fail: chalk.blue("Failed to clear source")
27
+ }, async () => {
28
+ await fs.remove(llamaCppDirectory);
29
+ });
30
+ }
31
+ if (type === "build" || type === "all") {
32
+ await withOra({
33
+ loading: chalk.blue("Clearing build"),
34
+ success: chalk.blue("Cleared build"),
35
+ fail: chalk.blue("Failed to clear build")
36
+ }, async () => {
37
+ await clearLlamaBuild();
38
+ });
39
+ }
40
+ await setUsedBinFlag("prebuildBinaries");
41
+ }
42
+ //# sourceMappingURL=ClearCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClearCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/ClearCommand.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAClD,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAC,cAAc,EAAC,MAAM,4BAA4B,CAAC;AAM1D,MAAM,CAAC,MAAM,YAAY,GAAwC;IAC7D,OAAO,EAAE,cAAc;IACvB,QAAQ,EAAE,kCAAkC;IAC5C,OAAO,CAAC,KAAK;QACT,OAAO,KAAK;aACP,MAAM,CAAC,MAAM,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAA2B;YAC7D,OAAO,EAAE,KAA6B;YACtC,WAAW,EAAE,gBAAgB;SAChC,CAAC,CAAC;IACX,CAAC;IACD,OAAO,EAAE,yBAAyB;CACrC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,EAAC,IAAI,EAAe;IAChE,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,KAAK,EAAE;QACrC,MAAM,OAAO,CAAC;YACV,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC;YACtC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC;YACrC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC;SAC7C,EAAE,KAAK,IAAI,EAAE;YACV,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;KACN;IAED,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,EAAE;QACpC,MAAM,OAAO,CAAC;YACV,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC;YACrC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC;YACpC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC;SAC5C,EAAE,KAAK,IAAI,EAAE;YACV,MAAM,eAAe,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;KACN;IAED,MAAM,cAAc,CAAC,kBAAkB,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { CommandModule } from "yargs";
2
+ type DownloadCommandArgs = {
3
+ repo: string;
4
+ release: "latest" | string;
5
+ arch?: string;
6
+ nodeTarget?: string;
7
+ skipBuild?: boolean;
8
+ };
9
+ export declare const DownloadCommand: CommandModule<object, DownloadCommandArgs>;
10
+ export declare function DownloadLlamaCppCommand({ repo, release, arch, nodeTarget, skipBuild }: DownloadCommandArgs): Promise<void>;
11
+ export {};
@@ -0,0 +1,179 @@
1
+ import * as path from "path";
2
+ import { Octokit } from "octokit";
3
+ import * as fs from "fs-extra";
4
+ import chalk from "chalk";
5
+ import { DownloaderHelper } from "node-downloader-helper";
6
+ import cliProgress from "cli-progress";
7
+ import bytes from "bytes";
8
+ import StreamZip from "node-stream-zip";
9
+ import { defaultLlamaCppGitHubRepo, defaultLlamaCppRelease, llamaCppDirectory, tempDownloadDirectory } from "../../config.js";
10
+ import { compileLlamaCpp } from "../../utils/compileLLamaCpp.js";
11
+ import withOra from "../../utils/withOra.js";
12
+ import { clearTempFolder } from "../../utils/clearTempFolder.js";
13
+ export const DownloadCommand = {
14
+ command: "download",
15
+ describe: "Download a release of llama.cpp and compile it",
16
+ builder(yargs) {
17
+ return yargs
18
+ .option("repo", {
19
+ type: "string",
20
+ default: defaultLlamaCppGitHubRepo,
21
+ description: "The GitHub repository to download a release of llama.cpp from. Can also be set via the NODE_LLAMA_CPP_REPO environment variable"
22
+ })
23
+ .option("release", {
24
+ type: "string",
25
+ default: defaultLlamaCppRelease,
26
+ description: "The tag of the llama.cpp release to download. Can also be set via the NODE_LLAMA_CPP_REPO_RELEASE environment variable"
27
+ })
28
+ .option("arch", {
29
+ type: "string",
30
+ description: "The architecture to compile llama.cpp for"
31
+ })
32
+ .option("nodeTarget", {
33
+ type: "string",
34
+ description: "The Node.js version to compile llama.cpp for. Example: v18.0.0"
35
+ })
36
+ .option("skipBuild", {
37
+ type: "boolean",
38
+ default: false,
39
+ description: "Skip building llama.cpp after downloading it"
40
+ });
41
+ },
42
+ handler: DownloadLlamaCppCommand
43
+ };
44
+ export async function DownloadLlamaCppCommand({ repo, release, arch, nodeTarget, skipBuild }) {
45
+ const octokit = new Octokit();
46
+ const [githubOwner, githubRepo] = repo.split("/");
47
+ console.log(`${chalk.yellow("Repo:")} ${repo}`);
48
+ console.log(`${chalk.yellow("Release:")} ${release}`);
49
+ console.log();
50
+ let githubRelease = null;
51
+ let zipUrl;
52
+ await withOra({
53
+ loading: chalk.blue("Fetching llama.cpp info"),
54
+ success: chalk.blue("Fetched llama.cpp info"),
55
+ fail: chalk.blue("Failed to fetch llama.cpp info")
56
+ }, async () => {
57
+ try {
58
+ if (release === "latest") {
59
+ githubRelease = await octokit.rest.repos.getLatestRelease({
60
+ owner: githubOwner,
61
+ repo: githubRepo
62
+ });
63
+ }
64
+ else {
65
+ githubRelease = await octokit.rest.repos.getReleaseByTag({
66
+ owner: githubOwner,
67
+ repo: githubRepo,
68
+ tag: release
69
+ });
70
+ }
71
+ }
72
+ catch (err) {
73
+ console.error("Failed to fetch llama.cpp release info", err);
74
+ }
75
+ if (githubRelease == null) {
76
+ throw new Error(`Failed to find release "${release}" of "${repo}"`);
77
+ }
78
+ if (githubRelease.data?.zipball_url == null) {
79
+ throw new Error(`Failed to find a zip archive for release "${release}" of "${repo}"`);
80
+ }
81
+ const zipUrlResponse = await octokit.rest.repos.downloadZipballArchive({
82
+ owner: githubOwner,
83
+ repo: githubRepo,
84
+ ref: githubRelease.data.target_commitish
85
+ });
86
+ if (zipUrlResponse.url == null)
87
+ throw new Error(`Failed to get zip archive url for release "${release}" of "${repo}"`);
88
+ zipUrl = zipUrlResponse.url;
89
+ });
90
+ await clearTempFolder();
91
+ console.log(chalk.blue("Downloading zip file"));
92
+ await fs.ensureDir(tempDownloadDirectory);
93
+ await downloadFile(zipUrl, "llama.cpp.zip", tempDownloadDirectory);
94
+ await withOra({
95
+ loading: chalk.blue("Removing existing llama.cpp directory"),
96
+ success: chalk.blue("Removed existing llama.cpp directory"),
97
+ fail: chalk.blue("Failed to remove existing llama.cpp directory")
98
+ }, async () => {
99
+ await fs.remove(llamaCppDirectory);
100
+ });
101
+ await withOra({
102
+ loading: chalk.blue("Extracting llama.cpp.zip file"),
103
+ success: chalk.blue("Extracted llama.cpp.zip file"),
104
+ fail: chalk.blue("Failed to extract llama.cpp.zip file")
105
+ }, async () => {
106
+ await unzipLlamaReleaseZipFile(path.join(tempDownloadDirectory, "llama.cpp.zip"), llamaCppDirectory);
107
+ });
108
+ await withOra({
109
+ loading: chalk.blue("Removing temporary files"),
110
+ success: chalk.blue("Removed temporary files"),
111
+ fail: chalk.blue("Failed to remove temporary files")
112
+ }, async () => {
113
+ await clearTempFolder();
114
+ });
115
+ if (!skipBuild) {
116
+ console.log(chalk.blue("Compiling llama.cpp"));
117
+ await compileLlamaCpp({
118
+ arch: arch ? arch : undefined,
119
+ nodeTarget: nodeTarget ? nodeTarget : undefined,
120
+ setUsedBingFlag: true
121
+ });
122
+ }
123
+ console.log();
124
+ console.log();
125
+ console.log(`${chalk.yellow("Repo:")} ${repo}`);
126
+ console.log(`${chalk.yellow("Release:")} ${release}`);
127
+ console.log();
128
+ console.log(chalk.green("Done"));
129
+ }
130
+ async function downloadFile(url, fileName, directory) {
131
+ const download = new DownloaderHelper(url, directory, {
132
+ fileName: fileName,
133
+ retry: {
134
+ maxRetries: 10,
135
+ delay: 1000 * 6
136
+ }
137
+ });
138
+ const progressBar = new cliProgress.Bar({
139
+ clearOnComplete: false,
140
+ hideCursor: true,
141
+ autopadding: true,
142
+ format: `${chalk.bold("{filename}")} ${chalk.yellow("{percentage}%")} ${chalk.cyan("{bar}")} {speed}${chalk.grey("{eta_formatted}")}`
143
+ }, cliProgress.Presets.shades_classic);
144
+ progressBar.start(100, 0, {
145
+ speed: "",
146
+ filename: fileName
147
+ });
148
+ download.on("progress", (stats) => {
149
+ progressBar.update(Math.floor((stats.downloaded / stats.total) * 10000) / 100, {
150
+ speed: Number.isFinite(stats.speed) ? chalk.blue((bytes(stats.speed) + "/s").padEnd(10)) + chalk.grey(" | ") : ""
151
+ });
152
+ });
153
+ download.on("end", () => {
154
+ progressBar.update(100);
155
+ progressBar.stop();
156
+ });
157
+ // errors are handled by the .start() method
158
+ // this listener is here to not get an unhandled error exception
159
+ download.on("error", () => { });
160
+ await download.start();
161
+ }
162
+ async function unzipLlamaReleaseZipFile(zipFilePath, directory) {
163
+ const zip = new StreamZip.async({ file: zipFilePath });
164
+ const entires = await zip.entries();
165
+ const rootFolderEntries = new Map();
166
+ for (const entry of Object.values(entires)) {
167
+ const entryPath = entry.name.split("/");
168
+ const rootFolderName = entryPath[0];
169
+ const rootFolderEntryCount = rootFolderEntries.get(rootFolderName) ?? 0;
170
+ rootFolderEntries.set(rootFolderName, rootFolderEntryCount + 1);
171
+ }
172
+ const mostUsedRootFolderName = [...rootFolderEntries.keys()]
173
+ .sort((a, b) => rootFolderEntries.get(b) - rootFolderEntries.get(a))
174
+ .shift();
175
+ if (mostUsedRootFolderName == null)
176
+ throw new Error("Failed to find the root folder of the llama.cpp release zip file");
177
+ await zip.extract(mostUsedRootFolderName, directory);
178
+ }
179
+ //# sourceMappingURL=DownloadCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DownloadCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/DownloadCommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { CommandModule } from "yargs";
2
+ type OnPostInstallCommand = null;
3
+ export declare const OnPostInstallCommand: CommandModule<object, OnPostInstallCommand>;
4
+ export {};
@@ -0,0 +1,24 @@
1
+ import { defaultLlamaCppGitHubRepo, defaultLlamaCppRelease, defaultSkipDownload } from "../../config.js";
2
+ import { getPrebuildBinPath } from "../../utils/getBin.js";
3
+ import { DownloadLlamaCppCommand } from "./DownloadCommand.js";
4
+ export const OnPostInstallCommand = {
5
+ command: "postinstall",
6
+ describe: false,
7
+ async handler() {
8
+ if (defaultSkipDownload)
9
+ return;
10
+ if (await getPrebuildBinPath() != null)
11
+ return;
12
+ try {
13
+ await DownloadLlamaCppCommand({
14
+ repo: defaultLlamaCppGitHubRepo,
15
+ release: defaultLlamaCppRelease
16
+ });
17
+ }
18
+ catch (err) {
19
+ console.error(err);
20
+ process.exit(1);
21
+ }
22
+ }
23
+ };
24
+ //# sourceMappingURL=OnPostInstallCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OnPostInstallCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/OnPostInstallCommand.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,yBAAyB,EAAE,sBAAsB,EAAE,mBAAmB,EAAC,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAC,uBAAuB,EAAC,MAAM,sBAAsB,CAAC;AAI7D,MAAM,CAAC,MAAM,oBAAoB,GAAgD;IAC7E,OAAO,EAAE,aAAa;IACtB,QAAQ,EAAE,KAAK;IACf,KAAK,CAAC,OAAO;QACT,IAAI,mBAAmB;YACnB,OAAO;QAEX,IAAI,MAAM,kBAAkB,EAAE,IAAI,IAAI;YAClC,OAAO;QAEX,IAAI;YACA,MAAM,uBAAuB,CAAC;gBAC1B,IAAI,EAAE,yBAAyB;gBAC/B,OAAO,EAAE,sBAAsB;aAClC,CAAC,CAAC;SACN;QAAC,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACnB;IACL,CAAC;CACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { BuildLlamaCppCommand } from "./cli/commands/BuildCommand.js";
2
+ import { DownloadLlamaCppCommand } from "./cli/commands/DownloadCommand.js";
3
+ import { ClearLlamaCppBuildCommand } from "./cli/commands/ClearCommand.js";
4
+ export { BuildLlamaCppCommand, DownloadLlamaCppCommand, ClearLlamaCppBuildCommand };
@@ -0,0 +1,5 @@
1
+ import { BuildLlamaCppCommand } from "./cli/commands/BuildCommand.js";
2
+ import { DownloadLlamaCppCommand } from "./cli/commands/DownloadCommand.js";
3
+ import { ClearLlamaCppBuildCommand } from "./cli/commands/ClearCommand.js";
4
+ export { BuildLlamaCppCommand, DownloadLlamaCppCommand, ClearLlamaCppBuildCommand };
5
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,oBAAoB,EAAC,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAC,uBAAuB,EAAC,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAC,yBAAyB,EAAC,MAAM,gCAAgC,CAAC;AAEzE,OAAO,EAAC,oBAAoB,EAAE,uBAAuB,EAAE,yBAAyB,EAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const llamaDirectory: string;
2
+ export declare const llamaBinsDirectory: string;
3
+ export declare const llamaCppDirectory: string;
4
+ export declare const tempDownloadDirectory: string;
5
+ export declare const usedBinFlagJsonPath: string;
6
+ export declare const defaultLlamaCppGitHubRepo: string;
7
+ export declare const defaultLlamaCppRelease: string;
8
+ export declare const defaultSkipDownload: boolean;
9
+ export declare const defaultChatSystemPrompt: string;
package/dist/config.js ADDED
@@ -0,0 +1,25 @@
1
+ import { fileURLToPath } from "url";
2
+ import * as path from "path";
3
+ import * as os from "os";
4
+ import envVar from "env-var";
5
+ import * as uuid from "uuid";
6
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
7
+ const env = envVar.from(process.env);
8
+ export const llamaDirectory = path.join(__dirname, "..", "llama");
9
+ export const llamaBinsDirectory = path.join(__dirname, "..", "llamaBins");
10
+ export const llamaCppDirectory = path.join(llamaDirectory, "llama.cpp");
11
+ export const tempDownloadDirectory = path.join(os.tmpdir(), "node-llama-cpp", uuid.v4());
12
+ export const usedBinFlagJsonPath = path.join(llamaDirectory, "usedBin.json");
13
+ export const defaultLlamaCppGitHubRepo = env.get("NODE_LLAMA_CPP_REPO")
14
+ .default("ggerganov/llama.cpp")
15
+ .asString();
16
+ export const defaultLlamaCppRelease = env.get("NODE_LLAMA_CPP_REPO_RELEASE")
17
+ .default("latest")
18
+ .asString();
19
+ export const defaultSkipDownload = env.get("NODE_LLAMA_CPP_SKIP_DOWNLOAD")
20
+ .default("false")
21
+ .asBool();
22
+ export const defaultChatSystemPrompt = "You are a helpful, respectful and honest assistant. Always answer as helpfully as possible.\n" +
23
+ "If a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. " +
24
+ "If you don't know the answer to a question, please don't share false information.";
25
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,KAAK,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAGrC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAC1E,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;AACxE,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACzF,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;AAE7E,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC;KAClE,OAAO,CAAC,qBAAqB,CAAC;KAC9B,QAAQ,EAAE,CAAC;AAChB,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC,GAAG,CAAC,6BAA6B,CAAC;KACvE,OAAO,CAAC,QAAQ,CAAC;KACjB,QAAQ,EAAE,CAAC;AAChB,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC,GAAG,CAAC,8BAA8B,CAAC;KACrE,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,EAAE,CAAC;AACd,MAAM,CAAC,MAAM,uBAAuB,GAAG,+FAA+F;IAClI,+HAA+H;IAC/H,mFAAmF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { LlamaChatSession } from "./LlamaChatSession.js";
2
+ import { LlamaModel } from "./LlamaModel.js";
3
+ import { AbortError } from "./AbortError.js";
4
+ import { ChatPromptWrapper } from "./ChatPromptWrapper.js";
5
+ import { EmptyChatPromptWrapper } from "./chatWrappers/EmptyChatPromptWrapper.js";
6
+ import { LlamaChatPromptWrapper } from "./chatWrappers/LlamaChatPromptWrapper.js";
7
+ export { LlamaModel, LlamaChatSession, AbortError, ChatPromptWrapper, EmptyChatPromptWrapper, LlamaChatPromptWrapper };
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ import { LlamaChatSession } from "./LlamaChatSession.js";
2
+ import { LlamaModel } from "./LlamaModel.js";
3
+ import { AbortError } from "./AbortError.js";
4
+ import { ChatPromptWrapper } from "./ChatPromptWrapper.js";
5
+ import { EmptyChatPromptWrapper } from "./chatWrappers/EmptyChatPromptWrapper.js";
6
+ import { LlamaChatPromptWrapper } from "./chatWrappers/LlamaChatPromptWrapper.js";
7
+ export { LlamaModel, LlamaChatSession, AbortError, ChatPromptWrapper, EmptyChatPromptWrapper, LlamaChatPromptWrapper };
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAC,iBAAiB,EAAC,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAC,sBAAsB,EAAC,MAAM,0CAA0C,CAAC;AAChF,OAAO,EAAC,sBAAsB,EAAC,MAAM,0CAA0C,CAAC;AAEhF,OAAO,EACH,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,EACzB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function clearLlamaBuild(): Promise<void>;
@@ -0,0 +1,12 @@
1
+ import path from "path";
2
+ import * as fs from "fs-extra";
3
+ import { llamaDirectory } from "../config.js";
4
+ import { clearTempFolder } from "./clearTempFolder.js";
5
+ export async function clearLlamaBuild() {
6
+ await fs.remove(path.join(llamaDirectory, "Debug"));
7
+ await fs.remove(path.join(llamaDirectory, "Release"));
8
+ await fs.remove(path.join(llamaDirectory, "compile_commands.json"));
9
+ await fs.remove(path.join(llamaDirectory, "build"));
10
+ await clearTempFolder();
11
+ }
12
+ //# sourceMappingURL=clearLlamaBuild.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clearLlamaBuild.js","sourceRoot":"","sources":["../../src/utils/clearLlamaBuild.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAC,cAAc,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAC,eAAe,EAAC,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,eAAe;IACjC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;IACtD,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,uBAAuB,CAAC,CAAC,CAAC;IACpE,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;IAEpD,MAAM,eAAe,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function clearTempFolder(): Promise<void>;
@@ -0,0 +1,16 @@
1
+ import process from "process";
2
+ import * as fs from "fs-extra";
3
+ import { tempDownloadDirectory } from "../config.js";
4
+ export async function clearTempFolder() {
5
+ if (process.platform === "win32") {
6
+ try {
7
+ await fs.remove(tempDownloadDirectory);
8
+ }
9
+ catch (err) {
10
+ // do nothing as it fails sometime on Windows, and since it's a temp folder, it's not a big deal
11
+ }
12
+ return;
13
+ }
14
+ await fs.remove(tempDownloadDirectory);
15
+ }
16
+ //# sourceMappingURL=clearTempFolder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clearTempFolder.js","sourceRoot":"","sources":["../../src/utils/clearTempFolder.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAC,qBAAqB,EAAC,MAAM,cAAc,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,eAAe;IACjC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE;QAC9B,IAAI;YACA,MAAM,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;SAC1C;QAAC,OAAO,GAAG,EAAE;YACV,gGAAgG;SACnG;QAED,OAAO;KACV;IAED,MAAM,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function compileLlamaCpp({ arch, nodeTarget, setUsedBingFlag }: {
2
+ arch?: string;
3
+ nodeTarget?: string;
4
+ setUsedBingFlag?: boolean;
5
+ }): Promise<void>;
6
+ export declare function getCompiledLlamaCppBinaryPath(): Promise<string | null>;
@@ -0,0 +1,43 @@
1
+ import path from "path";
2
+ import { fileURLToPath } from "url";
3
+ import process from "process";
4
+ import fs from "fs-extra";
5
+ import { llamaCppDirectory, llamaDirectory } from "../config.js";
6
+ import { clearLlamaBuild } from "./clearLlamaBuild.js";
7
+ import { setUsedBinFlag } from "./usedBinFlag.js";
8
+ import { spawnCommand } from "./spawnCommand.js";
9
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
+ export async function compileLlamaCpp({ arch = process.arch, nodeTarget = process.version, setUsedBingFlag = true }) {
11
+ try {
12
+ if (!(await fs.exists(llamaCppDirectory))) {
13
+ throw new Error(`"${llamaCppDirectory}" directory does not exist`);
14
+ }
15
+ await clearLlamaBuild();
16
+ await spawnCommand("npm", ["run", "-s", "node-gyp-llama", "--", "configure", "--arch=" + arch, "--target=" + nodeTarget], __dirname);
17
+ await spawnCommand("npm", ["run", "-s", "node-gyp-llama", "--", "configure", "--arch=" + arch, "--target=" + nodeTarget, "--", "-f", "compile_commands_json"], __dirname);
18
+ if (await fs.exists(path.join(llamaDirectory, "Release", "compile_commands.json"))) {
19
+ await fs.move(path.join(llamaDirectory, "Release", "compile_commands.json"), path.join(llamaDirectory, "compile_commands.json"));
20
+ }
21
+ else if (await fs.exists(path.join(llamaDirectory, "Debug", "compile_commands.json"))) {
22
+ await fs.move(path.join(llamaDirectory, "Debug", "compile_commands.json"), path.join(llamaDirectory, "compile_commands.json"));
23
+ }
24
+ await fs.remove(path.join(llamaDirectory, "Release"));
25
+ await fs.remove(path.join(llamaDirectory, "Debug"));
26
+ await spawnCommand("npm", ["run", "-s", "node-gyp-llama-build", "--", "--arch=" + arch, "--target=" + nodeTarget], __dirname);
27
+ if (setUsedBingFlag) {
28
+ await setUsedBinFlag("localBuildFromSource");
29
+ }
30
+ }
31
+ catch (err) {
32
+ if (setUsedBingFlag)
33
+ await setUsedBinFlag("prebuildBinaries");
34
+ throw err;
35
+ }
36
+ }
37
+ export async function getCompiledLlamaCppBinaryPath() {
38
+ const modulePath = path.join(__dirname, "..", "..", "llama", "build", "Release", "llama.node");
39
+ if (await fs.exists(modulePath))
40
+ return modulePath;
41
+ return null;
42
+ }
43
+ //# sourceMappingURL=compileLLamaCpp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compileLLamaCpp.js","sourceRoot":"","sources":["../../src/utils/compileLLamaCpp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export declare function getPrebuildBinPath(): Promise<string | null>;
2
+ export declare function loadBin(): Promise<LlamaCppNodeModule>;
3
+ export type LlamaCppNodeModule = {
4
+ LLAMAModel: LLAMAModel;
5
+ LLAMAContext: LLAMAContext;
6
+ tokenBos(): number;
7
+ systemInfo(): string;
8
+ tokenEos(): number;
9
+ };
10
+ export type LLAMAModel = {
11
+ new (modelPath: string): LLAMAModel;
12
+ };
13
+ export type LLAMAContext = {
14
+ new (model: LLAMAModel): LLAMAContext;
15
+ encode(text: string): Uint32Array;
16
+ eval(tokens: Uint32Array, restrictions?: Uint32Array): Promise<number>;
17
+ decode(tokens: Uint32Array): string;
18
+ };