cui-llama.rn 1.4.3 → 1.4.4

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 (181) hide show
  1. package/README.md +93 -114
  2. package/android/src/main/CMakeLists.txt +5 -0
  3. package/android/src/main/build-arm64/CMakeCache.txt +429 -0
  4. package/android/src/main/build-arm64/CMakeFiles/3.31.4/CMakeCCompiler.cmake +21 -21
  5. package/android/src/main/build-arm64/CMakeFiles/3.31.4/CMakeCXXCompiler.cmake +101 -0
  6. package/android/src/main/build-arm64/CMakeFiles/3.31.4/CMakeDetermineCompilerABI_C.bin +0 -0
  7. package/android/src/main/build-arm64/CMakeFiles/3.31.4/CMakeDetermineCompilerABI_CXX.bin +0 -0
  8. package/android/src/main/build-arm64/CMakeFiles/CMakeConfigureLog.yaml +376 -0
  9. package/android/src/main/build-arm64/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  10. package/android/src/main/build-arm64/CMakeFiles/Makefile.cmake +165 -0
  11. package/android/src/main/build-arm64/CMakeFiles/Makefile2 +297 -0
  12. package/android/src/main/build-arm64/CMakeFiles/Progress/1 +1 -0
  13. package/android/src/main/build-arm64/CMakeFiles/Progress/2 +1 -0
  14. package/android/src/main/build-arm64/CMakeFiles/Progress/3 +1 -0
  15. package/android/src/main/build-arm64/CMakeFiles/Progress/4 +1 -0
  16. package/android/src/main/build-arm64/CMakeFiles/Progress/5 +1 -0
  17. package/android/src/main/build-arm64/CMakeFiles/Progress/6 +1 -0
  18. package/android/src/main/build-arm64/CMakeFiles/Progress/count.txt +1 -0
  19. package/android/src/main/build-arm64/CMakeFiles/TargetDirectories.txt +8 -0
  20. package/android/src/main/build-arm64/CMakeFiles/cmake.check_cache +1 -0
  21. package/android/src/main/build-arm64/CMakeFiles/progress.marks +1 -0
  22. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-alloc.c.o +0 -0
  23. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-alloc.c.o.d +58 -0
  24. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-backend-reg.cpp.o +0 -0
  25. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-backend-reg.cpp.o.d +756 -0
  26. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-backend.cpp.o +0 -0
  27. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-backend.cpp.o.d +709 -0
  28. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-cpu-aarch64.cpp.o +0 -0
  29. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-cpu-aarch64.cpp.o.d +714 -0
  30. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-cpu-quants.c.o +0 -0
  31. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-cpu-quants.c.o.d +62 -0
  32. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-cpu-traits.cpp.o +0 -0
  33. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-cpu-traits.cpp.o.d +708 -0
  34. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-cpu.c.o +0 -0
  35. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-cpu.c.o.d +113 -0
  36. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-cpu.cpp.o +0 -0
  37. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-cpu.cpp.o.d +713 -0
  38. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-opt.cpp.o +0 -0
  39. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-opt.cpp.o.d +763 -0
  40. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-quants.c.o +0 -0
  41. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-quants.c.o.d +61 -0
  42. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-threading.cpp.o +0 -0
  43. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml-threading.cpp.o.d +707 -0
  44. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml.c.o +0 -0
  45. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/ggml.c.o.d +104 -0
  46. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/gguf.cpp.o +0 -0
  47. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/gguf.cpp.o.d +714 -0
  48. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/log.cpp.o +0 -0
  49. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/D_/dev/react-native/cui-llama.rn/cpp/log.cpp.o.d +723 -0
  50. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/DependInfo.cmake +62 -0
  51. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/build.make +722 -0
  52. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/cmake_clean.cmake +89 -0
  53. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/compiler_depend.make +2 -0
  54. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/compiler_depend.ts +2 -0
  55. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/depend.make +2 -0
  56. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/flags.make +17 -0
  57. package/android/src/main/build-arm64/CMakeFiles/rnllama.dir/progress.make +41 -0
  58. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8.dir/DependInfo.cmake +62 -0
  59. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8.dir/build.make +722 -0
  60. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8.dir/cmake_clean.cmake +89 -0
  61. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8.dir/compiler_depend.make +2 -0
  62. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8.dir/compiler_depend.ts +2 -0
  63. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8.dir/depend.make +2 -0
  64. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8.dir/flags.make +17 -0
  65. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8.dir/progress.make +41 -0
  66. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2.dir/DependInfo.cmake +62 -0
  67. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2.dir/build.make +722 -0
  68. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2.dir/cmake_clean.cmake +89 -0
  69. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2.dir/compiler_depend.make +2 -0
  70. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2.dir/compiler_depend.ts +2 -0
  71. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2.dir/depend.make +2 -0
  72. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2.dir/flags.make +17 -0
  73. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2.dir/progress.make +41 -0
  74. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_dotprod.dir/DependInfo.cmake +62 -0
  75. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_dotprod.dir/build.make +722 -0
  76. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_dotprod.dir/cmake_clean.cmake +89 -0
  77. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_dotprod.dir/compiler_depend.make +2 -0
  78. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_dotprod.dir/compiler_depend.ts +2 -0
  79. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_dotprod.dir/depend.make +2 -0
  80. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_dotprod.dir/flags.make +17 -0
  81. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_dotprod.dir/progress.make +41 -0
  82. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_dotprod_i8mm.dir/DependInfo.cmake +62 -0
  83. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_dotprod_i8mm.dir/build.make +722 -0
  84. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_dotprod_i8mm.dir/cmake_clean.cmake +89 -0
  85. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_dotprod_i8mm.dir/compiler_depend.make +2 -0
  86. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_dotprod_i8mm.dir/compiler_depend.ts +2 -0
  87. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_dotprod_i8mm.dir/depend.make +2 -0
  88. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_dotprod_i8mm.dir/flags.make +17 -0
  89. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_dotprod_i8mm.dir/progress.make +41 -0
  90. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_i8mm.dir/DependInfo.cmake +62 -0
  91. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_i8mm.dir/build.make +722 -0
  92. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_i8mm.dir/cmake_clean.cmake +89 -0
  93. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_i8mm.dir/compiler_depend.make +2 -0
  94. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_i8mm.dir/compiler_depend.ts +2 -0
  95. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_i8mm.dir/depend.make +2 -0
  96. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_i8mm.dir/flags.make +17 -0
  97. package/android/src/main/build-arm64/CMakeFiles/rnllama_v8_2_i8mm.dir/progress.make +41 -0
  98. package/android/src/main/build-arm64/Makefile +1862 -0
  99. package/android/src/main/build-arm64/cmake_install.cmake +66 -0
  100. package/android/src/main/java/com/rnllama/LlamaContext.java +91 -17
  101. package/android/src/main/java/com/rnllama/RNLlama.java +37 -4
  102. package/android/src/main/jni-utils.h +6 -0
  103. package/android/src/main/jni.cpp +287 -31
  104. package/android/src/main/jniLibs/arm64-v8a/librnllama.so +0 -0
  105. package/android/src/main/jniLibs/arm64-v8a/librnllama_v8.so +0 -0
  106. package/android/src/main/jniLibs/arm64-v8a/librnllama_v8_2.so +0 -0
  107. package/android/src/main/jniLibs/arm64-v8a/librnllama_v8_2_dotprod.so +0 -0
  108. package/android/src/main/jniLibs/arm64-v8a/librnllama_v8_2_dotprod_i8mm.so +0 -0
  109. package/android/src/main/jniLibs/arm64-v8a/librnllama_v8_2_i8mm.so +0 -0
  110. package/android/src/main/jniLibs/x86_64/librnllama.so +0 -0
  111. package/android/src/main/jniLibs/x86_64/librnllama_x86_64.so +0 -0
  112. package/android/src/newarch/java/com/rnllama/RNLlamaModule.java +7 -2
  113. package/android/src/oldarch/java/com/rnllama/RNLlamaModule.java +7 -2
  114. package/cpp/chat-template.hpp +529 -0
  115. package/cpp/chat.cpp +1085 -0
  116. package/cpp/chat.hpp +55 -0
  117. package/cpp/common.cpp +159 -36
  118. package/cpp/common.h +64 -19
  119. package/cpp/ggml-alloc.c +1 -13
  120. package/cpp/ggml-common.h +0 -2
  121. package/cpp/ggml-cpu-impl.h +6 -12
  122. package/cpp/ggml-cpu-quants.c +937 -340
  123. package/cpp/ggml-cpu.c +207 -113
  124. package/cpp/ggml-cpu.cpp +4 -6
  125. package/cpp/ggml-cpu.h +1 -1
  126. package/cpp/ggml-metal.h +66 -66
  127. package/cpp/ggml-metal.m +141 -23
  128. package/cpp/ggml.c +24 -14
  129. package/cpp/ggml.h +2 -2
  130. package/cpp/json-schema-to-grammar.cpp +46 -66
  131. package/cpp/json-schema-to-grammar.h +15 -1
  132. package/cpp/llama-arch.cpp +7 -2
  133. package/cpp/llama-arch.h +3 -1
  134. package/cpp/llama-chat.cpp +10 -1
  135. package/cpp/llama-chat.h +1 -0
  136. package/cpp/llama-grammar.cpp +86 -6
  137. package/cpp/llama-grammar.h +22 -1
  138. package/cpp/llama-impl.h +6 -6
  139. package/cpp/llama-kv-cache.h +1 -1
  140. package/cpp/llama-mmap.h +1 -0
  141. package/cpp/llama-model-loader.cpp +1 -1
  142. package/cpp/llama-model.cpp +32 -6
  143. package/cpp/llama-sampling.cpp +178 -61
  144. package/cpp/llama-vocab.cpp +8 -3
  145. package/cpp/llama.cpp +188 -128
  146. package/cpp/llama.h +27 -10
  147. package/cpp/log.cpp +32 -10
  148. package/cpp/log.h +12 -1
  149. package/cpp/minja.hpp +2883 -0
  150. package/cpp/rn-llama.cpp +82 -5
  151. package/cpp/rn-llama.h +16 -1
  152. package/cpp/sampling.cpp +68 -41
  153. package/cpp/sampling.h +3 -0
  154. package/cpp/sgemm.cpp +9 -8
  155. package/cpp/unicode.cpp +9 -2
  156. package/ios/CMakeLists.txt +6 -0
  157. package/ios/RNLlama.h +0 -8
  158. package/ios/RNLlama.mm +27 -3
  159. package/ios/RNLlamaContext.h +10 -1
  160. package/ios/RNLlamaContext.mm +269 -57
  161. package/jest/mock.js +21 -2
  162. package/lib/commonjs/NativeRNLlama.js.map +1 -1
  163. package/lib/commonjs/grammar.js +3 -0
  164. package/lib/commonjs/grammar.js.map +1 -1
  165. package/lib/commonjs/index.js +87 -13
  166. package/lib/commonjs/index.js.map +1 -1
  167. package/lib/module/NativeRNLlama.js.map +1 -1
  168. package/lib/module/grammar.js +3 -0
  169. package/lib/module/grammar.js.map +1 -1
  170. package/lib/module/index.js +86 -13
  171. package/lib/module/index.js.map +1 -1
  172. package/lib/typescript/NativeRNLlama.d.ts +107 -2
  173. package/lib/typescript/NativeRNLlama.d.ts.map +1 -1
  174. package/lib/typescript/grammar.d.ts.map +1 -1
  175. package/lib/typescript/index.d.ts +32 -7
  176. package/lib/typescript/index.d.ts.map +1 -1
  177. package/llama-rn.podspec +1 -1
  178. package/package.json +3 -2
  179. package/src/NativeRNLlama.ts +115 -3
  180. package/src/grammar.ts +3 -0
  181. package/src/index.ts +138 -21
