node-llama-cpp 2.6.2 → 2.7.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 (96) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/commands/ChatCommand.d.ts +2 -0
  3. package/dist/cli/commands/ChatCommand.js +32 -8
  4. package/dist/cli/commands/ChatCommand.js.map +1 -1
  5. package/dist/cli/commands/ClearCommand.js +1 -1
  6. package/dist/cli/commands/ClearCommand.js.map +1 -1
  7. package/dist/index.d.ts +5 -2
  8. package/dist/index.js +3 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/llamaEvaluator/LlamaChatSession.d.ts +52 -41
  11. package/dist/llamaEvaluator/LlamaChatSession.js +24 -3
  12. package/dist/llamaEvaluator/LlamaChatSession.js.map +1 -1
  13. package/dist/llamaEvaluator/LlamaGrammar.d.ts +2 -0
  14. package/dist/llamaEvaluator/LlamaGrammar.js +5 -0
  15. package/dist/llamaEvaluator/LlamaGrammar.js.map +1 -1
  16. package/dist/llamaEvaluator/LlamaJsonSchemaGrammar.d.ts +7 -0
  17. package/dist/llamaEvaluator/LlamaJsonSchemaGrammar.js +21 -0
  18. package/dist/llamaEvaluator/LlamaJsonSchemaGrammar.js.map +1 -0
  19. package/dist/utils/clearLlamaBuild.js +1 -1
  20. package/dist/utils/clearLlamaBuild.js.map +1 -1
  21. package/dist/utils/clearTempFolder.js +1 -1
  22. package/dist/utils/clearTempFolder.js.map +1 -1
  23. package/dist/utils/cmake.js +19 -2
  24. package/dist/utils/cmake.js.map +1 -1
  25. package/dist/utils/compileLLamaCpp.js +2 -0
  26. package/dist/utils/compileLLamaCpp.js.map +1 -1
  27. package/dist/utils/gbnfJson/GbnfGrammarGenerator.d.ts +5 -0
  28. package/dist/utils/gbnfJson/GbnfGrammarGenerator.js +10 -0
  29. package/dist/utils/gbnfJson/GbnfGrammarGenerator.js.map +1 -0
  30. package/dist/utils/gbnfJson/GbnfTerminal.d.ts +7 -0
  31. package/dist/utils/gbnfJson/GbnfTerminal.js +17 -0
  32. package/dist/utils/gbnfJson/GbnfTerminal.js.map +1 -0
  33. package/dist/utils/gbnfJson/terminals/GbnfArray.d.ts +7 -0
  34. package/dist/utils/gbnfJson/terminals/GbnfArray.js +29 -0
  35. package/dist/utils/gbnfJson/terminals/GbnfArray.js.map +1 -0
  36. package/dist/utils/gbnfJson/terminals/GbnfBoolean.d.ts +6 -0
  37. package/dist/utils/gbnfJson/terminals/GbnfBoolean.js +16 -0
  38. package/dist/utils/gbnfJson/terminals/GbnfBoolean.js.map +1 -0
  39. package/dist/utils/gbnfJson/terminals/GbnfBooleanValue.d.ts +7 -0
  40. package/dist/utils/gbnfJson/terminals/GbnfBooleanValue.js +17 -0
  41. package/dist/utils/gbnfJson/terminals/GbnfBooleanValue.js.map +1 -0
  42. package/dist/utils/gbnfJson/terminals/GbnfGrammar.d.ts +6 -0
  43. package/dist/utils/gbnfJson/terminals/GbnfGrammar.js +16 -0
  44. package/dist/utils/gbnfJson/terminals/GbnfGrammar.js.map +1 -0
  45. package/dist/utils/gbnfJson/terminals/GbnfNull.d.ts +5 -0
  46. package/dist/utils/gbnfJson/terminals/GbnfNull.js +11 -0
  47. package/dist/utils/gbnfJson/terminals/GbnfNull.js.map +1 -0
  48. package/dist/utils/gbnfJson/terminals/GbnfNumber.d.ts +9 -0
  49. package/dist/utils/gbnfJson/terminals/GbnfNumber.js +21 -0
  50. package/dist/utils/gbnfJson/terminals/GbnfNumber.js.map +1 -0
  51. package/dist/utils/gbnfJson/terminals/GbnfNumberValue.d.ts +7 -0
  52. package/dist/utils/gbnfJson/terminals/GbnfNumberValue.js +15 -0
  53. package/dist/utils/gbnfJson/terminals/GbnfNumberValue.js.map +1 -0
  54. package/dist/utils/gbnfJson/terminals/GbnfObjectMap.d.ts +17 -0
  55. package/dist/utils/gbnfJson/terminals/GbnfObjectMap.js +25 -0
  56. package/dist/utils/gbnfJson/terminals/GbnfObjectMap.js.map +1 -0
  57. package/dist/utils/gbnfJson/terminals/GbnfOr.d.ts +8 -0
  58. package/dist/utils/gbnfJson/terminals/GbnfOr.js +30 -0
  59. package/dist/utils/gbnfJson/terminals/GbnfOr.js.map +1 -0
  60. package/dist/utils/gbnfJson/terminals/GbnfString.d.ts +5 -0
  61. package/dist/utils/gbnfJson/terminals/GbnfString.js +15 -0
  62. package/dist/utils/gbnfJson/terminals/GbnfString.js.map +1 -0
  63. package/dist/utils/gbnfJson/terminals/GbnfStringValue.d.ts +6 -0
  64. package/dist/utils/gbnfJson/terminals/GbnfStringValue.js +21 -0
  65. package/dist/utils/gbnfJson/terminals/GbnfStringValue.js.map +1 -0
  66. package/dist/utils/gbnfJson/terminals/GbnfWhitespace.d.ts +9 -0
  67. package/dist/utils/gbnfJson/terminals/GbnfWhitespace.js +20 -0
  68. package/dist/utils/gbnfJson/terminals/GbnfWhitespace.js.map +1 -0
  69. package/dist/utils/gbnfJson/terminals/gbnfConsts.d.ts +14 -0
  70. package/dist/utils/gbnfJson/terminals/gbnfConsts.js +15 -0
  71. package/dist/utils/gbnfJson/terminals/gbnfConsts.js.map +1 -0
  72. package/dist/utils/gbnfJson/types.d.ts +41 -0
  73. package/dist/utils/gbnfJson/types.js +21 -0
  74. package/dist/utils/gbnfJson/types.js.map +1 -0
  75. package/dist/utils/gbnfJson/utils/getGbnfJsonTerminalForGbnfJsonSchema.d.ts +4 -0
  76. package/dist/utils/gbnfJson/utils/getGbnfJsonTerminalForGbnfJsonSchema.js +48 -0
  77. package/dist/utils/gbnfJson/utils/getGbnfJsonTerminalForGbnfJsonSchema.js.map +1 -0
  78. package/dist/utils/gbnfJson/utils/getGbnfJsonTerminalForLiteral.d.ts +5 -0
  79. package/dist/utils/gbnfJson/utils/getGbnfJsonTerminalForLiteral.js +16 -0
  80. package/dist/utils/gbnfJson/utils/getGbnfJsonTerminalForLiteral.js.map +1 -0
  81. package/dist/utils/gbnfJson/utils/validateObjectAgainstGbnfSchema.d.ts +7 -0
  82. package/dist/utils/gbnfJson/utils/validateObjectAgainstGbnfSchema.js +122 -0
  83. package/dist/utils/gbnfJson/utils/validateObjectAgainstGbnfSchema.js.map +1 -0
  84. package/dist/utils/getGbnfGrammarForGbnfJsonSchema.d.ts +2 -0
  85. package/dist/utils/getGbnfGrammarForGbnfJsonSchema.js +23 -0
  86. package/dist/utils/getGbnfGrammarForGbnfJsonSchema.js.map +1 -0
  87. package/llama/CMakeLists.txt +1 -1
  88. package/llama/binariesGithubRelease.json +1 -1
  89. package/llama/gitRelease.bundle +0 -0
  90. package/llamaBins/linux-arm64/llama-addon.node +0 -0
  91. package/llamaBins/linux-armv7l/llama-addon.node +0 -0
  92. package/llamaBins/linux-x64/llama-addon.node +0 -0
  93. package/llamaBins/mac-arm64/llama-addon.node +0 -0
  94. package/llamaBins/mac-x64/llama-addon.node +0 -0
  95. package/llamaBins/win-x64/llama-addon.node +0 -0
  96. package/package.json +9 -4
