node-llama-cpp 3.1.0 → 3.2.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 (132) hide show
  1. package/README.md +1 -1
  2. package/dist/ChatWrapper.js +1 -1
  3. package/dist/ChatWrapper.js.map +1 -1
  4. package/dist/bindings/AddonTypes.d.ts +6 -0
  5. package/dist/bindings/Llama.d.ts +33 -0
  6. package/dist/bindings/Llama.js +85 -8
  7. package/dist/bindings/Llama.js.map +1 -1
  8. package/dist/bindings/getLlama.d.ts +22 -1
  9. package/dist/bindings/getLlama.js +18 -3
  10. package/dist/bindings/getLlama.js.map +1 -1
  11. package/dist/bindings/utils/MemoryOrchestrator.d.ts +2 -0
  12. package/dist/bindings/utils/MemoryOrchestrator.js +3 -2
  13. package/dist/bindings/utils/MemoryOrchestrator.js.map +1 -1
  14. package/dist/bindings/utils/clearAllLocalBuilds.js +2 -2
  15. package/dist/bindings/utils/clearAllLocalBuilds.js.map +1 -1
  16. package/dist/bindings/utils/compileLLamaCpp.js +15 -1
  17. package/dist/bindings/utils/compileLLamaCpp.js.map +1 -1
  18. package/dist/bindings/utils/detectAvailableComputeLayers.js.map +1 -1
  19. package/dist/bindings/utils/getGpuTypesToUseForOption.js +1 -1
  20. package/dist/bindings/utils/getGpuTypesToUseForOption.js.map +1 -1
  21. package/dist/bindings/utils/getLinuxDistroInfo.js +1 -1
  22. package/dist/bindings/utils/getLinuxDistroInfo.js.map +1 -1
  23. package/dist/bindings/utils/testCmakeBinary.js +1 -1
  24. package/dist/bindings/utils/testCmakeBinary.js.map +1 -1
  25. package/dist/chatWrappers/FunctionaryChatWrapper.js.map +1 -1
  26. package/dist/chatWrappers/GemmaChatWrapper.js.map +1 -1
  27. package/dist/chatWrappers/utils/ChatModelFunctionsDocumentationGenerator.js +1 -1
  28. package/dist/chatWrappers/utils/ChatModelFunctionsDocumentationGenerator.js.map +1 -1
  29. package/dist/chatWrappers/utils/chunkChatItems.js +1 -1
  30. package/dist/chatWrappers/utils/chunkChatItems.js.map +1 -1
  31. package/dist/chatWrappers/utils/isJinjaTemplateEquivalentToSpecializedChatWrapper.js.map +1 -1
  32. package/dist/chatWrappers/utils/resolveChatWrapper.js +1 -1
  33. package/dist/chatWrappers/utils/resolveChatWrapper.js.map +1 -1
  34. package/dist/cli/commands/ChatCommand.js +1 -2
  35. package/dist/cli/commands/ChatCommand.js.map +1 -1
  36. package/dist/cli/commands/CompleteCommand.js +1 -2
  37. package/dist/cli/commands/CompleteCommand.js.map +1 -1
  38. package/dist/cli/commands/InfillCommand.js +1 -2
  39. package/dist/cli/commands/InfillCommand.js.map +1 -1
  40. package/dist/cli/commands/inspect/commands/InspectEstimateCommand.js +0 -1
  41. package/dist/cli/commands/inspect/commands/InspectEstimateCommand.js.map +1 -1
  42. package/dist/cli/commands/inspect/commands/InspectGgufCommand.d.ts +1 -0
  43. package/dist/cli/commands/inspect/commands/InspectGgufCommand.js +47 -11
  44. package/dist/cli/commands/inspect/commands/InspectGgufCommand.js.map +1 -1
  45. package/dist/cli/commands/inspect/commands/InspectGpuCommand.js +14 -3
  46. package/dist/cli/commands/inspect/commands/InspectGpuCommand.js.map +1 -1
  47. package/dist/cli/utils/consolePromptQuestion.js +0 -1
  48. package/dist/cli/utils/consolePromptQuestion.js.map +1 -1
  49. package/dist/cli/utils/interactivelyAskForModel.js +3 -1
  50. package/dist/cli/utils/interactivelyAskForModel.js.map +1 -1
  51. package/dist/evaluator/LlamaChat/LlamaChat.js +12 -12
  52. package/dist/evaluator/LlamaChat/LlamaChat.js.map +1 -1
  53. package/dist/evaluator/LlamaChat/utils/contextShiftStrategies/eraseFirstResponseAndKeepFirstSystemChatContextShiftStrategy.js +63 -8
  54. package/dist/evaluator/LlamaChat/utils/contextShiftStrategies/eraseFirstResponseAndKeepFirstSystemChatContextShiftStrategy.js.map +1 -1
  55. package/dist/evaluator/LlamaChatSession/LlamaChatSession.d.ts +8 -1
  56. package/dist/evaluator/LlamaChatSession/LlamaChatSession.js +16 -6
  57. package/dist/evaluator/LlamaChatSession/LlamaChatSession.js.map +1 -1
  58. package/dist/evaluator/LlamaCompletion.js +11 -9
  59. package/dist/evaluator/LlamaCompletion.js.map +1 -1
  60. package/dist/evaluator/LlamaContext/LlamaContext.d.ts +11 -0
  61. package/dist/evaluator/LlamaContext/LlamaContext.js +66 -8
  62. package/dist/evaluator/LlamaContext/LlamaContext.js.map +1 -1
  63. package/dist/evaluator/LlamaContext/utils/batchItemsPrioritizationStrategies/firstInFirstOutStrategy.js.map +1 -1
  64. package/dist/evaluator/LlamaContext/utils/batchItemsPrioritizationStrategies/maximumParallelismStrategy.js.map +1 -1
  65. package/dist/evaluator/LlamaModel/LlamaModel.js +8 -4
  66. package/dist/evaluator/LlamaModel/LlamaModel.js.map +1 -1
  67. package/dist/gguf/insights/GgufInsights.d.ts +1 -0
  68. package/dist/gguf/insights/GgufInsights.js +8 -0
  69. package/dist/gguf/insights/GgufInsights.js.map +1 -1
  70. package/dist/gguf/insights/GgufInsightsConfigurationResolver.d.ts +40 -4
  71. package/dist/gguf/insights/GgufInsightsConfigurationResolver.js +116 -93
  72. package/dist/gguf/insights/GgufInsightsConfigurationResolver.js.map +1 -1
  73. package/dist/gguf/insights/utils/getRamUsageFromUnifiedVram.d.ts +5 -0
  74. package/dist/gguf/insights/utils/getRamUsageFromUnifiedVram.js +7 -0
  75. package/dist/gguf/insights/utils/getRamUsageFromUnifiedVram.js.map +1 -0
  76. package/dist/gguf/insights/utils/resolveContextContextSizeOption.d.ts +11 -1
  77. package/dist/gguf/insights/utils/resolveContextContextSizeOption.js +47 -17
  78. package/dist/gguf/insights/utils/resolveContextContextSizeOption.js.map +1 -1
  79. package/dist/gguf/insights/utils/scoreLevels.js.map +1 -1
  80. package/dist/gguf/readGgufFileInfo.js +1 -1
  81. package/dist/gguf/readGgufFileInfo.js.map +1 -1
  82. package/dist/gguf/utils/getGgufMetadataKeyValue.d.ts +1 -0
  83. package/dist/gguf/utils/getGgufMetadataKeyValue.js +27 -0
  84. package/dist/gguf/utils/getGgufMetadataKeyValue.js.map +1 -0
  85. package/dist/index.d.ts +2 -1
  86. package/dist/index.js.map +1 -1
  87. package/dist/tsconfig.tsbuildinfo +1 -1
  88. package/dist/utils/StopGenerationDetector.js +1 -1
  89. package/dist/utils/StopGenerationDetector.js.map +1 -1
  90. package/dist/utils/ThreadsSplitter.js +2 -2
  91. package/dist/utils/ThreadsSplitter.js.map +1 -1
  92. package/dist/utils/createModelDownloader.js.map +1 -1
  93. package/dist/utils/findCharacterRemovalCountToFitChatHistoryInContext.d.ts +2 -1
  94. package/dist/utils/findCharacterRemovalCountToFitChatHistoryInContext.js +14 -1
  95. package/dist/utils/findCharacterRemovalCountToFitChatHistoryInContext.js.map +1 -1
  96. package/dist/utils/gbnfJson/terminals/GbnfNumber.js.map +1 -1
  97. package/dist/utils/gbnfJson/terminals/GbnfObjectMap.js.map +1 -1
  98. package/dist/utils/gbnfJson/terminals/GbnfOr.js +4 -4
  99. package/dist/utils/gbnfJson/terminals/GbnfOr.js.map +1 -1
  100. package/dist/utils/getLlamaClasses.d.ts +9 -0
  101. package/dist/utils/getLlamaClasses.js +14 -0
  102. package/dist/utils/getLlamaClasses.js.map +1 -0
  103. package/dist/utils/hashString.js +1 -1
  104. package/dist/utils/hashString.js.map +1 -1
  105. package/dist/utils/spawnCommand.js +1 -1
  106. package/dist/utils/spawnCommand.js.map +1 -1
  107. package/dist/utils/transformPromisable.js +1 -2
  108. package/dist/utils/transformPromisable.js.map +1 -1
  109. package/dist/utils/truncateTextAndRoundToWords.d.ts +4 -3
  110. package/dist/utils/truncateTextAndRoundToWords.js +90 -39
  111. package/dist/utils/truncateTextAndRoundToWords.js.map +1 -1
  112. package/dist/utils/waitForLockfileRelease.js +0 -1
  113. package/dist/utils/waitForLockfileRelease.js.map +1 -1
  114. package/llama/CMakeLists.txt +6 -0
  115. package/llama/addon/AddonContext.cpp +1 -1
  116. package/llama/addon/AddonModel.cpp +4 -4
  117. package/llama/addon/AddonSampler.cpp +0 -13
  118. package/llama/addon/AddonSampler.h +0 -2
  119. package/llama/addon/addon.cpp +2 -0
  120. package/llama/addon/globals/getGpuInfo.cpp +8 -2
  121. package/llama/addon/globals/getSwapInfo.cpp +69 -0
  122. package/llama/addon/globals/getSwapInfo.h +4 -0
  123. package/llama/binariesGithubRelease.json +1 -1
  124. package/llama/gitRelease.bundle +0 -0
  125. package/llama/gpuInfo/metal-gpu-info.h +1 -1
  126. package/llama/gpuInfo/metal-gpu-info.mm +8 -1
  127. package/llama/gpuInfo/vulkan-gpu-info.cpp +17 -10
  128. package/llama/gpuInfo/vulkan-gpu-info.h +1 -1
  129. package/llama/llama.cpp.info.json +1 -1
  130. package/package.json +45 -43
  131. package/templates/packed/electron-typescript-react.json +1 -1
  132. package/templates/packed/node-typescript.json +1 -1