package/src/index.ts CHANGED
@@ -14,6 +14,7 @@ import type {
14
14
  NativeEmbeddingParams,
15
15
  NativeCompletionTokenProbItem,
16
16
  NativeCompletionResultTimings,
17
+ JinjaFormattedChatResult,
17
18
  } from './NativeRNLlama'
18
19
  import type {
19
20
  SchemaGrammarConverterPropOrder,
@@ -37,6 +38,9 @@ export type {
37
38
  NativeCompletionResultTimings,
38
39
  RNLlamaMessagePart,
39
40
  RNLlamaOAICompatibleMessage,
41
+ JinjaFormattedChatResult,
42
+
43
+ // Deprecated
40
44
  SchemaGrammarConverterPropOrder,
41
45
  SchemaGrammarConverterBuiltinRule,
42
46
  }
@@ -45,6 +49,7 @@ export { SchemaGrammarConverter, convertJsonSchemaToGrammar }
45
49
 
46
50
  const EVENT_ON_INIT_CONTEXT_PROGRESS = '@RNLlama_onInitContextProgress'
47
51
  const EVENT_ON_TOKEN = '@RNLlama_onToken'
52
+ const EVENT_ON_NATIVE_LOG = '@RNLlama_onNativeLog'
48
53
 
49
54
  let EventEmitter: NativeEventEmitter | DeviceEventEmitterStatic
50
55
  if (Platform.OS === 'ios') {
@@ -55,6 +60,19 @@ if (Platform.OS === 'android') {
55
60
  EventEmitter = DeviceEventEmitter
56
61
  }
57
62
 
63
+ const logListeners: Array<(level: string, text: string) => void> = []
64
+
65
+ // @ts-ignore
66
+ if (EventEmitter) {
67
+ EventEmitter.addListener(
68
+ EVENT_ON_NATIVE_LOG,
69
+ (evt: { level: string; text: string }) => {
70
+ logListeners.forEach((listener) => listener(evt.level, evt.text))
71
+ },
72
+ )
73
+ RNLlama?.toggleNativeLog?.(false) // Trigger unset to use default log callback
74
+ }
75
+
58
76
  export type TokenData = {
59
77
  token: string
60
78
  completion_probabilities?: Array<NativeCompletionTokenProb>
@@ -88,14 +106,31 @@ export type ContextParams = Omit<
88
106
 
89
107
  export type EmbeddingParams = NativeEmbeddingParams
90
108
 
91
- export type CompletionParams = Omit<
92
- NativeCompletionParams,
93
- 'emit_partial_completion' | 'prompt'
94
- > & {
109
+ export type CompletionResponseFormat = {
110
+ type: 'text' | 'json_object' | 'json_schema'
111
+ json_schema?: {
112
+ strict?: boolean
113
+ schema: object
114
+ }
115
+ schema?: object // for json_object type
116
+ }
117
+
118
+ export type CompletionBaseParams = {
95
119
  prompt?: string
96
120
  messages?: RNLlamaOAICompatibleMessage[]
97
- chatTemplate?: string
121
+ chatTemplate?: string // deprecated
122
+ chat_template?: string
123
+ jinja?: boolean
124
+ tools?: object
125
+ parallel_tool_calls?: object
126
+ tool_choice?: string
127
+ response_format?: CompletionResponseFormat
98
128
  }
129
+ export type CompletionParams = Omit<
130
+ NativeCompletionParams,
131
+ 'emit_partial_completion' | 'prompt'
132
+ > &
133
+ CompletionBaseParams
99
134
 
100
135
  export type BenchResult = {
101
136
  modelDesc: string
@@ -107,6 +142,16 @@ export type BenchResult = {
107
142
  tgStd: number
108
143
  }
109
144
 
145
+ const getJsonSchema = (responseFormat?: CompletionResponseFormat) => {
146
+ if (responseFormat?.type === 'json_schema') {
147
+ return responseFormat.json_schema?.schema
148
+ }
149
+ if (responseFormat?.type === 'json_object') {
150
+ return responseFormat.schema || {}
151
+ }
152
+ return null
153
+ }
154
+
110
155
  export class LlamaContext {
111
156
  id: number
112
157
 
@@ -114,9 +159,7 @@ export class LlamaContext {
114
159
 
115
160
  reasonNoGPU: string = ''
116
161
 
117
- model: {
118
- isChatTemplateSupported?: boolean
119
- } = {}
162
+ model: NativeLlamaContext['model']
120
163
 
121
164
  constructor({ contextId, gpu, reasonNoGPU, model }: NativeLlamaContext) {
122
165
  this.id = contextId
@@ -144,27 +187,89 @@ export class LlamaContext {
144
187
  return RNLlama.saveSession(this.id, filepath, options?.tokenSize || -1)
145
188
  }
146
189
 
190
+ isLlamaChatSupported(): boolean {
191
+ return !!this.model.chatTemplates.llamaChat
192
+ }
193
+
194
+ isJinjaSupported(): boolean {
195
+ const { minja } = this.model.chatTemplates
196
+ return !!minja?.toolUse || !!minja?.default
197
+ }
198
+
147
199
  async getFormattedChat(
148
200
  messages: RNLlamaOAICompatibleMessage[],
149
- template?: string,
150
- ): Promise<string> {
201
+ template?: string | null,
202
+ params?: {
203
+ jinja?: boolean
204
+ response_format?: CompletionResponseFormat
205
+ tools?: object
206
+ parallel_tool_calls?: object
207
+ tool_choice?: string
208
+ },
209
+ ): Promise<JinjaFormattedChatResult | string> {
151
210
  const chat = formatChat(messages)
152
- let tmpl = this.model?.isChatTemplateSupported ? undefined : 'chatml'
211
+ const useJinja = this.isJinjaSupported() && params?.jinja
212
+ let tmpl = this.isLlamaChatSupported() || useJinja ? undefined : 'chatml'
153
213
  if (template) tmpl = template // Force replace if provided
154
- return RNLlama.getFormattedChat(this.id, chat, tmpl)
214
+ const jsonSchema = getJsonSchema(params?.response_format)
215
+ return RNLlama.getFormattedChat(this.id, JSON.stringify(chat), tmpl, {
216
+ jinja: useJinja,
217
+ json_schema: jsonSchema ? JSON.stringify(jsonSchema) : undefined,
218
+ tools: params?.tools ? JSON.stringify(params.tools) : undefined,
219
+ parallel_tool_calls: params?.parallel_tool_calls
220
+ ? JSON.stringify(params.parallel_tool_calls)
221
+ : undefined,
222
+ tool_choice: params?.tool_choice,
223
+ })
155
224
  }
156
225
 
157
226
  async completion(
158
227
  params: CompletionParams,
159
228
  callback?: (data: TokenData) => void,
160
229
  ): Promise<NativeCompletionResult> {
161
- let finalPrompt = params.prompt
230
+ const nativeParams = {
231
+ ...params,
232
+ prompt: params.prompt || '',
233
+ emit_partial_completion: !!callback,
234
+ }
162
235
  if (params.messages) {
163
236
  // messages always win
164
- finalPrompt = await this.getFormattedChat(
237
+ const formattedResult = await this.getFormattedChat(
165
238
  params.messages,
166
- params.chatTemplate,
239
+ params.chat_template || params.chatTemplate,
240
+ {
241
+ jinja: params.jinja,
242
+ tools: params.tools,
243
+ parallel_tool_calls: params.parallel_tool_calls,
244
+ tool_choice: params.tool_choice,
245
+ },
167
246
  )
247
+ if (typeof formattedResult === 'string') {
248
+ nativeParams.prompt = formattedResult || ''
249
+ } else {
250
+ nativeParams.prompt = formattedResult.prompt || ''
251
+ if (typeof formattedResult.chat_format === 'number')
252
+ nativeParams.chat_format = formattedResult.chat_format
253
+ if (formattedResult.grammar)
254
+ nativeParams.grammar = formattedResult.grammar
255
+ if (typeof formattedResult.grammar_lazy === 'boolean')
256
+ nativeParams.grammar_lazy = formattedResult.grammar_lazy
257
+ if (formattedResult.grammar_triggers)
258
+ nativeParams.grammar_triggers = formattedResult.grammar_triggers
259
+ if (formattedResult.preserved_tokens)
260
+ nativeParams.preserved_tokens = formattedResult.preserved_tokens
261
+ if (formattedResult.additional_stops) {
262
+ if (!nativeParams.stop) nativeParams.stop = []
263
+ nativeParams.stop.push(...formattedResult.additional_stops)
264
+ }
265
+ }
266
+ } else {
267
+ nativeParams.prompt = params.prompt || ''
268
+ }
269
+
270
+ if (nativeParams.response_format && !nativeParams.grammar) {
271
+ const jsonSchema = getJsonSchema(params.response_format)
272
+ if (jsonSchema) nativeParams.json_schema = JSON.stringify(jsonSchema)
168
273
  }
169
274
 
170
275
  let tokenListener: any =
@@ -175,12 +280,9 @@ export class LlamaContext {
175
280
  callback(tokenResult)
176
281
  })
177
282
 
178
- if (!finalPrompt) throw new Error('Prompt is required')
179
- const promise = RNLlama.completion(this.id, {
180
- ...params,
181
- prompt: finalPrompt,
182
- emit_partial_completion: !!callback,
183
- })
283
+ if (!nativeParams.prompt) throw new Error('Prompt is required')
284
+
285
+ const promise = RNLlama.completion(this.id, nativeParams)
184
286
  return promise
185
287
  .then((completionResult) => {
186
288
  tokenListener?.remove()
@@ -268,6 +370,21 @@ export async function getCpuFeatures() : Promise<NativeCPUFeatures> {
268
370
  return RNLlama.getCpuFeatures()
269
371
  }
270
372
 
373
+ export async function toggleNativeLog(enabled: boolean): Promise<void> {
374
+ return RNLlama.toggleNativeLog(enabled)
375
+ }
376
+
377
+ export function addNativeLogListener(
378
+ listener: (level: string, text: string) => void,
379
+ ): { remove: () => void } {
380
+ logListeners.push(listener)
381
+ return {
382
+ remove: () => {
383
+ logListeners.splice(logListeners.indexOf(listener), 1)
384
+ },
385
+ }
386
+ }
387
+
271
388
  export async function setContextLimit(limit: number): Promise<void> {
272
389
  return RNLlama.setContextLimit(limit)
273
390
  }