@@ -0,0 +1,21 @@
1
+ export function isGbnfJsonConstSchema(schema) {
2
+ return schema.const !== undefined;
3
+ }
4
+ export function isGbnfJsonEnumSchema(schema) {
5
+ return schema.enum != null;
6
+ }
7
+ export function isGbnfJsonOneOfSchema(schema) {
8
+ return schema.oneOf != null;
9
+ }
10
+ export function isGbnfJsonObjectSchema(schema) {
11
+ return schema.type === "object";
12
+ }
13
+ export function isGbnfJsonArraySchema(schema) {
14
+ return schema.type === "array";
15
+ }
16
+ export function isGbnfJsonBasicSchemaIncludesType(schema, type) {
17
+ if (schema.type instanceof Array)
18
+ return schema.type.includes(type);
19
+ return schema.type === type;
20
+ }
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/gbnfJson/types.ts"],"names":[],"mappings":"AAqEA,MAAM,UAAU,qBAAqB,CAAC,MAAsB;IACxD,OAAQ,MAA8B,CAAC,KAAK,KAAK,SAAS,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAsB;IACvD,OAAQ,MAA6B,CAAC,IAAI,IAAI,IAAI,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAsB;IACxD,OAAQ,MAA8B,CAAC,KAAK,IAAI,IAAI,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAsB;IACzD,OAAQ,MAA+B,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAsB;IACxD,OAAQ,MAA8B,CAAC,IAAI,KAAK,OAAO,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC7C,MAA2B,EAAE,IAAO;IAEpC,IAAI,MAAM,CAAC,IAAI,YAAY,KAAK;QAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEtC,OAAO,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC;AAChC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { GbnfTerminal } from "../GbnfTerminal.js";
2
+ import { GbnfGrammarGenerator } from "../GbnfGrammarGenerator.js";
3
+ import { GbnfJsonSchema } from "../types.js";
4
+ export declare function getGbnfJsonTerminalForGbnfJsonSchema(schema: GbnfJsonSchema, grammarGenerator: GbnfGrammarGenerator): GbnfTerminal;
@@ -0,0 +1,48 @@
1
+ import { GbnfOr } from "../terminals/GbnfOr.js";
2
+ import { GbnfObjectMap } from "../terminals/GbnfObjectMap.js";
3
+ import { GbnfStringValue } from "../terminals/GbnfStringValue.js";
4
+ import { GbnfArray } from "../terminals/GbnfArray.js";
5
+ import { GbnfString } from "../terminals/GbnfString.js";
6
+ import { GbnfNumber } from "../terminals/GbnfNumber.js";
7
+ import { GbnfBoolean } from "../terminals/GbnfBoolean.js";
8
+ import { GbnfNull } from "../terminals/GbnfNull.js";
9
+ import { isGbnfJsonArraySchema, isGbnfJsonBasicSchemaIncludesType, isGbnfJsonConstSchema, isGbnfJsonEnumSchema, isGbnfJsonObjectSchema, isGbnfJsonOneOfSchema } from "../types.js";
10
+ import { getGbnfJsonTerminalForLiteral } from "./getGbnfJsonTerminalForLiteral.js";
11
+ export function getGbnfJsonTerminalForGbnfJsonSchema(schema, grammarGenerator) {
12
+ if (isGbnfJsonOneOfSchema(schema)) {
13
+ const values = schema.oneOf
14
+ .map((altSchema) => getGbnfJsonTerminalForGbnfJsonSchema(altSchema, grammarGenerator));
15
+ return new GbnfOr(values);
16
+ }
17
+ else if (isGbnfJsonConstSchema(schema)) {
18
+ return getGbnfJsonTerminalForLiteral(schema.const);
19
+ }
20
+ else if (isGbnfJsonEnumSchema(schema)) {
21
+ return new GbnfOr(schema.enum.map((item) => getGbnfJsonTerminalForLiteral(item)));
22
+ }
23
+ else if (isGbnfJsonObjectSchema(schema)) {
24
+ return new GbnfObjectMap(Object.entries(schema.properties).map(([propName, propSchema]) => {
25
+ return {
26
+ required: true,
27
+ key: new GbnfStringValue(propName),
28
+ value: getGbnfJsonTerminalForGbnfJsonSchema(propSchema, grammarGenerator)
29
+ };
30
+ }));
31
+ }
32
+ else if (isGbnfJsonArraySchema(schema)) {
33
+ return new GbnfArray(getGbnfJsonTerminalForGbnfJsonSchema(schema.items, grammarGenerator));
34
+ }
35
+ const terminals = [];
36
+ if (isGbnfJsonBasicSchemaIncludesType(schema, "string"))
37
+ terminals.push(new GbnfString());
38
+ if (isGbnfJsonBasicSchemaIncludesType(schema, "number"))
39
+ terminals.push(new GbnfNumber({ allowFractional: true }));
40
+ if (isGbnfJsonBasicSchemaIncludesType(schema, "integer"))
41
+ terminals.push(new GbnfNumber({ allowFractional: false }));
42
+ if (isGbnfJsonBasicSchemaIncludesType(schema, "boolean"))
43
+ terminals.push(new GbnfBoolean());
44
+ if (isGbnfJsonBasicSchemaIncludesType(schema, "null"))
45
+ terminals.push(new GbnfNull());
46
+ return new GbnfOr(terminals);
47
+ }
48
+ //# sourceMappingURL=getGbnfJsonTerminalForGbnfJsonSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getGbnfJsonTerminalForGbnfJsonSchema.js","sourceRoot":"","sources":["../../../../src/utils/gbnfJson/utils/getGbnfJsonTerminalForGbnfJsonSchema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { GbnfNull } from "../terminals/GbnfNull.js";
2
+ import { GbnfBooleanValue } from "../terminals/GbnfBooleanValue.js";
3
+ import { GbnfNumberValue } from "../terminals/GbnfNumberValue.js";
4
+ import { GbnfStringValue } from "../terminals/GbnfStringValue.js";
5
+ export declare function getGbnfJsonTerminalForLiteral(literal: string | number | boolean | null): GbnfStringValue | GbnfNull | GbnfBooleanValue | GbnfNumberValue;
@@ -0,0 +1,16 @@
1
+ import { GbnfNull } from "../terminals/GbnfNull.js";
2
+ import { GbnfBooleanValue } from "../terminals/GbnfBooleanValue.js";
3
+ import { GbnfNumberValue } from "../terminals/GbnfNumberValue.js";
4
+ import { GbnfStringValue } from "../terminals/GbnfStringValue.js";
5
+ export function getGbnfJsonTerminalForLiteral(literal) {
6
+ if (literal === null)
7
+ return new GbnfNull();
8
+ if (typeof literal === "boolean")
9
+ return new GbnfBooleanValue(literal);
10
+ if (typeof literal === "number")
11
+ return new GbnfNumberValue(literal);
12
+ if (typeof literal === "string")
13
+ return new GbnfStringValue(literal);
14
+ throw new Error(`Unrecognized literal type: ${typeof literal}`);
15
+ }
16
+ //# sourceMappingURL=getGbnfJsonTerminalForLiteral.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getGbnfJsonTerminalForLiteral.js","sourceRoot":"","sources":["../../../../src/utils/gbnfJson/utils/getGbnfJsonTerminalForLiteral.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAC,gBAAgB,EAAC,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAC,eAAe,EAAC,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAC,eAAe,EAAC,MAAM,iCAAiC,CAAC;AAGhE,MAAM,UAAU,6BAA6B,CAAC,OAAyC;IACnF,IAAI,OAAO,KAAK,IAAI;QAChB,OAAO,IAAI,QAAQ,EAAE,CAAC;IAE1B,IAAI,OAAO,OAAO,KAAK,SAAS;QAC5B,OAAO,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAEzC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IAExC,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,OAAO,EAAE,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { GbnfJsonSchema, GbnfJsonSchemaToType } from "../types.js";
2
+ export declare function validateObjectAgainstGbnfSchema<T extends GbnfJsonSchema>(object: any, schema: T): object is GbnfJsonSchemaToType<T>;
3
+ export declare class LlamaJsonSchemaValidationError extends Error {
4
+ readonly object: any;
5
+ readonly schema: GbnfJsonSchema;
6
+ constructor(message: string, object: any, schema: GbnfJsonSchema);
7
+ }
@@ -0,0 +1,122 @@
1
+ import { isGbnfJsonArraySchema, isGbnfJsonConstSchema, isGbnfJsonEnumSchema, isGbnfJsonObjectSchema, isGbnfJsonOneOfSchema } from "../types.js";
2
+ export function validateObjectAgainstGbnfSchema(object, schema) {
3
+ try {
4
+ return validateObjectWithGbnfSchema(object, schema);
5
+ }
6
+ catch (err) {
7
+ if (err instanceof TechnicalValidationError)
8
+ throw new LlamaJsonSchemaValidationError(err.message, object, schema);
9
+ throw err;
10
+ }
11
+ }
12
+ export class LlamaJsonSchemaValidationError extends Error {
13
+ object;
14
+ schema;
15
+ constructor(message, object, schema) {
16
+ super(message);
17
+ this.object = object;
18
+ this.schema = schema;
19
+ }
20
+ }
21
+ class TechnicalValidationError extends Error {
22
+ constructor(message) {
23
+ super(message);
24
+ }
25
+ }
26
+ function validateObjectWithGbnfSchema(object, schema) {
27
+ if (isGbnfJsonArraySchema(schema))
28
+ return validateArray(object, schema);
29
+ else if (isGbnfJsonObjectSchema(schema))
30
+ return validateObject(object, schema);
31
+ else if (isGbnfJsonOneOfSchema(schema))
32
+ return validateOneOf(object, schema);
33
+ else if (isGbnfJsonEnumSchema(schema))
34
+ return validateEnum(object, schema);
35
+ else if (isGbnfJsonConstSchema(schema))
36
+ return validateConst(object, schema);
37
+ if (schema.type instanceof Array) {
38
+ for (const type of schema.type) {
39
+ if (validateImmutableType(object, type))
40
+ return true;
41
+ }
42
+ throw new Error(`Expected one of ${schema.type.join(", ")} but got "${typeof object}"`);
43
+ }
44
+ if (validateImmutableType(object, schema.type))
45
+ return true;
46
+ throw new Error(`Expected "${schema.type}" but got "${typeof object}"`);
47
+ }
48
+ function validateArray(object, schema) {
49
+ if (!(object instanceof Array))
50
+ throw new TechnicalValidationError(`Expected an array but got "${typeof object}"`);
51
+ let res = true;
52
+ for (const item of object)
53
+ res &&= validateObjectWithGbnfSchema(item, schema.items);
54
+ return res;
55
+ }
56
+ function validateObject(object, schema) {
57
+ if (typeof object !== "object" || object === null)
58
+ throw new TechnicalValidationError(`Expected an object but got "${typeof object}"`);
59
+ const objectKeys = Object.keys(object);
60
+ const objectKeysSet = new Set(objectKeys);
61
+ const schemaKeys = Object.keys(schema.properties);
62
+ const schemaKeysSet = new Set(schemaKeys);
63
+ const extraKeys = objectKeys.filter((key) => !schemaKeysSet.has(key));
64
+ if (extraKeys.length > 0)
65
+ throw new TechnicalValidationError(`Unexpected keys: ${extraKeys.map((key) => JSON.stringify(key)).join(", ")}`);
66
+ const missingKeys = schemaKeys.filter((key) => !objectKeysSet.has(key));
67
+ if (missingKeys.length > 0)
68
+ throw new TechnicalValidationError(`Missing keys: ${extraKeys.map((key) => JSON.stringify(key)).join(", ")}`);
69
+ let res = true;
70
+ for (const key of schemaKeys)
71
+ res &&= validateObjectWithGbnfSchema(object[key], schema.properties[key]);
72
+ return res;
73
+ }
74
+ function validateOneOf(object, schema) {
75
+ for (const item of schema.oneOf) {
76
+ try {
77
+ return validateObjectWithGbnfSchema(object, item);
78
+ }
79
+ catch (err) {
80
+ if (err instanceof TechnicalValidationError)
81
+ continue;
82
+ throw err;
83
+ }
84
+ }
85
+ throw new TechnicalValidationError(`Expected one of ${schema.oneOf.length} schemas but got ${JSON.stringify(object)}`);
86
+ }
87
+ function validateEnum(object, schema) {
88
+ for (const value of schema.enum) {
89
+ if (object === value)
90
+ return true;
91
+ }
92
+ throw new TechnicalValidationError(`Expected one of ${schema.enum.map((item) => JSON.stringify(item)).join(", ")} but got ${JSON.stringify(object)}`);
93
+ }
94
+ function validateConst(object, schema) {
95
+ if (object === schema.const)
96
+ return true;
97
+ throw new TechnicalValidationError(`Expected ${JSON.stringify(schema.const)} but got ${JSON.stringify(object)}`);
98
+ }
99
+ function validateImmutableType(value, type) {
100
+ if (type === "string") {
101
+ return typeof value === "string";
102
+ }
103
+ else if (type === "number") {
104
+ return typeof value === "number";
105
+ }
106
+ else if (type === "integer") {
107
+ if (typeof value !== "number")
108
+ return false;
109
+ return value % 1 === 0;
110
+ }
111
+ else if (type === "boolean") {
112
+ return typeof value === "boolean";
113
+ }
114
+ else if (type === "null") {
115
+ return value === null;
116
+ }
117
+ else {
118
+ void (type);
119
+ }
120
+ throw new TechnicalValidationError(`Unknown immutable type ${JSON.stringify(type)}`);
121
+ }
122
+ //# sourceMappingURL=validateObjectAgainstGbnfSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateObjectAgainstGbnfSchema.js","sourceRoot":"","sources":["../../../../src/utils/gbnfJson/utils/validateObjectAgainstGbnfSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAEgD,qBAAqB,EAAE,qBAAqB,EAAE,oBAAoB,EACrH,sBAAsB,EAAE,qBAAqB,EAChD,MAAM,aAAa,CAAC;AAGrB,MAAM,UAAU,+BAA+B,CAA2B,MAAW,EAAE,MAAS;IAC5F,IAAI;QACA,OAAO,4BAA4B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACvD;IAAC,OAAO,GAAG,EAAE;QACV,IAAI,GAAG,YAAY,wBAAwB;YACvC,MAAM,IAAI,8BAA8B,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAE1E,MAAM,GAAG,CAAC;KACb;AACL,CAAC;AAED,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACrC,MAAM,CAAM;IACZ,MAAM,CAAiB;IAEvC,YAAmB,OAAe,EAAE,MAAW,EAAE,MAAsB;QACnE,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;CACJ;AAED,MAAM,wBAAyB,SAAQ,KAAK;IACxC,YAAmB,OAAe;QAC9B,KAAK,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;CACJ;AAED,SAAS,4BAA4B,CAA2B,MAAW,EAAE,MAAS;IAClF,IAAI,qBAAqB,CAAC,MAAM,CAAC;QAC7B,OAAO,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACpC,IAAI,sBAAsB,CAAC,MAAM,CAAC;QACnC,OAAO,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACrC,IAAI,qBAAqB,CAAC,MAAM,CAAC;QAClC,OAAO,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACpC,IAAI,oBAAoB,CAAC,MAAM,CAAC;QACjC,OAAO,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACnC,IAAI,qBAAqB,CAAC,MAAM,CAAC;QAClC,OAAO,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEzC,IAAI,MAAM,CAAC,IAAI,YAAY,KAAK,EAAE;QAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE;YAC5B,IAAI,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC;gBACnC,OAAO,IAAI,CAAC;SACnB;QAED,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,OAAO,MAAM,GAAG,CAAC,CAAC;KAC3F;IAED,IAAI,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC;QAC1C,OAAO,IAAI,CAAC;IAEhB,MAAM,IAAI,KAAK,CAAC,aAAa,MAAM,CAAC,IAAI,cAAc,OAAO,MAAM,GAAG,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,aAAa,CAAgC,MAAW,EAAE,MAAS;IACxE,IAAI,CAAC,CAAC,MAAM,YAAY,KAAK,CAAC;QAC1B,MAAM,IAAI,wBAAwB,CAAC,8BAA8B,OAAO,MAAM,GAAG,CAAC,CAAC;IAEvF,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,MAAM;QACrB,GAAG,KAAK,4BAA4B,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAE7D,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAiC,MAAW,EAAE,MAAS;IAC1E,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAC7C,MAAM,IAAI,wBAAwB,CAAC,+BAA+B,OAAO,MAAM,GAAG,CAAC,CAAC;IAExF,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAE1C,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACtE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QACpB,MAAM,IAAI,wBAAwB,CAAC,oBAAoB,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAErH,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QACtB,MAAM,IAAI,wBAAwB,CAAC,iBAAiB,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElH,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,UAAU;QACxB,GAAG,KAAK,4BAA4B,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAE9E,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAgC,MAAW,EAAE,MAAS;IACxE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE;QAC7B,IAAI;YACA,OAAO,4BAA4B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;SACrD;QAAC,OAAO,GAAG,EAAE;YACV,IAAI,GAAG,YAAY,wBAAwB;gBACvC,SAAS;YAEb,MAAM,GAAG,CAAC;SACb;KACJ;IAED,MAAM,IAAI,wBAAwB,CAAC,mBAAmB,MAAM,CAAC,KAAK,CAAC,MAAM,oBAAoB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC3H,CAAC;AAED,SAAS,YAAY,CAA+B,MAAW,EAAE,MAAS;IACtE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE;QAC7B,IAAI,MAAM,KAAK,KAAK;YAChB,OAAO,IAAI,CAAC;KACnB;IAED,MAAM,IAAI,wBAAwB,CAAC,mBAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAC7D,YAAY,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,aAAa,CAAgC,MAAW,EAAE,MAAS;IACxE,IAAI,MAAM,KAAK,MAAM,CAAC,KAAK;QACvB,OAAO,IAAI,CAAC;IAEhB,MAAM,IAAI,wBAAwB,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACrH,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAU,EAAE,IAAiC;IACxE,IAAI,IAAI,KAAK,QAAQ,EAAE;QACnB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;KACpC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE;QAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;KACpC;SAAM,IAAI,IAAI,KAAK,SAAS,EAAE;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ;YACzB,OAAO,KAAK,CAAC;QACjB,OAAO,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;KAC1B;SAAM,IAAI,IAAI,KAAK,SAAS,EAAE;QAC3B,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC;KACrC;SAAM,IAAI,IAAI,KAAK,MAAM,EAAE;QACxB,OAAO,KAAK,KAAK,IAAI,CAAC;KACzB;SAAM;QACH,KAAK,CAAC,IAAoB,CAAC,CAAC;KAC/B;IAED,MAAM,IAAI,wBAAwB,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { GbnfJsonSchema } from "./gbnfJson/types.js";
2
+ export declare function getGbnfGrammarForGbnfJsonSchema(schema: GbnfJsonSchema): string;
@@ -0,0 +1,23 @@
1
+ import { getGbnfJsonTerminalForGbnfJsonSchema } from "./gbnfJson/utils/getGbnfJsonTerminalForGbnfJsonSchema.js";
2
+ import { GbnfGrammarGenerator } from "./gbnfJson/GbnfGrammarGenerator.js";
3
+ export function getGbnfGrammarForGbnfJsonSchema(schema) {
4
+ const grammarGenerator = new GbnfGrammarGenerator();
5
+ const rootTerminal = getGbnfJsonTerminalForGbnfJsonSchema(schema, grammarGenerator);
6
+ const rootGrammar = rootTerminal.getGrammar(grammarGenerator);
7
+ const rules = [{
8
+ name: "root",
9
+ grammar: rootGrammar + " [\\n]".repeat(4) + " [\\n]*"
10
+ }];
11
+ for (const [ruleName, grammar] of grammarGenerator.rules.entries()) {
12
+ if (grammar == null)
13
+ continue;
14
+ rules.push({
15
+ name: ruleName,
16
+ grammar
17
+ });
18
+ }
19
+ const ruleStrings = rules.map((rule) => rule.name + " ::= " + rule.grammar);
20
+ const gbnf = ruleStrings.join("\n");
21
+ return gbnf;
22
+ }
23
+ //# sourceMappingURL=getGbnfGrammarForGbnfJsonSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getGbnfGrammarForGbnfJsonSchema.js","sourceRoot":"","sources":["../../src/utils/getGbnfGrammarForGbnfJsonSchema.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,oCAAoC,EAAC,MAAM,0DAA0D,CAAC;AAC9G,OAAO,EAAC,oBAAoB,EAAC,MAAM,oCAAoC,CAAC;AAGxE,MAAM,UAAU,+BAA+B,CAAC,MAAsB;IAClE,MAAM,gBAAgB,GAAG,IAAI,oBAAoB,EAAE,CAAC;IACpD,MAAM,YAAY,GAAG,oCAAoC,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACpF,MAAM,WAAW,GAAG,YAAY,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAE9D,MAAM,KAAK,GAAsC,CAAC;YAC9C,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS;SACxD,CAAC,CAAC;IAEH,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;QAChE,IAAI,OAAO,IAAI,IAAI;YACf,SAAS;QAEb,KAAK,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,QAAQ;YACd,OAAO;SACV,CAAC,CAAC;KACN;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpC,OAAO,IAAI,CAAC;AAChB,CAAC"}
@@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.12)
3
3
  project ("llama-addon")