@@ -1 +1 @@
1
- {"files":[{"path":[".editorconfig"],"content":"root = true\n\n[*]\nindent_style = space\nindent_size = 4\n\n[{*.ts,*.tsx,*.js,*.jsx,*.css,*.scss}]\ninsert_final_newline = true\n\n[{package.json,package-lock.json,manifest.json}]\nindent_size = 2\n\n[*.yml]\nindent_size = 2\n"},{"path":[".eslintrc.json"],"content":"{\n \"root\": true,\n \"env\": {\n \"node\": true,\n \"browser\": false,\n \"es6\": true\n },\n \"ignorePatterns\": [\"/dist\", \"/models\"],\n \"extends\": [\n \"eslint:recommended\",\n \"plugin:jsdoc/recommended\"\n ],\n \"globals\": {\n \"Atomics\": \"readonly\",\n \"SharedArrayBuffer\": \"readonly\"\n },\n \"parserOptions\": {\n \"ecmaVersion\": 2023,\n \"sourceType\": \"module\"\n },\n \"overrides\": [{\n \"files\": [\"**.ts\"],\n \"extends\": [\n \"eslint:recommended\",\n \"plugin:@typescript-eslint/recommended\",\n \"plugin:jsdoc/recommended-typescript\"\n ],\n \"parser\": \"@typescript-eslint/parser\",\n \"plugins\": [\n \"@typescript-eslint\",\n \"import\",\n \"jsdoc\",\n \"n\"\n ],\n \"rules\": {\n \"@typescript-eslint/explicit-module-boundary-types\": [\"off\"],\n \"@typescript-eslint/ban-ts-comment\": [\"off\"],\n \"@typescript-eslint/no-explicit-any\": [\"off\"],\n \"semi\": [\"off\"],\n \"@typescript-eslint/semi\": [\"warn\", \"always\"],\n \"@typescript-eslint/no-inferrable-types\": [\"off\"],\n \"@typescript-eslint/member-ordering\": [\"warn\", {\n \"default\": [\"field\", \"constructor\", \"method\", \"signature\"],\n \"typeLiterals\": []\n }],\n \"@typescript-eslint/parameter-properties\": [\"warn\", {\n \"allow\": []\n }],\n \"@typescript-eslint/explicit-member-accessibility\": [\"warn\"],\n \"@typescript-eslint/member-delimiter-style\": [\"warn\", {\n \"multiline\": {\n \"delimiter\": \"comma\",\n \"requireLast\": false\n },\n \"singleline\": {\n \"delimiter\": \"comma\",\n \"requireLast\": false\n },\n \"multilineDetection\": \"brackets\"\n }],\n \"jsdoc/require-param\": [\"off\"],\n \"jsdoc/check-param-names\": [\"warn\", {\n \"checkDestructured\": false\n }],\n \"jsdoc/require-returns\": [\"off\"],\n \"jsdoc/require-jsdoc\": [\"off\"],\n \"jsdoc/require-yields\": [\"off\"],\n \"jsdoc/require-param-description\": [\"off\"]\n }\n }],\n \"plugins\": [\n \"@typescript-eslint\",\n \"import\",\n \"jsdoc\",\n \"n\"\n ],\n \"settings\": {\n \"import/parsers\": {\n \"@typescript-eslint/parser\": [\".ts\"]\n },\n \"jsdoc\": {\n \"exemptDestructuredRootsFromChecks\": true,\n \"tagNamePreference\": {\n \"hidden\": \"hidden\"\n }\n }\n },\n \"rules\": {\n \"indent\": [\"warn\", 4, {\n \"SwitchCase\": 1,\n \"FunctionDeclaration\": {\n \"parameters\": \"first\"\n }\n }],\n \"eqeqeq\": [\"off\"],\n \"no-undef\": \"off\",\n \"quotes\": [\"warn\", \"double\", { \"avoidEscape\": true }],\n \"no-unused-vars\": [\"warn\", {\n \"args\": \"none\",\n \"ignoreRestSiblings\": true,\n \"varsIgnorePattern\": \"^set\"\n }],\n \"no-prototype-builtins\": [\"off\"],\n \"object-curly-spacing\": [\"warn\", \"never\"],\n \"semi\": [\"warn\", \"always\"],\n \"no-undefined\": [\"off\"],\n \"array-bracket-newline\": [\"error\", \"consistent\"],\n \"brace-style\": [\"error\", \"1tbs\", {\n \"allowSingleLine\": false\n }],\n \"comma-spacing\": [\"error\", {\n \"before\": false,\n \"after\": true\n }],\n \"comma-style\": [\"error\", \"last\"],\n \"comma-dangle\": [\"error\", \"never\"],\n \"no-var\": [\"error\"],\n \"import/order\": [\"error\", {\n \"groups\": [\"builtin\", \"external\",\"internal\", \"parent\", \"sibling\", \"index\", \"type\", \"object\", \"unknown\"],\n \"warnOnUnassignedImports\": true\n }],\n \"n/file-extension-in-import\": [\"error\", \"always\"],\n \"newline-per-chained-call\": [\"error\", {\n \"ignoreChainWithDepth\": 2\n }],\n \"no-confusing-arrow\": [\"error\"],\n \"no-const-assign\": [\"error\"],\n \"no-duplicate-imports\": [\"error\", {\n \"includeExports\": true\n }],\n \"camelcase\": [\"warn\"],\n \"jsx-quotes\": [\"warn\"],\n \"yoda\": [\"error\", \"never\", {\n \"exceptRange\": true\n }],\n \"no-eval\": [\"error\"],\n \"array-callback-return\": [\"error\"],\n \"no-empty\": [\"error\", {\n \"allowEmptyCatch\": true\n }],\n \"keyword-spacing\": [\"warn\"],\n \"space-infix-ops\": [\"warn\"],\n \"spaced-comment\": [\"warn\", \"always\", {\n \"markers\": [\"/\"]\n }],\n \"eol-last\": [\"warn\", \"always\"],\n \"max-len\": [\"warn\", {\n \"code\": 140,\n \"tabWidth\": 4,\n \"ignoreStrings\": true\n }]\n }\n}\n"},{"path":[".gitignore"],"content":"/.idea\n/.vscode\nnode_modules\n.DS_Store\n\n/dist\n/models\n"},{"path":["README.md"],"content":"# Node + TypeScript + `node-llama-cpp`\nThis template provides a minimal setup to get Node working with TypeScript and `node-llama-cpp`, and some ESLint rules.\n\n## Get started\nInstall node modules and download the model files used by `node-llama-cpp`:\n```bash\nnpm install\n```\n\nStart the project:\n```bash\nnpm start\n```\n"},{"path":["package.json"],"content":"{\n \"name\": \"node-llama-cpp-project\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"main\": \"./dist/index.js\",\n \"type\": \"module\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist/\",\n \"package.json\",\n \"README.md\"\n ],\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"node\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"scripts\": {\n \"postinstall\": \"npm run models:pull\",\n \"models:pull\": \"node-llama-cpp pull --dir ./models \\\"{{modelUriOrUrl|escape|escape}}\\\"\",\n \"start\": \"vite-node ./src/index.ts\",\n \"start:build\": \"node ./dist/index.ts\",\n \"prebuild\": \"rimraf ./dist ./tsconfig.tsbuildinfo\",\n \"build\": \"tsc --build tsconfig.json --force\",\n \"lint\": \"npm run lint:eslint\",\n \"lint:eslint\": \"eslint --ext .js --ext .ts --report-unused-disable-directives .\",\n \"format\": \"npm run lint:eslint -- --fix\",\n \"clean\": \"rm -rf ./node_modules ./dist ./tsconfig.tsbuildinfo ./models\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.3.0\",\n \"node-llama-cpp\": \"^{{currentNodeLlamaCppModuleVersion|escape}}\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.5.5\",\n \"@typescript-eslint/eslint-plugin\": \"^7.12.0\",\n \"@typescript-eslint/parser\": \"^7.12.0\",\n \"eslint\": \"^8.46.0\",\n \"eslint-plugin-import\": \"^2.29.1\",\n \"eslint-plugin-jsdoc\": \"^46.9.0\",\n \"eslint-plugin-n\": \"^17.8.1\",\n \"rimraf\": \"^6.0.1\",\n \"tslib\": \"^2.7.0\",\n \"typescript\": \"^5.6.2\",\n \"vite-node\": \"^2.1.1\"\n }\n}"},{"path":["src","index.ts"],"content":"import {fileURLToPath} from \"url\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport {getLlama, LlamaChatSession, resolveModelFile} from \"node-llama-cpp\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst modelsDirectory = path.join(__dirname, \"..\", \"models\");\n\n\nconst llama = await getLlama();\n\nconsole.log(chalk.yellow(\"Resolving model file...\"));\nconst modelPath = await resolveModelFile(\n \"{{modelUriOrFilename|escape}}\",\n modelsDirectory\n);\n\nconsole.log(chalk.yellow(\"Loading model...\"));\nconst model = await llama.loadModel({modelPath});\n\nconsole.log(chalk.yellow(\"Creating context...\"));\nconst context = await model.createContext();\n\nconst session = new LlamaChatSession({\n contextSequence: context.getSequence()\n});\nconsole.log();\n\n\nconst q1 = \"Hi there, how are you?\";\nconsole.log(chalk.yellow(\"User: \") + q1);\n\nprocess.stdout.write(chalk.yellow(\"AI: \"));\nconst a1 = await session.prompt(q1, {\n onTextChunk(chunk) {\n // stream the response to the console as it's being generated\n process.stdout.write(chunk);\n }\n});\nprocess.stdout.write(\"\\n\");\nconsole.log(chalk.yellow(\"Consolidated AI answer: \") + a1);\nconsole.log();\n\n\nconst q2 = \"Summarize what you said\";\nconsole.log(chalk.yellow(\"User: \") + q2);\n\nconst a2 = await session.prompt(q2);\nconsole.log(chalk.yellow(\"AI: \") + a2);\nconsole.log();\n\n\nconst q3 = \"What are the verbs in this sentence: 'The cat sat on the mat'\";\nconsole.log(chalk.yellow(\"User: \") + q3);\n\n// force the model to respond in accordance to the specified JSON schema format,\n// so we can parse it and use it programmatically\nconst responseGrammar = await llama.createGrammarForJsonSchema({\n type: \"object\",\n properties: {\n verbs: {\n type: \"array\",\n items: {\n type: \"string\"\n }\n }\n }\n});\nconst a3 = await session.prompt(q3, {grammar: responseGrammar});\nconst parsedResponse = responseGrammar.parse(a3);\nconsole.log(chalk.yellow(\"AI:\"), parsedResponse.verbs);\nconsole.log();\n\nif (parsedResponse.verbs.length > 0) {\n const q4 = `Define the verb \"${parsedResponse.verbs[0]}\"`;\n console.log(chalk.yellow(\"User: \") + q4);\n\n const a4 = await session.prompt(q4);\n console.log(chalk.yellow(\"AI: \") + a4);\n console.log();\n} else {\n const q4 = \"Are you sure there are no verbs in the sentence?\";\n console.log(chalk.yellow(\"User: \") + q4);\n\n const a4 = await session.prompt(q4);\n console.log(chalk.yellow(\"AI: \") + a4);\n console.log();\n}\n"},{"path":["tsconfig.json"],"content":"{\n \"compilerOptions\": {\n \"lib\": [\"es2022\"],\n \"module\": \"es2022\",\n \"target\": \"es2022\",\n \"esModuleInterop\": true,\n \"noImplicitAny\": true,\n \"noImplicitReturns\": true,\n \"noImplicitThis\": true,\n \"noImplicitOverride\": true,\n \"removeComments\": false,\n \"allowSyntheticDefaultImports\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"noUncheckedIndexedAccess\": true,\n \"moduleDetection\": \"force\",\n \"skipLibCheck\": true,\n \"moduleResolution\": \"node\",\n \"resolveJsonModule\": false,\n \"strictNullChecks\": true,\n \"isolatedModules\": true,\n \"noEmit\": false,\n \"outDir\": \"./dist\",\n \"strict\": true,\n \"sourceMap\": true,\n \"composite\": false,\n \"declaration\": true\n },\n \"files\": [\n \"./src/index.ts\"\n ],\n \"include\": [\n \"./src\"\n ]\n}\n"}]}
1
+ {"files":[{"path":[".editorconfig"],"content":"root = true\n\n[*]\nindent_style = space\nindent_size = 4\n\n[{*.ts,*.tsx,*.js,*.jsx,*.css,*.scss}]\ninsert_final_newline = true\n\n[{package.json,package-lock.json,manifest.json}]\nindent_size = 2\n\n[*.yml]\nindent_size = 2\n"},{"path":[".gitignore"],"content":"/.idea\n/.vscode\nnode_modules\n.DS_Store\n\n/dist\n/models\n"},{"path":["README.md"],"content":"# Node + TypeScript + `node-llama-cpp`\nThis template provides a minimal setup to get Node working with TypeScript and `node-llama-cpp`, and some ESLint rules.\n\n## Get started\nInstall node modules and download the model files used by `node-llama-cpp`:\n```bash\nnpm install\n```\n\nStart the project:\n```bash\nnpm start\n```\n"},{"path":["eslint.config.js"],"content":"// @ts-check\n\nimport importPlugin from \"eslint-plugin-import\";\nimport jsdoc from \"eslint-plugin-jsdoc\";\nimport n from \"eslint-plugin-n\";\nimport tseslint from \"typescript-eslint\";\nimport stylistic from \"@stylistic/eslint-plugin\";\n\n\nexport default tseslint.config({\n ignores: [\"dist/\", \"models/\"]\n}, {\n files: [\"**/**.{,c,m}{js,ts}\"],\n extends: [\n stylistic.configs[\"recommended-flat\"],\n jsdoc.configs[\"flat/recommended\"],\n importPlugin.flatConfigs.recommended\n ],\n plugins: {\n n\n },\n languageOptions: {\n globals: {\n Atomics: \"readonly\",\n SharedArrayBuffer: \"readonly\"\n },\n\n ecmaVersion: 2023,\n sourceType: \"module\"\n },\n settings: {\n \"import/resolver\": {\n typescript: true,\n node: true\n },\n jsdoc: {\n exemptDestructuredRootsFromChecks: true,\n\n tagNamePreference: {\n hidden: \"hidden\"\n }\n }\n },\n rules: {\n \"@stylistic/indent\": [\"off\"],\n \"indent\": [\"warn\", 4, {\n SwitchCase: 1,\n FunctionDeclaration: {\n parameters: \"first\"\n }\n }],\n \"@stylistic/indent-binary-ops\": [\"off\"],\n \"@stylistic/eqeqeq\": [\"off\"],\n \"@stylistic/no-undef\": \"off\",\n \"@stylistic/quotes\": [\"warn\", \"double\", {avoidEscape: true}],\n \"no-unused-vars\": [\"warn\", {\n args: \"none\",\n ignoreRestSiblings: true,\n varsIgnorePattern: \"^set\",\n caughtErrors: \"none\"\n }],\n \"@stylistic/no-prototype-builtins\": [\"off\"],\n \"@stylistic/object-curly-spacing\": [\"warn\", \"never\"],\n \"@stylistic/semi\": [\"warn\", \"always\"],\n \"@stylistic/no-undefined\": [\"off\"],\n \"@stylistic/array-bracket-newline\": [\"error\", \"consistent\"],\n \"@stylistic/brace-style\": [\"error\", \"1tbs\", {\n allowSingleLine: false\n }],\n \"@stylistic/comma-spacing\": [\"error\", {\n before: false,\n after: true\n }],\n \"@stylistic/comma-style\": [\"error\", \"last\"],\n \"@stylistic/comma-dangle\": [\"error\", \"never\"],\n \"no-var\": [\"error\"],\n \"import/order\": [\"error\", {\n groups: [\"builtin\", \"external\", \"internal\", \"parent\", \"sibling\", \"index\", \"type\", \"object\", \"unknown\"],\n warnOnUnassignedImports: true\n }],\n \"n/file-extension-in-import\": [\"error\", \"always\"],\n \"newline-per-chained-call\": [\"error\", {\n ignoreChainWithDepth: 2\n }],\n \"no-confusing-arrow\": [\"error\"],\n \"no-const-assign\": [\"error\"],\n \"no-duplicate-imports\": [\"error\", {\n includeExports: true\n }],\n camelcase: [\"warn\"],\n \"@stylistic/jsx-quotes\": [\"warn\"],\n yoda: [\"error\", \"never\", {\n exceptRange: true\n }],\n \"no-eval\": [\"error\"],\n \"array-callback-return\": [\"error\"],\n \"no-empty\": [\"error\", {\n allowEmptyCatch: true\n }],\n \"@stylistic/keyword-spacing\": [\"warn\"],\n \"@stylistic/space-infix-ops\": [\"warn\"],\n \"@stylistic/spaced-comment\": [\"warn\", \"always\", {\n markers: [\"/\"]\n }],\n \"@stylistic/eol-last\": [\"warn\", \"always\"],\n \"@stylistic/max-len\": [\"warn\", {\n code: 140,\n tabWidth: 4,\n ignoreStrings: true\n }],\n \"@stylistic/quote-props\": [\"off\"],\n \"@stylistic/arrow-parens\": [\"warn\", \"always\"],\n \"@stylistic/no-multiple-empty-lines\": [\"off\"],\n \"@stylistic/operator-linebreak\": [\"off\"],\n \"@stylistic/block-spacing\": [\"warn\", \"never\"],\n \"@stylistic/no-extra-parens\": [\"off\"],\n \"@stylistic/padded-blocks\": [\"warn\"],\n \"@stylistic/multiline-ternary\": [\"off\"],\n \"@stylistic/lines-between-class-members\": [\"warn\", {\n enforce: [\n {blankLine: \"always\", prev: \"method\", next: \"*\"},\n {blankLine: \"always\", prev: \"*\", next: \"method\"}\n ]\n }],\n \"@stylistic/no-trailing-spaces\": [\"warn\"]\n }\n}, {\n files: [\"**/**.{,c,m}ts\"],\n extends: [\n jsdoc.configs[\"flat/recommended-typescript\"],\n ...tseslint.configs.recommended\n ],\n settings: {\n \"import/resolver\": {\n typescript: true,\n node: true\n }\n },\n rules: {\n \"no-constant-condition\": [\"warn\"],\n \"@typescript-eslint/explicit-module-boundary-types\": [\"off\"],\n \"@typescript-eslint/ban-ts-comment\": [\"off\"],\n \"@typescript-eslint/no-explicit-any\": [\"off\"],\n \"@typescript-eslint/no-inferrable-types\": [\"off\"],\n \"@typescript-eslint/no-unused-vars\": [\"warn\", {\n args: \"none\",\n ignoreRestSiblings: true,\n varsIgnorePattern: \"^set\",\n caughtErrors: \"none\"\n }],\n \"@typescript-eslint/no-empty-object-type\": [\"off\"],\n \"@typescript-eslint/member-ordering\": [\"warn\", {\n default: [\"field\", \"constructor\", \"method\", \"signature\"],\n typeLiterals: []\n }],\n \"@typescript-eslint/parameter-properties\": [\"warn\", {\n allow: []\n }],\n \"@typescript-eslint/explicit-member-accessibility\": [\"warn\"],\n \"@stylistic/member-delimiter-style\": [\"warn\", {\n multiline: {\n delimiter: \"comma\",\n requireLast: false\n },\n singleline: {\n delimiter: \"comma\",\n requireLast: false\n },\n multilineDetection: \"brackets\"\n }],\n\n \"jsdoc/require-param\": [\"off\"],\n \"jsdoc/check-param-names\": [\"warn\", {\n checkDestructured: false\n }],\n \"jsdoc/require-returns\": [\"off\"],\n \"jsdoc/require-jsdoc\": [\"off\"],\n \"jsdoc/require-yields\": [\"off\"],\n \"jsdoc/require-param-description\": [\"off\"]\n }\n});\n"},{"path":["package.json"],"content":"{\n \"name\": \"node-llama-cpp-project\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"main\": \"./dist/index.js\",\n \"type\": \"module\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist/\",\n \"package.json\",\n \"README.md\"\n ],\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"node\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"scripts\": {\n \"postinstall\": \"npm run models:pull\",\n \"models:pull\": \"node-llama-cpp pull --dir ./models \\\"{{modelUriOrUrl|escape|escape}}\\\"\",\n \"start\": \"vite-node ./src/index.ts\",\n \"start:build\": \"node ./dist/index.ts\",\n \"prebuild\": \"rimraf ./dist ./tsconfig.tsbuildinfo\",\n \"build\": \"tsc --build tsconfig.json --force\",\n \"lint\": \"npm run lint:eslint\",\n \"lint:eslint\": \"eslint --report-unused-disable-directives .\",\n \"format\": \"npm run lint:eslint -- --fix\",\n \"clean\": \"rm -rf ./node_modules ./dist ./tsconfig.tsbuildinfo ./models\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.3.0\",\n \"node-llama-cpp\": \"^{{currentNodeLlamaCppModuleVersion|escape}}\"\n },\n \"devDependencies\": {\n \"@stylistic/eslint-plugin\": \"^2.10.0\",\n \"@types/node\": \"^22.8.4\",\n \"eslint\": \"^9.13.0\",\n \"eslint-import-resolver-typescript\": \"^3.6.3\",\n \"eslint-plugin-import\": \"^2.31.0\",\n \"eslint-plugin-jsdoc\": \"^50.4.3\",\n \"eslint-plugin-n\": \"^17.12.0\",\n \"rimraf\": \"^6.0.1\",\n \"tslib\": \"^2.8.0\",\n \"typescript\": \"^5.6.3\",\n \"typescript-eslint\": \"^8.12.2\",\n \"vite-node\": \"^2.1.4\"\n }\n}"},{"path":["src","index.ts"],"content":"import {fileURLToPath} from \"url\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport {getLlama, LlamaChatSession, resolveModelFile} from \"node-llama-cpp\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst modelsDirectory = path.join(__dirname, \"..\", \"models\");\n\n\nconst llama = await getLlama();\n\nconsole.log(chalk.yellow(\"Resolving model file...\"));\nconst modelPath = await resolveModelFile(\n \"{{modelUriOrFilename|escape}}\",\n modelsDirectory\n);\n\nconsole.log(chalk.yellow(\"Loading model...\"));\nconst model = await llama.loadModel({modelPath});\n\nconsole.log(chalk.yellow(\"Creating context...\"));\nconst context = await model.createContext();\n\nconst session = new LlamaChatSession({\n contextSequence: context.getSequence()\n});\nconsole.log();\n\n\nconst q1 = \"Hi there, how are you?\";\nconsole.log(chalk.yellow(\"User: \") + q1);\n\nprocess.stdout.write(chalk.yellow(\"AI: \"));\nconst a1 = await session.prompt(q1, {\n onTextChunk(chunk) {\n // stream the response to the console as it's being generated\n process.stdout.write(chunk);\n }\n});\nprocess.stdout.write(\"\\n\");\nconsole.log(chalk.yellow(\"Consolidated AI answer: \") + a1);\nconsole.log();\n\n\nconst q2 = \"Summarize what you said\";\nconsole.log(chalk.yellow(\"User: \") + q2);\n\nconst a2 = await session.prompt(q2);\nconsole.log(chalk.yellow(\"AI: \") + a2);\nconsole.log();\n\n\nconst q3 = \"What are the verbs in this sentence: 'The cat sat on the mat'\";\nconsole.log(chalk.yellow(\"User: \") + q3);\n\n// force the model to respond in accordance to the specified JSON schema format,\n// so we can parse it and use it programmatically\nconst responseGrammar = await llama.createGrammarForJsonSchema({\n type: \"object\",\n properties: {\n verbs: {\n type: \"array\",\n items: {\n type: \"string\"\n }\n }\n }\n});\nconst a3 = await session.prompt(q3, {grammar: responseGrammar});\nconst parsedResponse = responseGrammar.parse(a3);\nconsole.log(chalk.yellow(\"AI:\"), parsedResponse.verbs);\nconsole.log();\n\nif (parsedResponse.verbs.length > 0) {\n const q4 = `Define the verb \"${parsedResponse.verbs[0]}\"`;\n console.log(chalk.yellow(\"User: \") + q4);\n\n const a4 = await session.prompt(q4);\n console.log(chalk.yellow(\"AI: \") + a4);\n console.log();\n} else {\n const q4 = \"Are you sure there are no verbs in the sentence?\";\n console.log(chalk.yellow(\"User: \") + q4);\n\n const a4 = await session.prompt(q4);\n console.log(chalk.yellow(\"AI: \") + a4);\n console.log();\n}\n"},{"path":["tsconfig.json"],"content":"{\n \"compilerOptions\": {\n \"lib\": [\"es2022\"],\n \"module\": \"es2022\",\n \"target\": \"es2022\",\n \"esModuleInterop\": true,\n \"noImplicitAny\": true,\n \"noImplicitReturns\": true,\n \"noImplicitThis\": true,\n \"noImplicitOverride\": true,\n \"removeComments\": false,\n \"allowSyntheticDefaultImports\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"noUncheckedIndexedAccess\": true,\n \"moduleDetection\": \"force\",\n \"skipLibCheck\": true,\n \"moduleResolution\": \"node\",\n \"resolveJsonModule\": false,\n \"strictNullChecks\": true,\n \"isolatedModules\": true,\n \"noEmit\": false,\n \"outDir\": \"./dist\",\n \"strict\": true,\n \"sourceMap\": true,\n \"composite\": false,\n \"declaration\": true\n },\n \"files\": [\n \"./src/index.ts\"\n ],\n \"include\": [\n \"./src\"\n ]\n}\n"}]}