4
4
 
5
5
  if (MSVC)
6
- add_compile_options(/EHsc)
6
+ # add_compile_options(/EHsc)
7
7
  else()
8
8
  add_compile_options(-fexceptions)
9
9
  endif()
@@ -1,3 +1,3 @@
1
1
  {
2
- "release": "b1357"
2
+ "release": "b1365"
3
3
  }
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "node-llama-cpp",
3
- "version": "2.6.2",
4
- "description": "Run AI models locally on your machine with node.js bindings for llama.cpp",
3
+ "version": "2.7.0",
4
+ "description": "Run AI models locally on your machine with node.js bindings for llama.cpp. Force a JSON schema on the model output on the generation level",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
7
7
  "types": "./dist/index.d.ts",
@@ -47,7 +47,9 @@
47
47
  "prewatch": "rimraf ./dist ./tsconfig.tsbuildinfo",
48
48
  "watch": "tsc --build tsconfig.json --watch --force",
49
49
  "cmake-js-llama": "cd llama && cmake-js",
50
- "test": "npm run test:typescript && npm run lint:eslint",
50
+ "test": "npm run test:typescript && npm run lint:eslint && npm run test:standalone",
51
+ "test:standalone": "vitest run ./test",
52
+ "test:standalone:interactive": "vitest watch ./test",
51
53
  "test:typescript": "tsc --build tsconfig.json --dry --force",
52
54
  "lint": "npm run lint:eslint",
53
55
  "lint:eslint": "eslint --ext .js --ext .ts .",
@@ -79,9 +81,11 @@
79
81
  "cuda",
80
82
  "grammar",
81
83
  "json-grammar",
84
+ "json-schema-grammar",
82
85
  "temperature",
83
86
  "topK",
84
87
  "topP",
88
+ "json-schema",
85
89
  "raspberry-pi",
86
90
  "self-hosted",
87
91
  "local",
@@ -101,7 +105,7 @@
101
105
  "@types/cli-progress": "^3.11.0",
102
106
  "@types/cross-spawn": "^6.0.2",
103
107
  "@types/fs-extra": "^11.0.1",
104
- "@types/node": "^20.4.9",
108
+ "@types/node": "^20.8.4",
105
109
  "@types/uuid": "^9.0.2",
106
110
  "@types/which": "^3.0.0",
107
111
  "@types/yargs": "^17.0.24",
@@ -121,6 +125,7 @@
121
125
  "typedoc-vitepress-theme": "^1.0.0-next.3",
122
126
  "typescript": "^5.1.6",
123
127
  "vitepress": "^1.0.0-rc.20",
128
+ "vitest": "^0.34.6",
124
129
  "zx": "^7.2.3"
125
130
  },
126
131
  "dependencies": {