local-llm-rn 1.0.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 (626) hide show
  1. package/cpp/CMakeLists.txt +285 -0
  2. package/cpp/common/CMakeLists.txt +149 -0
  3. package/cpp/common/arg.cpp +3799 -0
  4. package/cpp/common/arg.h +131 -0
  5. package/cpp/common/base64.hpp +392 -0
  6. package/cpp/common/build-info.cpp.in +4 -0
  7. package/cpp/common/chat-parser-xml-toolcall.cpp +879 -0
  8. package/cpp/common/chat-parser-xml-toolcall.h +45 -0
  9. package/cpp/common/chat-parser.cpp +1649 -0
  10. package/cpp/common/chat-parser.h +133 -0
  11. package/cpp/common/chat-peg-parser.cpp +124 -0
  12. package/cpp/common/chat-peg-parser.h +105 -0
  13. package/cpp/common/chat.cpp +3355 -0
  14. package/cpp/common/chat.h +252 -0
  15. package/cpp/common/common.cpp +1824 -0
  16. package/cpp/common/common.h +930 -0
  17. package/cpp/common/console.cpp +1137 -0
  18. package/cpp/common/console.h +41 -0
  19. package/cpp/common/debug.cpp +167 -0
  20. package/cpp/common/debug.h +43 -0
  21. package/cpp/common/download.cpp +792 -0
  22. package/cpp/common/download.h +84 -0
  23. package/cpp/common/http.h +84 -0
  24. package/cpp/common/jinja/README.md +88 -0
  25. package/cpp/common/jinja/caps.cpp +285 -0
  26. package/cpp/common/jinja/caps.h +30 -0
  27. package/cpp/common/jinja/lexer.cpp +341 -0
  28. package/cpp/common/jinja/lexer.h +157 -0
  29. package/cpp/common/jinja/parser.cpp +591 -0
  30. package/cpp/common/jinja/parser.h +21 -0
  31. package/cpp/common/jinja/runtime.cpp +867 -0
  32. package/cpp/common/jinja/runtime.h +638 -0
  33. package/cpp/common/jinja/string.cpp +213 -0
  34. package/cpp/common/jinja/string.h +61 -0
  35. package/cpp/common/jinja/utils.h +149 -0
  36. package/cpp/common/jinja/value.cpp +1393 -0
  37. package/cpp/common/jinja/value.h +756 -0
  38. package/cpp/common/json-partial.cpp +324 -0
  39. package/cpp/common/json-partial.h +39 -0
  40. package/cpp/common/json-schema-to-grammar.cpp +1153 -0
  41. package/cpp/common/json-schema-to-grammar.h +43 -0
  42. package/cpp/common/llguidance.cpp +258 -0
  43. package/cpp/common/log.cpp +446 -0
  44. package/cpp/common/log.h +119 -0
  45. package/cpp/common/ngram-cache.cpp +285 -0
  46. package/cpp/common/ngram-cache.h +101 -0
  47. package/cpp/common/ngram-map.cpp +530 -0
  48. package/cpp/common/ngram-map.h +115 -0
  49. package/cpp/common/ngram-mod.cpp +60 -0
  50. package/cpp/common/ngram-mod.h +38 -0
  51. package/cpp/common/peg-parser.cpp +1712 -0
  52. package/cpp/common/peg-parser.h +459 -0
  53. package/cpp/common/preset.cpp +483 -0
  54. package/cpp/common/preset.h +83 -0
  55. package/cpp/common/regex-partial.cpp +204 -0
  56. package/cpp/common/regex-partial.h +56 -0
  57. package/cpp/common/sampling.cpp +745 -0
  58. package/cpp/common/sampling.h +119 -0
  59. package/cpp/common/speculative.cpp +1074 -0
  60. package/cpp/common/speculative.h +41 -0
  61. package/cpp/common/unicode.cpp +64 -0
  62. package/cpp/common/unicode.h +22 -0
  63. package/cpp/ggml/CMakeLists.txt +494 -0
  64. package/cpp/ggml/cmake/GitVars.cmake +22 -0
  65. package/cpp/ggml/cmake/common.cmake +50 -0
  66. package/cpp/ggml/cmake/ggml-config.cmake.in +191 -0
  67. package/cpp/ggml/include/ggml-alloc.h +85 -0
  68. package/cpp/ggml/include/ggml-backend.h +373 -0
  69. package/cpp/ggml/include/ggml-blas.h +25 -0
  70. package/cpp/ggml/include/ggml-cann.h +123 -0
  71. package/cpp/ggml/include/ggml-cpp.h +39 -0
  72. package/cpp/ggml/include/ggml-cpu.h +151 -0
  73. package/cpp/ggml/include/ggml-cuda.h +47 -0
  74. package/cpp/ggml/include/ggml-hexagon.h +19 -0
  75. package/cpp/ggml/include/ggml-metal.h +61 -0
  76. package/cpp/ggml/include/ggml-opencl.h +26 -0
  77. package/cpp/ggml/include/ggml-opt.h +256 -0
  78. package/cpp/ggml/include/ggml-rpc.h +30 -0
  79. package/cpp/ggml/include/ggml-sycl.h +49 -0
  80. package/cpp/ggml/include/ggml-virtgpu.h +14 -0
  81. package/cpp/ggml/include/ggml-vulkan.h +29 -0
  82. package/cpp/ggml/include/ggml-webgpu.h +19 -0
  83. package/cpp/ggml/include/ggml-zdnn.h +17 -0
  84. package/cpp/ggml/include/ggml-zendnn.h +22 -0
  85. package/cpp/ggml/include/ggml.h +2753 -0
  86. package/cpp/ggml/include/gguf.h +204 -0
  87. package/cpp/ggml/src/CMakeLists.txt +492 -0
  88. package/cpp/ggml/src/ggml-alloc.c +1244 -0
  89. package/cpp/ggml/src/ggml-backend-dl.cpp +48 -0
  90. package/cpp/ggml/src/ggml-backend-dl.h +45 -0
  91. package/cpp/ggml/src/ggml-backend-impl.h +255 -0
  92. package/cpp/ggml/src/ggml-backend-reg.cpp +566 -0
  93. package/cpp/ggml/src/ggml-backend.cpp +2270 -0
  94. package/cpp/ggml/src/ggml-blas/CMakeLists.txt +101 -0
  95. package/cpp/ggml/src/ggml-blas/ggml-blas.cpp +518 -0
  96. package/cpp/ggml/src/ggml-common.h +1878 -0
  97. package/cpp/ggml/src/ggml-cpu/CMakeLists.txt +691 -0
  98. package/cpp/ggml/src/ggml-cpu/amx/amx.cpp +247 -0
  99. package/cpp/ggml/src/ggml-cpu/amx/amx.h +8 -0
  100. package/cpp/ggml/src/ggml-cpu/amx/common.h +91 -0
  101. package/cpp/ggml/src/ggml-cpu/amx/mmq.cpp +2512 -0
  102. package/cpp/ggml/src/ggml-cpu/amx/mmq.h +10 -0
  103. package/cpp/ggml/src/ggml-cpu/arch/arm/cpu-feats.cpp +98 -0
  104. package/cpp/ggml/src/ggml-cpu/arch/arm/quants.c +4052 -0
  105. package/cpp/ggml/src/ggml-cpu/arch/arm/repack.cpp +4935 -0
  106. package/cpp/ggml/src/ggml-cpu/arch/loongarch/quants.c +2159 -0
  107. package/cpp/ggml/src/ggml-cpu/arch/powerpc/cpu-feats.cpp +82 -0
  108. package/cpp/ggml/src/ggml-cpu/arch/powerpc/quants.c +2305 -0
  109. package/cpp/ggml/src/ggml-cpu/arch/riscv/cpu-feats.cpp +38 -0
  110. package/cpp/ggml/src/ggml-cpu/arch/riscv/quants.c +2726 -0
  111. package/cpp/ggml/src/ggml-cpu/arch/riscv/repack.cpp +342 -0
  112. package/cpp/ggml/src/ggml-cpu/arch/s390/cpu-feats.cpp +50 -0
  113. package/cpp/ggml/src/ggml-cpu/arch/s390/quants.c +1468 -0
  114. package/cpp/ggml/src/ggml-cpu/arch/wasm/quants.c +1221 -0
  115. package/cpp/ggml/src/ggml-cpu/arch/x86/cpu-feats.cpp +327 -0
  116. package/cpp/ggml/src/ggml-cpu/arch/x86/quants.c +3820 -0
  117. package/cpp/ggml/src/ggml-cpu/arch/x86/repack.cpp +6307 -0
  118. package/cpp/ggml/src/ggml-cpu/arch-fallback.h +313 -0
  119. package/cpp/ggml/src/ggml-cpu/binary-ops.cpp +154 -0
  120. package/cpp/ggml/src/ggml-cpu/binary-ops.h +16 -0
  121. package/cpp/ggml/src/ggml-cpu/cmake/FindSIMD.cmake +100 -0
  122. package/cpp/ggml/src/ggml-cpu/common.h +95 -0
  123. package/cpp/ggml/src/ggml-cpu/ggml-cpu-impl.h +529 -0
  124. package/cpp/ggml/src/ggml-cpu/ggml-cpu.c +3734 -0
  125. package/cpp/ggml/src/ggml-cpu/ggml-cpu.cpp +701 -0
  126. package/cpp/ggml/src/ggml-cpu/hbm.cpp +55 -0
  127. package/cpp/ggml/src/ggml-cpu/hbm.h +8 -0
  128. package/cpp/ggml/src/ggml-cpu/kleidiai/kernels.cpp +938 -0
  129. package/cpp/ggml/src/ggml-cpu/kleidiai/kernels.h +90 -0
  130. package/cpp/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp +798 -0
  131. package/cpp/ggml/src/ggml-cpu/kleidiai/kleidiai.h +17 -0
  132. package/cpp/ggml/src/ggml-cpu/llamafile/sgemm.cpp +4033 -0
  133. package/cpp/ggml/src/ggml-cpu/llamafile/sgemm.h +25 -0
  134. package/cpp/ggml/src/ggml-cpu/ops.cpp +10978 -0
  135. package/cpp/ggml/src/ggml-cpu/ops.h +116 -0
  136. package/cpp/ggml/src/ggml-cpu/quants.c +1193 -0
  137. package/cpp/ggml/src/ggml-cpu/quants.h +97 -0
  138. package/cpp/ggml/src/ggml-cpu/repack.cpp +3316 -0
  139. package/cpp/ggml/src/ggml-cpu/repack.h +173 -0
  140. package/cpp/ggml/src/ggml-cpu/simd-gemm.h +136 -0
  141. package/cpp/ggml/src/ggml-cpu/simd-mappings.h +1279 -0
  142. package/cpp/ggml/src/ggml-cpu/spacemit/ime.cpp +1025 -0
  143. package/cpp/ggml/src/ggml-cpu/spacemit/ime.h +13 -0
  144. package/cpp/ggml/src/ggml-cpu/spacemit/ime1_kernels.cpp +3196 -0
  145. package/cpp/ggml/src/ggml-cpu/spacemit/ime_kernels.h +26 -0
  146. package/cpp/ggml/src/ggml-cpu/traits.cpp +36 -0
  147. package/cpp/ggml/src/ggml-cpu/traits.h +38 -0
  148. package/cpp/ggml/src/ggml-cpu/unary-ops.cpp +337 -0
  149. package/cpp/ggml/src/ggml-cpu/unary-ops.h +35 -0
  150. package/cpp/ggml/src/ggml-cpu/vec.cpp +629 -0
  151. package/cpp/ggml/src/ggml-cpu/vec.h +1585 -0
  152. package/cpp/ggml/src/ggml-hexagon/CMakeLists.txt +117 -0
  153. package/cpp/ggml/src/ggml-hexagon/ggml-hexagon.cpp +3232 -0
  154. package/cpp/ggml/src/ggml-hexagon/htp/CMakeLists.txt +45 -0
  155. package/cpp/ggml/src/ggml-hexagon/htp/act-ops.c +815 -0
  156. package/cpp/ggml/src/ggml-hexagon/htp/argsort-ops.c +281 -0
  157. package/cpp/ggml/src/ggml-hexagon/htp/binary-ops.c +827 -0
  158. package/cpp/ggml/src/ggml-hexagon/htp/cmake-toolchain.cmake +157 -0
  159. package/cpp/ggml/src/ggml-hexagon/htp/cpy-ops.c +251 -0
  160. package/cpp/ggml/src/ggml-hexagon/htp/flash-attn-ops.c +666 -0
  161. package/cpp/ggml/src/ggml-hexagon/htp/get-rows-ops.c +111 -0
  162. package/cpp/ggml/src/ggml-hexagon/htp/hex-dma.c +63 -0
  163. package/cpp/ggml/src/ggml-hexagon/htp/hex-dma.h +182 -0
  164. package/cpp/ggml/src/ggml-hexagon/htp/hex-dump.h +77 -0
  165. package/cpp/ggml/src/ggml-hexagon/htp/hex-fastdiv.h +37 -0
  166. package/cpp/ggml/src/ggml-hexagon/htp/hex-utils.h +51 -0
  167. package/cpp/ggml/src/ggml-hexagon/htp/htp-ctx.h +35 -0
  168. package/cpp/ggml/src/ggml-hexagon/htp/htp-msg.h +154 -0
  169. package/cpp/ggml/src/ggml-hexagon/htp/htp-ops.h +65 -0
  170. package/cpp/ggml/src/ggml-hexagon/htp/htp_iface.idl +16 -0
  171. package/cpp/ggml/src/ggml-hexagon/htp/hvx-arith.h +470 -0
  172. package/cpp/ggml/src/ggml-hexagon/htp/hvx-base.h +173 -0
  173. package/cpp/ggml/src/ggml-hexagon/htp/hvx-copy.h +245 -0
  174. package/cpp/ggml/src/ggml-hexagon/htp/hvx-div.h +116 -0
  175. package/cpp/ggml/src/ggml-hexagon/htp/hvx-dump.h +129 -0
  176. package/cpp/ggml/src/ggml-hexagon/htp/hvx-exp.h +215 -0
  177. package/cpp/ggml/src/ggml-hexagon/htp/hvx-floor.h +100 -0
  178. package/cpp/ggml/src/ggml-hexagon/htp/hvx-inverse.h +176 -0
  179. package/cpp/ggml/src/ggml-hexagon/htp/hvx-reduce.h +266 -0
  180. package/cpp/ggml/src/ggml-hexagon/htp/hvx-scale.h +133 -0
  181. package/cpp/ggml/src/ggml-hexagon/htp/hvx-sigmoid.h +141 -0
  182. package/cpp/ggml/src/ggml-hexagon/htp/hvx-sqrt.h +126 -0
  183. package/cpp/ggml/src/ggml-hexagon/htp/hvx-types.h +36 -0
  184. package/cpp/ggml/src/ggml-hexagon/htp/hvx-utils.h +18 -0
  185. package/cpp/ggml/src/ggml-hexagon/htp/main.c +1150 -0
  186. package/cpp/ggml/src/ggml-hexagon/htp/matmul-ops.c +2595 -0
  187. package/cpp/ggml/src/ggml-hexagon/htp/rope-ops.c +498 -0
  188. package/cpp/ggml/src/ggml-hexagon/htp/set-rows-ops.c +167 -0
  189. package/cpp/ggml/src/ggml-hexagon/htp/softmax-ops.c +421 -0
  190. package/cpp/ggml/src/ggml-hexagon/htp/sum-rows-ops.c +130 -0
  191. package/cpp/ggml/src/ggml-hexagon/htp/unary-ops.c +384 -0
  192. package/cpp/ggml/src/ggml-hexagon/htp/worker-pool.c +293 -0
  193. package/cpp/ggml/src/ggml-hexagon/htp/worker-pool.h +57 -0
  194. package/cpp/ggml/src/ggml-hexagon/htp-drv.cpp +418 -0
  195. package/cpp/ggml/src/ggml-hexagon/htp-drv.h +121 -0
  196. package/cpp/ggml/src/ggml-hexagon/libdl.h +79 -0
  197. package/cpp/ggml/src/ggml-hexagon/libggml-htp.inf +38 -0
  198. package/cpp/ggml/src/ggml-hexagon/op-desc.h +153 -0
  199. package/cpp/ggml/src/ggml-impl.h +724 -0
  200. package/cpp/ggml/src/ggml-metal/CMakeLists.txt +124 -0
  201. package/cpp/ggml/src/ggml-metal/ggml-metal-common.cpp +457 -0
  202. package/cpp/ggml/src/ggml-metal/ggml-metal-common.h +52 -0
  203. package/cpp/ggml/src/ggml-metal/ggml-metal-context.h +41 -0
  204. package/cpp/ggml/src/ggml-metal/ggml-metal-context.m +702 -0
  205. package/cpp/ggml/src/ggml-metal/ggml-metal-device.cpp +1890 -0
  206. package/cpp/ggml/src/ggml-metal/ggml-metal-device.h +290 -0
  207. package/cpp/ggml/src/ggml-metal/ggml-metal-device.m +1749 -0
  208. package/cpp/ggml/src/ggml-metal/ggml-metal-impl.h +1054 -0
  209. package/cpp/ggml/src/ggml-metal/ggml-metal-ops.cpp +4370 -0
  210. package/cpp/ggml/src/ggml-metal/ggml-metal-ops.h +94 -0
  211. package/cpp/ggml/src/ggml-metal/ggml-metal.cpp +937 -0
  212. package/cpp/ggml/src/ggml-metal/ggml-metal.metal +9819 -0
  213. package/cpp/ggml/src/ggml-musa/CMakeLists.txt +125 -0
  214. package/cpp/ggml/src/ggml-musa/mudnn.cu +112 -0
  215. package/cpp/ggml/src/ggml-musa/mudnn.cuh +12 -0
  216. package/cpp/ggml/src/ggml-opencl/CMakeLists.txt +150 -0
  217. package/cpp/ggml/src/ggml-opencl/ggml-opencl.cpp +11553 -0
  218. package/cpp/ggml/src/ggml-opencl/kernels/add.cl +190 -0
  219. package/cpp/ggml/src/ggml-opencl/kernels/add_id.cl +42 -0
  220. package/cpp/ggml/src/ggml-opencl/kernels/argsort.cl +86 -0
  221. package/cpp/ggml/src/ggml-opencl/kernels/clamp.cl +20 -0
  222. package/cpp/ggml/src/ggml-opencl/kernels/concat.cl +51 -0
  223. package/cpp/ggml/src/ggml-opencl/kernels/conv2d.cl +185 -0
  224. package/cpp/ggml/src/ggml-opencl/kernels/conv2d_f16_f32.cl +176 -0
  225. package/cpp/ggml/src/ggml-opencl/kernels/cpy.cl +184 -0
  226. package/cpp/ggml/src/ggml-opencl/kernels/cvt.cl +417 -0
  227. package/cpp/ggml/src/ggml-opencl/kernels/diag_mask_inf.cl +58 -0
  228. package/cpp/ggml/src/ggml-opencl/kernels/div.cl +138 -0
  229. package/cpp/ggml/src/ggml-opencl/kernels/embed_kernel.py +26 -0
  230. package/cpp/ggml/src/ggml-opencl/kernels/expm1.cl +113 -0
  231. package/cpp/ggml/src/ggml-opencl/kernels/fill.cl +17 -0
  232. package/cpp/ggml/src/ggml-opencl/kernels/flash_attn_f16.cl +370 -0
  233. package/cpp/ggml/src/ggml-opencl/kernels/flash_attn_f32.cl +371 -0
  234. package/cpp/ggml/src/ggml-opencl/kernels/flash_attn_f32_f16.cl +373 -0
  235. package/cpp/ggml/src/ggml-opencl/kernels/gelu.cl +89 -0
  236. package/cpp/ggml/src/ggml-opencl/kernels/gemm_moe_mxfp4_f32.cl +162 -0
  237. package/cpp/ggml/src/ggml-opencl/kernels/gemv_moe_mxfp4_f32.cl +156 -0
  238. package/cpp/ggml/src/ggml-opencl/kernels/gemv_noshuffle.cl +268 -0
  239. package/cpp/ggml/src/ggml-opencl/kernels/gemv_noshuffle_general.cl +274 -0
  240. package/cpp/ggml/src/ggml-opencl/kernels/gemv_noshuffle_general_q8_0_f32.cl +195 -0
  241. package/cpp/ggml/src/ggml-opencl/kernels/get_rows.cl +187 -0
  242. package/cpp/ggml/src/ggml-opencl/kernels/glu.cl +378 -0
  243. package/cpp/ggml/src/ggml-opencl/kernels/group_norm.cl +121 -0
  244. package/cpp/ggml/src/ggml-opencl/kernels/im2col_f16.cl +57 -0
  245. package/cpp/ggml/src/ggml-opencl/kernels/im2col_f32.cl +57 -0
  246. package/cpp/ggml/src/ggml-opencl/kernels/mean.cl +140 -0
  247. package/cpp/ggml/src/ggml-opencl/kernels/mul.cl +152 -0
  248. package/cpp/ggml/src/ggml-opencl/kernels/mul_mat_Ab_Bi_8x4.cl +139 -0
  249. package/cpp/ggml/src/ggml-opencl/kernels/mul_mat_f16_f32.cl +130 -0
  250. package/cpp/ggml/src/ggml-opencl/kernels/mul_mm_f16_f32_kq_kqv.cl +273 -0
  251. package/cpp/ggml/src/ggml-opencl/kernels/mul_mm_f16_f32_l4_lm.cl +146 -0
  252. package/cpp/ggml/src/ggml-opencl/kernels/mul_mm_f32_f32_l4_lm.cl +147 -0
  253. package/cpp/ggml/src/ggml-opencl/kernels/mul_mm_q4_0_f32_l4_lm.cl +163 -0
  254. package/cpp/ggml/src/ggml-opencl/kernels/mul_mm_q4_1_f32_l4_lm.cl +165 -0
  255. package/cpp/ggml/src/ggml-opencl/kernels/mul_mm_q6_k_f32_l4_lm.cl +158 -0
  256. package/cpp/ggml/src/ggml-opencl/kernels/mul_mm_q8_0_f32_8x4.cl +129 -0
  257. package/cpp/ggml/src/ggml-opencl/kernels/mul_mm_q8_0_f32_l4_lm.cl +154 -0
  258. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_f16_f16.cl +118 -0
  259. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_f16_f32.cl +118 -0
  260. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_f16_f32_1row.cl +94 -0
  261. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_f16_f32_l4.cl +84 -0
  262. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_f32_f32.cl +118 -0
  263. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_id_mxfp4_f32.cl +189 -0
  264. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_id_mxfp4_f32_flat.cl +176 -0
  265. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_id_q4_0_f32_8x_flat.cl +283 -0
  266. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_id_q8_0_f32.cl +140 -0
  267. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_id_q8_0_f32_flat.cl +222 -0
  268. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_mxfp4_f32.cl +144 -0
  269. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_mxfp4_f32_flat.cl +167 -0
  270. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q4_0_f32.cl +192 -0
  271. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q4_0_f32_1d_16x_flat.cl +307 -0
  272. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q4_0_f32_1d_8x_flat.cl +265 -0
  273. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q4_0_f32_8x_flat.cl +272 -0
  274. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q4_0_f32_v.cl +254 -0
  275. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q4_1_f32.cl +219 -0
  276. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q4_1_f32_flat.cl +229 -0
  277. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q4_k_f32.cl +180 -0
  278. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q6_k_f32.cl +194 -0
  279. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q6_k_f32_flat.cl +194 -0
  280. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q8_0_f32.cl +125 -0
  281. package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q8_0_f32_flat.cl +202 -0
  282. package/cpp/ggml/src/ggml-opencl/kernels/norm.cl +161 -0
  283. package/cpp/ggml/src/ggml-opencl/kernels/pad.cl +39 -0
  284. package/cpp/ggml/src/ggml-opencl/kernels/relu.cl +16 -0
  285. package/cpp/ggml/src/ggml-opencl/kernels/repeat.cl +38 -0
  286. package/cpp/ggml/src/ggml-opencl/kernels/rms_norm.cl +190 -0
  287. package/cpp/ggml/src/ggml-opencl/kernels/rope.cl +747 -0
  288. package/cpp/ggml/src/ggml-opencl/kernels/scale.cl +27 -0
  289. package/cpp/ggml/src/ggml-opencl/kernels/set_rows.cl +208 -0
  290. package/cpp/ggml/src/ggml-opencl/kernels/sigmoid.cl +29 -0
  291. package/cpp/ggml/src/ggml-opencl/kernels/silu.cl +30 -0
  292. package/cpp/ggml/src/ggml-opencl/kernels/softmax_4_f16.cl +108 -0
  293. package/cpp/ggml/src/ggml-opencl/kernels/softmax_4_f32.cl +108 -0
  294. package/cpp/ggml/src/ggml-opencl/kernels/softmax_f16.cl +107 -0
  295. package/cpp/ggml/src/ggml-opencl/kernels/softmax_f32.cl +107 -0
  296. package/cpp/ggml/src/ggml-opencl/kernels/softplus.cl +116 -0
  297. package/cpp/ggml/src/ggml-opencl/kernels/solve_tri.cl +51 -0
  298. package/cpp/ggml/src/ggml-opencl/kernels/sqr.cl +53 -0
  299. package/cpp/ggml/src/ggml-opencl/kernels/sqrt.cl +53 -0
  300. package/cpp/ggml/src/ggml-opencl/kernels/ssm_conv.cl +77 -0
  301. package/cpp/ggml/src/ggml-opencl/kernels/sub.cl +138 -0
  302. package/cpp/ggml/src/ggml-opencl/kernels/sum_rows.cl +140 -0
  303. package/cpp/ggml/src/ggml-opencl/kernels/tanh.cl +109 -0
  304. package/cpp/ggml/src/ggml-opencl/kernels/transpose.cl +117 -0
  305. package/cpp/ggml/src/ggml-opencl/kernels/tri.cl +32 -0
  306. package/cpp/ggml/src/ggml-opencl/kernels/tsembd.cl +48 -0
  307. package/cpp/ggml/src/ggml-opencl/kernels/upscale.cl +120 -0
  308. package/cpp/ggml/src/ggml-opt.cpp +1093 -0
  309. package/cpp/ggml/src/ggml-quants.c +5325 -0
  310. package/cpp/ggml/src/ggml-quants.h +106 -0
  311. package/cpp/ggml/src/ggml-rpc/CMakeLists.txt +9 -0
  312. package/cpp/ggml/src/ggml-rpc/ggml-rpc.cpp +2118 -0
  313. package/cpp/ggml/src/ggml-threading.cpp +12 -0
  314. package/cpp/ggml/src/ggml-threading.h +14 -0
  315. package/cpp/ggml/src/ggml-virtgpu/CMakeLists.txt +70 -0
  316. package/cpp/ggml/src/ggml-virtgpu/apir_cs_ggml-rpc-front.cpp +87 -0
  317. package/cpp/ggml/src/ggml-virtgpu/backend/CMakeLists.txt +21 -0
  318. package/cpp/ggml/src/ggml-virtgpu/backend/apir_cs_ggml-rpc-back.cpp +115 -0
  319. package/cpp/ggml/src/ggml-virtgpu/backend/backend-convert.h +13 -0
  320. package/cpp/ggml/src/ggml-virtgpu/backend/backend-dispatched-backend.cpp +102 -0
  321. package/cpp/ggml/src/ggml-virtgpu/backend/backend-dispatched-buffer-type.cpp +105 -0
  322. package/cpp/ggml/src/ggml-virtgpu/backend/backend-dispatched-buffer.cpp +179 -0
  323. package/cpp/ggml/src/ggml-virtgpu/backend/backend-dispatched-device.cpp +148 -0
  324. package/cpp/ggml/src/ggml-virtgpu/backend/backend-dispatched.cpp +51 -0
  325. package/cpp/ggml/src/ggml-virtgpu/backend/backend-dispatched.gen.h +73 -0
  326. package/cpp/ggml/src/ggml-virtgpu/backend/backend-dispatched.h +27 -0
  327. package/cpp/ggml/src/ggml-virtgpu/backend/backend-virgl-apir.h +32 -0
  328. package/cpp/ggml/src/ggml-virtgpu/backend/backend.cpp +144 -0
  329. package/cpp/ggml/src/ggml-virtgpu/backend/shared/api_remoting.h +95 -0
  330. package/cpp/ggml/src/ggml-virtgpu/backend/shared/apir_backend.gen.h +94 -0
  331. package/cpp/ggml/src/ggml-virtgpu/backend/shared/apir_backend.h +50 -0
  332. package/cpp/ggml/src/ggml-virtgpu/backend/shared/apir_cs.h +378 -0
  333. package/cpp/ggml/src/ggml-virtgpu/backend/shared/apir_cs_ggml.h +232 -0
  334. package/cpp/ggml/src/ggml-virtgpu/backend/shared/apir_cs_rpc.h +58 -0
  335. package/cpp/ggml/src/ggml-virtgpu/ggml-backend-buffer-type.cpp +81 -0
  336. package/cpp/ggml/src/ggml-virtgpu/ggml-backend-buffer.cpp +119 -0
  337. package/cpp/ggml/src/ggml-virtgpu/ggml-backend-device.cpp +158 -0
  338. package/cpp/ggml/src/ggml-virtgpu/ggml-backend-reg.cpp +213 -0
  339. package/cpp/ggml/src/ggml-virtgpu/ggml-backend.cpp +69 -0
  340. package/cpp/ggml/src/ggml-virtgpu/ggml-remoting.h +71 -0
  341. package/cpp/ggml/src/ggml-virtgpu/ggmlremoting_functions.yaml +166 -0
  342. package/cpp/ggml/src/ggml-virtgpu/include/apir_hw.h +9 -0
  343. package/cpp/ggml/src/ggml-virtgpu/regenerate_remoting.py +333 -0
  344. package/cpp/ggml/src/ggml-virtgpu/virtgpu-apir.h +15 -0
  345. package/cpp/ggml/src/ggml-virtgpu/virtgpu-forward-backend.cpp +58 -0
  346. package/cpp/ggml/src/ggml-virtgpu/virtgpu-forward-buffer-type.cpp +110 -0
  347. package/cpp/ggml/src/ggml-virtgpu/virtgpu-forward-buffer.cpp +173 -0
  348. package/cpp/ggml/src/ggml-virtgpu/virtgpu-forward-device.cpp +192 -0
  349. package/cpp/ggml/src/ggml-virtgpu/virtgpu-forward-impl.h +36 -0
  350. package/cpp/ggml/src/ggml-virtgpu/virtgpu-forward.gen.h +53 -0
  351. package/cpp/ggml/src/ggml-virtgpu/virtgpu-shm.cpp +98 -0
  352. package/cpp/ggml/src/ggml-virtgpu/virtgpu-shm.h +23 -0
  353. package/cpp/ggml/src/ggml-virtgpu/virtgpu-utils.cpp +179 -0
  354. package/cpp/ggml/src/ggml-virtgpu/virtgpu-utils.h +86 -0
  355. package/cpp/ggml/src/ggml-virtgpu/virtgpu.cpp +544 -0
  356. package/cpp/ggml/src/ggml-virtgpu/virtgpu.h +117 -0
  357. package/cpp/ggml/src/ggml-webgpu/CMakeLists.txt +80 -0
  358. package/cpp/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp +1231 -0
  359. package/cpp/ggml/src/ggml-webgpu/ggml-webgpu.cpp +3150 -0
  360. package/cpp/ggml/src/ggml-webgpu/pre_wgsl.hpp +778 -0
  361. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/argmax.wgsl +72 -0
  362. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/argsort.wgsl +106 -0
  363. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/argsort_merge.wgsl +134 -0
  364. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/binary.wgsl +107 -0
  365. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/common_decls.tmpl +923 -0
  366. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/cpy.tmpl.wgsl +107 -0
  367. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/cumsum.wgsl +66 -0
  368. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/embed_wgsl.py +182 -0
  369. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn.wgsl +636 -0
  370. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/get_rows.wgsl +668 -0
  371. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/glu.tmpl.wgsl +323 -0
  372. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/memset.wgsl +40 -0
  373. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat.wgsl +713 -0
  374. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_decls.tmpl +103 -0
  375. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_reg_tile.wgsl +138 -0
  376. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_subgroup_matrix.wgsl +188 -0
  377. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec.wgsl +194 -0
  378. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/pad.wgsl +86 -0
  379. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/rms_norm.wgsl +123 -0
  380. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/rope.tmpl.wgsl +295 -0
  381. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/scale.wgsl +63 -0
  382. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/set_rows.wgsl +109 -0
  383. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/soft_max.tmpl.wgsl +345 -0
  384. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/sum_rows.wgsl +55 -0
  385. package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl +193 -0
  386. package/cpp/ggml/src/ggml-zdnn/CMakeLists.txt +36 -0
  387. package/cpp/ggml/src/ggml-zdnn/common.hpp +59 -0
  388. package/cpp/ggml/src/ggml-zdnn/ggml-zdnn.cpp +633 -0
  389. package/cpp/ggml/src/ggml-zdnn/mmf.cpp +80 -0
  390. package/cpp/ggml/src/ggml-zdnn/mmf.hpp +12 -0
  391. package/cpp/ggml/src/ggml-zdnn/utils.cpp +79 -0
  392. package/cpp/ggml/src/ggml-zdnn/utils.hpp +19 -0
  393. package/cpp/ggml/src/ggml-zendnn/CMakeLists.txt +92 -0
  394. package/cpp/ggml/src/ggml-zendnn/ggml-zendnn.cpp +469 -0
  395. package/cpp/ggml/src/ggml.c +7669 -0
  396. package/cpp/ggml/src/ggml.cpp +26 -0
  397. package/cpp/ggml/src/gguf.cpp +1699 -0
  398. package/cpp/include/llama-cpp.h +32 -0
  399. package/cpp/include/llama.h +1568 -0
  400. package/cpp/mtmd/CMakeLists.txt +98 -0
  401. package/cpp/mtmd/README.md +63 -0
  402. package/cpp/mtmd/clip-graph.h +117 -0
  403. package/cpp/mtmd/clip-impl.h +586 -0
  404. package/cpp/mtmd/clip-model.h +390 -0
  405. package/cpp/mtmd/clip.cpp +4154 -0
  406. package/cpp/mtmd/clip.h +121 -0
  407. package/cpp/mtmd/deprecation-warning.cpp +22 -0
  408. package/cpp/mtmd/legacy-models/convert_image_encoder_to_gguf.py +412 -0
  409. package/cpp/mtmd/legacy-models/glmedge-convert-image-encoder-to-gguf.py +280 -0
  410. package/cpp/mtmd/legacy-models/glmedge-surgery.py +33 -0
  411. package/cpp/mtmd/legacy-models/llava_surgery.py +38 -0
  412. package/cpp/mtmd/legacy-models/llava_surgery_v2.py +180 -0
  413. package/cpp/mtmd/legacy-models/minicpmv-convert-image-encoder-to-gguf.py +892 -0
  414. package/cpp/mtmd/legacy-models/minicpmv-surgery.py +47 -0
  415. package/cpp/mtmd/models/cogvlm.cpp +98 -0
  416. package/cpp/mtmd/models/conformer.cpp +216 -0
  417. package/cpp/mtmd/models/glm4v.cpp +122 -0
  418. package/cpp/mtmd/models/internvl.cpp +69 -0
  419. package/cpp/mtmd/models/kimik25.cpp +101 -0
  420. package/cpp/mtmd/models/kimivl.cpp +63 -0
  421. package/cpp/mtmd/models/llama4.cpp +96 -0
  422. package/cpp/mtmd/models/llava.cpp +374 -0
  423. package/cpp/mtmd/models/minicpmv.cpp +114 -0
  424. package/cpp/mtmd/models/mobilenetv5.cpp +451 -0
  425. package/cpp/mtmd/models/models.h +128 -0
  426. package/cpp/mtmd/models/nemotron-v2-vl.cpp +35 -0
  427. package/cpp/mtmd/models/paddleocr.cpp +52 -0
  428. package/cpp/mtmd/models/pixtral.cpp +86 -0
  429. package/cpp/mtmd/models/qwen2vl.cpp +183 -0
  430. package/cpp/mtmd/models/qwen3vl.cpp +193 -0
  431. package/cpp/mtmd/models/siglip.cpp +86 -0
  432. package/cpp/mtmd/models/whisper-enc.cpp +115 -0
  433. package/cpp/mtmd/models/youtuvl.cpp +179 -0
  434. package/cpp/mtmd/mtmd-audio.cpp +730 -0
  435. package/cpp/mtmd/mtmd-audio.h +113 -0
  436. package/cpp/mtmd/mtmd-cli.cpp +437 -0
  437. package/cpp/mtmd/mtmd-helper.cpp +521 -0
  438. package/cpp/mtmd/mtmd-helper.h +96 -0
  439. package/cpp/mtmd/mtmd.cpp +1156 -0
  440. package/cpp/mtmd/mtmd.h +319 -0
  441. package/cpp/mtmd/requirements.txt +5 -0
  442. package/cpp/mtmd/test-1.jpeg +0 -0
  443. package/cpp/mtmd/test-2.mp3 +0 -0
  444. package/cpp/mtmd/tests.sh +192 -0
  445. package/cpp/src/CMakeLists.txt +169 -0
  446. package/cpp/src/llama-adapter.cpp +488 -0
  447. package/cpp/src/llama-adapter.h +89 -0
  448. package/cpp/src/llama-arch.cpp +2855 -0
  449. package/cpp/src/llama-arch.h +619 -0
  450. package/cpp/src/llama-batch.cpp +917 -0
  451. package/cpp/src/llama-batch.h +173 -0
  452. package/cpp/src/llama-chat.cpp +896 -0
  453. package/cpp/src/llama-chat.h +71 -0
  454. package/cpp/src/llama-context.cpp +3512 -0
  455. package/cpp/src/llama-context.h +359 -0
  456. package/cpp/src/llama-cparams.cpp +5 -0
  457. package/cpp/src/llama-cparams.h +44 -0
  458. package/cpp/src/llama-grammar.cpp +1464 -0
  459. package/cpp/src/llama-grammar.h +194 -0
  460. package/cpp/src/llama-graph.cpp +2685 -0
  461. package/cpp/src/llama-graph.h +1026 -0
  462. package/cpp/src/llama-hparams.cpp +234 -0
  463. package/cpp/src/llama-hparams.h +339 -0
  464. package/cpp/src/llama-impl.cpp +171 -0
  465. package/cpp/src/llama-impl.h +73 -0
  466. package/cpp/src/llama-io.cpp +15 -0
  467. package/cpp/src/llama-io.h +35 -0
  468. package/cpp/src/llama-kv-cache-iswa.cpp +330 -0
  469. package/cpp/src/llama-kv-cache-iswa.h +137 -0
  470. package/cpp/src/llama-kv-cache.cpp +2271 -0
  471. package/cpp/src/llama-kv-cache.h +388 -0
  472. package/cpp/src/llama-kv-cells.h +533 -0
  473. package/cpp/src/llama-memory-hybrid-iswa.cpp +275 -0
  474. package/cpp/src/llama-memory-hybrid-iswa.h +140 -0
  475. package/cpp/src/llama-memory-hybrid.cpp +268 -0
  476. package/cpp/src/llama-memory-hybrid.h +139 -0
  477. package/cpp/src/llama-memory-recurrent.cpp +1165 -0
  478. package/cpp/src/llama-memory-recurrent.h +182 -0
  479. package/cpp/src/llama-memory.cpp +59 -0
  480. package/cpp/src/llama-memory.h +122 -0
  481. package/cpp/src/llama-mmap.cpp +785 -0
  482. package/cpp/src/llama-mmap.h +92 -0
  483. package/cpp/src/llama-model-loader.cpp +1414 -0
  484. package/cpp/src/llama-model-loader.h +203 -0
  485. package/cpp/src/llama-model-saver.cpp +286 -0
  486. package/cpp/src/llama-model-saver.h +37 -0
  487. package/cpp/src/llama-model.cpp +9253 -0
  488. package/cpp/src/llama-model.h +576 -0
  489. package/cpp/src/llama-quant.cpp +1119 -0
  490. package/cpp/src/llama-quant.h +1 -0
  491. package/cpp/src/llama-sampler.cpp +3885 -0
  492. package/cpp/src/llama-sampler.h +42 -0
  493. package/cpp/src/llama-vocab.cpp +3970 -0
  494. package/cpp/src/llama-vocab.h +187 -0
  495. package/cpp/src/llama.cpp +1313 -0
  496. package/cpp/src/models/afmoe.cpp +191 -0
  497. package/cpp/src/models/apertus.cpp +125 -0
  498. package/cpp/src/models/arcee.cpp +135 -0
  499. package/cpp/src/models/arctic.cpp +138 -0
  500. package/cpp/src/models/arwkv7.cpp +86 -0
  501. package/cpp/src/models/baichuan.cpp +122 -0
  502. package/cpp/src/models/bailingmoe.cpp +144 -0
  503. package/cpp/src/models/bailingmoe2.cpp +135 -0
  504. package/cpp/src/models/bert.cpp +178 -0
  505. package/cpp/src/models/bitnet.cpp +160 -0
  506. package/cpp/src/models/bloom.cpp +101 -0
  507. package/cpp/src/models/chameleon.cpp +178 -0
  508. package/cpp/src/models/chatglm.cpp +132 -0
  509. package/cpp/src/models/codeshell.cpp +111 -0
  510. package/cpp/src/models/cogvlm.cpp +102 -0
  511. package/cpp/src/models/cohere2-iswa.cpp +134 -0
  512. package/cpp/src/models/command-r.cpp +122 -0
  513. package/cpp/src/models/dbrx.cpp +123 -0
  514. package/cpp/src/models/deci.cpp +135 -0
  515. package/cpp/src/models/deepseek.cpp +144 -0
  516. package/cpp/src/models/deepseek2.cpp +262 -0
  517. package/cpp/src/models/delta-net-base.cpp +376 -0
  518. package/cpp/src/models/dots1.cpp +134 -0
  519. package/cpp/src/models/dream.cpp +105 -0
  520. package/cpp/src/models/ernie4-5-moe.cpp +150 -0
  521. package/cpp/src/models/ernie4-5.cpp +110 -0
  522. package/cpp/src/models/eurobert.cpp +97 -0
  523. package/cpp/src/models/exaone-moe.cpp +146 -0
  524. package/cpp/src/models/exaone.cpp +114 -0
  525. package/cpp/src/models/exaone4.cpp +123 -0
  526. package/cpp/src/models/falcon-h1.cpp +111 -0
  527. package/cpp/src/models/falcon.cpp +120 -0
  528. package/cpp/src/models/gemma-embedding.cpp +116 -0
  529. package/cpp/src/models/gemma.cpp +112 -0
  530. package/cpp/src/models/gemma2-iswa.cpp +128 -0
  531. package/cpp/src/models/gemma3.cpp +155 -0
  532. package/cpp/src/models/gemma3n-iswa.cpp +384 -0
  533. package/cpp/src/models/glm4-moe.cpp +170 -0
  534. package/cpp/src/models/glm4.cpp +157 -0
  535. package/cpp/src/models/gpt2.cpp +105 -0
  536. package/cpp/src/models/gptneox.cpp +144 -0
  537. package/cpp/src/models/granite-hybrid.cpp +196 -0
  538. package/cpp/src/models/granite.cpp +211 -0
  539. package/cpp/src/models/grok.cpp +159 -0
  540. package/cpp/src/models/grovemoe.cpp +141 -0
  541. package/cpp/src/models/hunyuan-dense.cpp +132 -0
  542. package/cpp/src/models/hunyuan-moe.cpp +154 -0
  543. package/cpp/src/models/internlm2.cpp +120 -0
  544. package/cpp/src/models/jais.cpp +86 -0
  545. package/cpp/src/models/jais2.cpp +123 -0
  546. package/cpp/src/models/jamba.cpp +106 -0
  547. package/cpp/src/models/kimi-linear.cpp +392 -0
  548. package/cpp/src/models/lfm2.cpp +190 -0
  549. package/cpp/src/models/llada-moe.cpp +122 -0
  550. package/cpp/src/models/llada.cpp +99 -0
  551. package/cpp/src/models/llama-iswa.cpp +178 -0
  552. package/cpp/src/models/llama.cpp +168 -0
  553. package/cpp/src/models/maincoder.cpp +117 -0
  554. package/cpp/src/models/mamba-base.cpp +285 -0
  555. package/cpp/src/models/mamba.cpp +54 -0
  556. package/cpp/src/models/mimo2-iswa.cpp +123 -0
  557. package/cpp/src/models/minicpm3.cpp +200 -0
  558. package/cpp/src/models/minimax-m2.cpp +124 -0
  559. package/cpp/src/models/mistral3.cpp +160 -0
  560. package/cpp/src/models/models.h +684 -0
  561. package/cpp/src/models/modern-bert.cpp +109 -0
  562. package/cpp/src/models/mpt.cpp +126 -0
  563. package/cpp/src/models/nemotron-h.cpp +148 -0
  564. package/cpp/src/models/nemotron.cpp +122 -0
  565. package/cpp/src/models/neo-bert.cpp +104 -0
  566. package/cpp/src/models/olmo.cpp +121 -0
  567. package/cpp/src/models/olmo2.cpp +150 -0
  568. package/cpp/src/models/olmoe.cpp +124 -0
  569. package/cpp/src/models/openai-moe-iswa.cpp +127 -0
  570. package/cpp/src/models/openelm.cpp +124 -0
  571. package/cpp/src/models/orion.cpp +123 -0
  572. package/cpp/src/models/paddleocr.cpp +122 -0
  573. package/cpp/src/models/pangu-embedded.cpp +121 -0
  574. package/cpp/src/models/phi2.cpp +121 -0
  575. package/cpp/src/models/phi3.cpp +152 -0
  576. package/cpp/src/models/plamo.cpp +110 -0
  577. package/cpp/src/models/plamo2.cpp +318 -0
  578. package/cpp/src/models/plamo3.cpp +128 -0
  579. package/cpp/src/models/plm.cpp +169 -0
  580. package/cpp/src/models/qwen.cpp +108 -0
  581. package/cpp/src/models/qwen2.cpp +126 -0
  582. package/cpp/src/models/qwen2moe.cpp +151 -0
  583. package/cpp/src/models/qwen2vl.cpp +117 -0
  584. package/cpp/src/models/qwen3.cpp +117 -0
  585. package/cpp/src/models/qwen35.cpp +386 -0
  586. package/cpp/src/models/qwen35moe.cpp +420 -0
  587. package/cpp/src/models/qwen3moe.cpp +124 -0
  588. package/cpp/src/models/qwen3next.cpp +525 -0
  589. package/cpp/src/models/qwen3vl-moe.cpp +140 -0
  590. package/cpp/src/models/qwen3vl.cpp +132 -0
  591. package/cpp/src/models/refact.cpp +94 -0
  592. package/cpp/src/models/rnd1.cpp +126 -0
  593. package/cpp/src/models/rwkv6-base.cpp +164 -0
  594. package/cpp/src/models/rwkv6.cpp +94 -0
  595. package/cpp/src/models/rwkv6qwen2.cpp +86 -0
  596. package/cpp/src/models/rwkv7-base.cpp +137 -0
  597. package/cpp/src/models/rwkv7.cpp +90 -0
  598. package/cpp/src/models/seed-oss.cpp +124 -0
  599. package/cpp/src/models/smallthinker.cpp +126 -0
  600. package/cpp/src/models/smollm3.cpp +128 -0
  601. package/cpp/src/models/stablelm.cpp +146 -0
  602. package/cpp/src/models/starcoder.cpp +100 -0
  603. package/cpp/src/models/starcoder2.cpp +121 -0
  604. package/cpp/src/models/step35-iswa.cpp +168 -0
  605. package/cpp/src/models/t5-dec.cpp +166 -0
  606. package/cpp/src/models/t5-enc.cpp +96 -0
  607. package/cpp/src/models/wavtokenizer-dec.cpp +149 -0
  608. package/cpp/src/models/xverse.cpp +108 -0
  609. package/cpp/src/unicode-data.cpp +7034 -0
  610. package/cpp/src/unicode-data.h +20 -0
  611. package/cpp/src/unicode.cpp +1103 -0
  612. package/cpp/src/unicode.h +111 -0
  613. package/cpp/vendor/nlohmann/json.hpp +25526 -0
  614. package/cpp/vendor/nlohmann/json_fwd.hpp +187 -0
  615. package/cpp/vendor/stb/stb_image.h +7988 -0
  616. package/ios/LocalLLM-Bridging-Header.h +2 -0
  617. package/ios/LocalLLM.h +5 -0
  618. package/ios/LocalLLM.mm +1267 -0
  619. package/local-llm-rn.podspec +60 -0
  620. package/package.json +35 -0
  621. package/src/NativeLocalLLM.ts +73 -0
  622. package/src/device.ts +50 -0
  623. package/src/download-adapter.ts +17 -0
  624. package/src/index.ts +21 -0
  625. package/src/native-bridge.ts +142 -0
  626. package/src/rn-downloader.ts +37 -0
@@ -0,0 +1,1153 @@
1
+ #include "json-schema-to-grammar.h"
2
+ #include "common.h"
3
+
4
+ #include <nlohmann/json.hpp>
5
+
6
+ #include <algorithm>
7
+ #include <map>
8
+ #include <regex>
9
+ #include <sstream>
10
+ #include <string>
11
+ #include <unordered_map>
12
+ #include <unordered_set>
13
+ #include <vector>
14
+
15
+ using json = nlohmann::ordered_json;
16
+
17
+ static std::string build_repetition(const std::string & item_rule, int min_items, int max_items, const std::string & separator_rule = "") {
18
+ auto has_max = max_items != std::numeric_limits<int>::max();
19
+
20
+ if (max_items == 0) {
21
+ return "";
22
+ }
23
+ if (min_items == 0 && max_items == 1) {
24
+ return item_rule + "?";
25
+ }
26
+
27
+ if (separator_rule.empty()) {
28
+ if (min_items == 1 && !has_max) {
29
+ return item_rule + "+";
30
+ } else if (min_items == 0 && !has_max) {
31
+ return item_rule + "*";
32
+ } else {
33
+ return item_rule + "{" + std::to_string(min_items) + "," + (has_max ? std::to_string(max_items) : "") + "}";
34
+ }
35
+ }
36
+
37
+ auto result = item_rule + " " + build_repetition("(" + separator_rule + " " + item_rule + ")", min_items == 0 ? 0 : min_items - 1, has_max ? max_items - 1 : max_items);
38
+ if (min_items == 0) {
39
+ result = "(" + result + ")?";
40
+ }
41
+ return result;
42
+ }
43
+
44
+ static void _build_min_max_int(int64_t min_value, int64_t max_value, std::stringstream & out, int decimals_left = 16, bool top_level = true) {
45
+ auto has_min = min_value != std::numeric_limits<int64_t>::min();
46
+ auto has_max = max_value != std::numeric_limits<int64_t>::max();
47
+
48
+ auto digit_range = [&](char from, char to) {
49
+ out << "[";
50
+ if (from == to) {
51
+ out << from;
52
+ } else {
53
+ out << from << "-" << to;
54
+ }
55
+ out << "]";
56
+ };
57
+ auto more_digits = [&](int min_digits, int max_digits) {
58
+ out << "[0-9]";
59
+ if (min_digits == max_digits && min_digits == 1) {
60
+ return;
61
+ }
62
+ out << "{";
63
+ out << min_digits;
64
+ if (max_digits != min_digits) {
65
+ out << ",";
66
+ if (max_digits != std::numeric_limits<int>::max()) {
67
+ out << max_digits;
68
+ }
69
+ }
70
+ out << "}";
71
+ };
72
+ std::function<void(const std::string_view &, const std::string_view &)> uniform_range =
73
+ [&](const std::string_view & from, const std::string_view & to) {
74
+ size_t i = 0;
75
+ while (i < from.length() && i < to.length() && from[i] == to[i]) {
76
+ i++;
77
+ }
78
+ if (i > 0) {
79
+ out << "\"" << from.substr(0, i) << "\"";
80
+ }
81
+ if (i < from.length() && i < to.length()) {
82
+ if (i > 0) {
83
+ out << " ";
84
+ }
85
+ auto sub_len = from.length() - i - 1;
86
+ if (sub_len > 0) {
87
+ auto from_sub = from.substr(i + 1);
88
+ auto to_sub = to.substr(i + 1);
89
+ auto sub_zeros = string_repeat("0", sub_len);
90
+ auto sub_nines = string_repeat("9", sub_len);
91
+
92
+ auto to_reached = false;
93
+ out << "(";
94
+ if (from_sub == sub_zeros) {
95
+ digit_range(from[i], to[i] - 1);
96
+ out << " ";
97
+ more_digits(sub_len, sub_len);
98
+ } else {
99
+ out << "[" << from[i] << "] ";
100
+ out << "(";
101
+ uniform_range(from_sub, sub_nines);
102
+ out << ")";
103
+ if (from[i] < to[i] - 1) {
104
+ out << " | ";
105
+ if (to_sub == sub_nines) {
106
+ digit_range(from[i] + 1, to[i]);
107
+ to_reached = true;
108
+ } else {
109
+ digit_range(from[i] + 1, to[i] - 1);
110
+ }
111
+ out << " ";
112
+ more_digits(sub_len, sub_len);
113
+ }
114
+ }
115
+ if (!to_reached) {
116
+ out << " | ";
117
+ digit_range(to[i], to[i]);
118
+ out << " ";
119
+ uniform_range(sub_zeros, to_sub);
120
+ }
121
+ out << ")";
122
+ } else {
123
+ out << "[" << from[i] << "-" << to[i] << "]";
124
+ }
125
+ }
126
+ };
127
+
128
+ if (has_min && has_max) {
129
+ if (min_value < 0 && max_value < 0) {
130
+ out << "\"-\" (";
131
+ _build_min_max_int(-max_value, -min_value, out, decimals_left, /* top_level= */ true);
132
+ out << ")";
133
+ return;
134
+ }
135
+
136
+ if (min_value < 0) {
137
+ out << "\"-\" (";
138
+ _build_min_max_int(0, -min_value, out, decimals_left, /* top_level= */ true);
139
+ out << ") | ";
140
+ min_value = 0;
141
+ }
142
+
143
+ auto min_s = std::to_string(min_value);
144
+ auto max_s = std::to_string(max_value);
145
+ auto min_digits = min_s.length();
146
+ auto max_digits = max_s.length();
147
+
148
+ for (auto digits = min_digits; digits < max_digits; digits++) {
149
+ uniform_range(min_s, string_repeat("9", digits));
150
+ min_s = "1" + string_repeat("0", digits);
151
+ out << " | ";
152
+ }
153
+ uniform_range(min_s, max_s);
154
+ return;
155
+ }
156
+
157
+ auto less_decimals = std::max(decimals_left - 1, 1);
158
+
159
+ if (has_min) {
160
+ if (min_value < 0) {
161
+ out << "\"-\" (";
162
+ _build_min_max_int(std::numeric_limits<int64_t>::min(), -min_value, out, decimals_left, /* top_level= */ false);
163
+ out << ") | [0] | [1-9] ";
164
+ more_digits(0, decimals_left - 1);
165
+ } else if (min_value == 0) {
166
+ if (top_level) {
167
+ out << "[0] | [1-9] ";
168
+ more_digits(0, less_decimals);
169
+ } else {
170
+ more_digits(1, decimals_left);
171
+ }
172
+ } else if (min_value <= 9) {
173
+ char c = '0' + min_value;
174
+ auto range_start = top_level ? '1' : '0';
175
+ if (c > range_start) {
176
+ digit_range(range_start, c - 1);
177
+ out << " ";
178
+ more_digits(1, less_decimals);
179
+ out << " | ";
180
+ }
181
+ digit_range(c, '9');
182
+ out << " ";
183
+ more_digits(0, less_decimals);
184
+ } else {
185
+ auto min_s = std::to_string(min_value);
186
+ auto len = min_s.length();
187
+ auto c = min_s[0];
188
+
189
+ if (c > '1') {
190
+ digit_range(top_level ? '1' : '0', c - 1);
191
+ out << " ";
192
+ more_digits(len, less_decimals);
193
+ out << " | ";
194
+ }
195
+ digit_range(c, c);
196
+ out << " (";
197
+ _build_min_max_int(std::stoll(min_s.substr(1)), std::numeric_limits<int64_t>::max(), out, less_decimals, /* top_level= */ false);
198
+ out << ")";
199
+ if (c < '9') {
200
+ out << " | ";
201
+ digit_range(c + 1, '9');
202
+ out << " ";
203
+ more_digits(len - 1, less_decimals);
204
+ }
205
+ }
206
+ return;
207
+ }
208
+
209
+ if (has_max) {
210
+ if (max_value >= 0) {
211
+ if (top_level) {
212
+ out << "\"-\" [1-9] ";
213
+ more_digits(0, less_decimals);
214
+ out << " | ";
215
+ }
216
+ _build_min_max_int(0, max_value, out, decimals_left, /* top_level= */ true);
217
+ } else {
218
+ out << "\"-\" (";
219
+ _build_min_max_int(-max_value, std::numeric_limits<int64_t>::max(), out, decimals_left, /* top_level= */ false);
220
+ out << ")";
221
+ }
222
+ return;
223
+ }
224
+
225
+ throw std::runtime_error("At least one of min_value or max_value must be set");
226
+ }
227
+
228
+ const std::string SPACE_RULE = "| \" \" | \"\\n\"{1,2} [ \\t]{0,20}";
229
+
230
+ struct BuiltinRule {
231
+ std::string content;
232
+ std::vector<std::string> deps;
233
+ };
234
+
235
+ std::unordered_map<std::string, BuiltinRule> PRIMITIVE_RULES = {
236
+ {"boolean", {"(\"true\" | \"false\") space", {}}},
237
+ {"decimal-part", {"[0-9]{1,16}", {}}},
238
+ {"integral-part", {"[0] | [1-9] [0-9]{0,15}", {}}},
239
+ {"number", {"(\"-\"? integral-part) (\".\" decimal-part)? ([eE] [-+]? integral-part)? space", {"integral-part", "decimal-part"}}},
240
+ {"integer", {"(\"-\"? integral-part) space", {"integral-part"}}},
241
+ {"value", {"object | array | string | number | boolean | null", {"object", "array", "string", "number", "boolean", "null"}}},
242
+ {"object", {"\"{\" space ( string \":\" space value (\",\" space string \":\" space value)* )? \"}\" space", {"string", "value"}}},
243
+ {"array", {"\"[\" space ( value (\",\" space value)* )? \"]\" space", {"value"}}},
244
+ {"uuid", {"\"\\\"\" [0-9a-fA-F]{8} \"-\" [0-9a-fA-F]{4} \"-\" [0-9a-fA-F]{4} \"-\" [0-9a-fA-F]{4} \"-\" [0-9a-fA-F]{12} \"\\\"\" space", {}}},
245
+ {"char", {"[^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})", {}}},
246
+ {"string", {"\"\\\"\" char* \"\\\"\" space", {"char"}}},
247
+ {"null", {"\"null\" space", {}}},
248
+ };
249
+
250
+ std::unordered_map<std::string, BuiltinRule> STRING_FORMAT_RULES = {
251
+ {"date", {"[0-9]{4} \"-\" ( \"0\" [1-9] | \"1\" [0-2] ) \"-\" ( \"0\" [1-9] | [1-2] [0-9] | \"3\" [0-1] )", {}}},
252
+ {"time", {"([01] [0-9] | \"2\" [0-3]) \":\" [0-5] [0-9] \":\" [0-5] [0-9] ( \".\" [0-9]{3} )? ( \"Z\" | ( \"+\" | \"-\" ) ( [01] [0-9] | \"2\" [0-3] ) \":\" [0-5] [0-9] )", {}}},
253
+ {"date-time", {"date \"T\" time", {"date", "time"}}},
254
+ {"date-string", {"\"\\\"\" date \"\\\"\" space", {"date"}}},
255
+ {"time-string", {"\"\\\"\" time \"\\\"\" space", {"time"}}},
256
+ {"date-time-string", {"\"\\\"\" date-time \"\\\"\" space", {"date-time"}}}
257
+ };
258
+
259
+ static bool is_reserved_name(const std::string & name) {
260
+ static const std::unordered_set<std::string> RESERVED_NAMES = [] {
261
+ std::unordered_set<std::string> s;
262
+ s.insert("root");
263
+ for (const auto & p : PRIMITIVE_RULES) s.insert(p.first);
264
+ for (const auto & p : STRING_FORMAT_RULES) s.insert(p.first);
265
+ return s;
266
+ }();
267
+ return RESERVED_NAMES.find(name) != RESERVED_NAMES.end();
268
+ }
269
+
270
+ std::regex INVALID_RULE_CHARS_RE("[^a-zA-Z0-9-]+");
271
+ std::regex GRAMMAR_LITERAL_ESCAPE_RE("[\r\n\"\\\\]");
272
+ std::regex GRAMMAR_RANGE_LITERAL_ESCAPE_RE("[\r\n\"\\]\\-\\\\]");
273
+ std::unordered_map<char, std::string> GRAMMAR_LITERAL_ESCAPES = {
274
+ {'\r', "\\r"}, {'\n', "\\n"}, {'"', "\\\""}, {'-', "\\-"}, {']', "\\]"}, {'\\', "\\\\"}
275
+ };
276
+
277
+ std::unordered_set<char> NON_LITERAL_SET = {'|', '.', '(', ')', '[', ']', '{', '}', '*', '+', '?'};
278
+ std::unordered_set<char> ESCAPED_IN_REGEXPS_BUT_NOT_IN_LITERALS = {'^', '$', '.', '[', ']', '(', ')', '|', '{', '}', '*', '+', '?'};
279
+
280
+ static std::string replacePattern(const std::string & input, const std::regex & regex, const std::function<std::string(const std::smatch &)> & replacement) {
281
+ std::smatch match;
282
+ std::string result;
283
+
284
+ std::string::const_iterator searchStart(input.cbegin());
285
+ std::string::const_iterator searchEnd(input.cend());
286
+
287
+ while (std::regex_search(searchStart, searchEnd, match, regex)) {
288
+ result.append(searchStart, searchStart + match.position());
289
+ result.append(replacement(match));
290
+ searchStart = match.suffix().first;
291
+ }
292
+
293
+ result.append(searchStart, searchEnd);
294
+
295
+ return result;
296
+ }
297
+
298
+ static std::string format_literal(const std::string & literal) {
299
+ std::string escaped = replacePattern(literal, GRAMMAR_LITERAL_ESCAPE_RE, [&](const std::smatch & match) {
300
+ char c = match.str()[0];
301
+ return GRAMMAR_LITERAL_ESCAPES.at(c);
302
+ });
303
+ return "\"" + escaped + "\"";
304
+ }
305
+
306
+ std::string gbnf_format_literal(const std::string & literal) { return format_literal(literal); }
307
+
308
+ class common_schema_converter {
309
+ private:
310
+ friend class common_schema_info;
311
+ friend std::string build_grammar(const std::function<void(const common_grammar_builder &)> & cb, const common_grammar_options & options);
312
+ std::function<json(const std::string &)> _fetch_json;
313
+ bool _dotall;
314
+ std::map<std::string, std::string> _rules;
315
+ std::unordered_map<std::string, json> _refs;
316
+ std::unordered_set<std::string> _refs_being_resolved;
317
+ std::vector<std::string> _errors;
318
+ std::vector<std::string> _warnings;
319
+
320
+ std::string _add_rule(const std::string & name, const std::string & rule) {
321
+ std::string esc_name = regex_replace(name, INVALID_RULE_CHARS_RE, "-");
322
+ if (_rules.find(esc_name) == _rules.end() || _rules[esc_name] == rule) {
323
+ _rules[esc_name] = rule;
324
+ return esc_name;
325
+ } else {
326
+ int i = 0;
327
+ while (_rules.find(esc_name + std::to_string(i)) != _rules.end() && _rules[esc_name + std::to_string(i)] != rule) {
328
+ i++;
329
+ }
330
+ std::string key = esc_name + std::to_string(i);
331
+ _rules[key] = rule;
332
+ return key;
333
+ }
334
+ }
335
+
336
+ std::string _generate_union_rule(const std::string & name, const std::vector<json> & alt_schemas) {
337
+ std::vector<std::string> rules;
338
+ for (size_t i = 0; i < alt_schemas.size(); i++) {
339
+ rules.push_back(visit(alt_schemas[i], name + (name.empty() ? "alternative-" : "-") + std::to_string(i)));
340
+ }
341
+ return string_join(rules, " | ");
342
+ }
343
+
344
+ std::string _visit_pattern(const std::string & pattern, const std::string & name) {
345
+ if (!(pattern.front() == '^' && pattern.back() == '$')) {
346
+ _errors.push_back("Pattern must start with '^' and end with '$'");
347
+ return "";
348
+ }
349
+ std::string sub_pattern = pattern.substr(1, pattern.length() - 2);
350
+ std::unordered_map<std::string, std::string> sub_rule_ids;
351
+
352
+ size_t i = 0;
353
+ size_t length = sub_pattern.length();
354
+
355
+ using literal_or_rule = std::pair<std::string, bool>;
356
+ auto to_rule = [&](const literal_or_rule & ls) {
357
+ auto is_literal = ls.second;
358
+ auto s = ls.first;
359
+ return is_literal ? "\"" + s + "\"" : s;
360
+ };
361
+ std::function<literal_or_rule()> transform = [&]() -> literal_or_rule {
362
+ size_t start = i;
363
+ std::vector<literal_or_rule> seq;
364
+
365
+ auto get_dot = [&]() {
366
+ std::string rule;
367
+ if (_dotall) {
368
+ rule = "[\\U00000000-\\U0010FFFF]";
369
+ } else {
370
+ rule = "[^\\x0A\\x0D]";
371
+ }
372
+ return _add_rule("dot", rule);
373
+ };
374
+
375
+ // Joins the sequence, merging consecutive literals together.
376
+ auto join_seq = [&]() {
377
+ std::vector<literal_or_rule> ret;
378
+
379
+ std::string literal;
380
+ auto flush_literal = [&]() {
381
+ if (literal.empty()) {
382
+ return false;
383
+ }
384
+ ret.emplace_back(literal, true);
385
+ literal.clear();
386
+ return true;
387
+ };
388
+
389
+ for (const auto & item : seq) {
390
+ auto is_literal = item.second;
391
+ if (is_literal) {
392
+ literal += item.first;
393
+ } else {
394
+ flush_literal();
395
+ ret.push_back(item);
396
+ }
397
+ }
398
+ flush_literal();
399
+
400
+ std::vector<std::string> results;
401
+ for (const auto & item : ret) {
402
+ results.push_back(to_rule(item));
403
+ }
404
+ return std::make_pair(string_join(results, " "), false);
405
+ };
406
+
407
+ while (i < length) {
408
+ char c = sub_pattern[i];
409
+ if (c == '.') {
410
+ seq.emplace_back(get_dot(), false);
411
+ i++;
412
+ } else if (c == '(') {
413
+ i++;
414
+ if (i < length) {
415
+ if (sub_pattern[i] == '?') {
416
+ _warnings.push_back("Unsupported pattern syntax");
417
+ }
418
+ }
419
+ seq.emplace_back("(" + to_rule(transform()) + ")", false);
420
+ } else if (c == ')') {
421
+ i++;
422
+ if (start > 0 && sub_pattern[start - 1] != '(') {
423
+ _errors.push_back("Unbalanced parentheses");
424
+ }
425
+ return join_seq();
426
+ } else if (c == '[') {
427
+ std::string square_brackets = std::string(1, c);
428
+ i++;
429
+ while (i < length && sub_pattern[i] != ']') {
430
+ if (sub_pattern[i] == '\\') {
431
+ square_brackets += sub_pattern.substr(i, 2);
432
+ i += 2;
433
+ } else {
434
+ square_brackets += sub_pattern[i];
435
+ i++;
436
+ }
437
+ }
438
+ if (i >= length) {
439
+ _errors.push_back("Unbalanced square brackets");
440
+ }
441
+ square_brackets += ']';
442
+ i++;
443
+ seq.emplace_back(square_brackets, false);
444
+ } else if (c == '|') {
445
+ seq.emplace_back("|", false);
446
+ i++;
447
+ } else if (c == '*' || c == '+' || c == '?') {
448
+ seq.back() = std::make_pair(to_rule(seq.back()) + c, false);
449
+ i++;
450
+ } else if (c == '{') {
451
+ std::string curly_brackets = std::string(1, c);
452
+ i++;
453
+ while (i < length && sub_pattern[i] != '}') {
454
+ curly_brackets += sub_pattern[i];
455
+ i++;
456
+ }
457
+ if (i >= length) {
458
+ _errors.push_back("Unbalanced curly brackets");
459
+ }
460
+ curly_brackets += '}';
461
+ i++;
462
+ auto nums = string_split(curly_brackets.substr(1, curly_brackets.length() - 2), ",");
463
+ int min_times = 0;
464
+ int max_times = std::numeric_limits<int>::max();
465
+ try {
466
+ if (nums.size() == 1) {
467
+ min_times = max_times = std::stoi(nums[0]);
468
+ } else if (nums.size() != 2) {
469
+ _errors.push_back("Wrong number of values in curly brackets");
470
+ } else {
471
+ if (!nums[0].empty()) {
472
+ min_times = std::stoi(nums[0]);
473
+ }
474
+ if (!nums[1].empty()) {
475
+ max_times = std::stoi(nums[1]);
476
+ }
477
+ }
478
+ } catch (const std::invalid_argument & e) {
479
+ _errors.push_back("Invalid number in curly brackets");
480
+ return std::make_pair("", false);
481
+ }
482
+ auto &last = seq.back();
483
+ auto &sub = last.first;
484
+ auto sub_is_literal = last.second;
485
+
486
+ if (!sub_is_literal) {
487
+ std::string & sub_id = sub_rule_ids[sub];
488
+ if (sub_id.empty()) {
489
+ sub_id = _add_rule(name + "-" + std::to_string(sub_rule_ids.size()), sub);
490
+ }
491
+ sub = sub_id;
492
+ }
493
+ seq.back().first = build_repetition(
494
+ sub_is_literal ? "\"" + sub + "\"" : sub,
495
+ min_times,
496
+ max_times,
497
+ ""
498
+ );
499
+ seq.back().second = false;
500
+ } else {
501
+ std::string literal;
502
+ auto is_non_literal = [&](char c) {
503
+ return NON_LITERAL_SET.find(c) != NON_LITERAL_SET.end();
504
+ };
505
+ while (i < length) {
506
+ if (sub_pattern[i] == '\\' && i < length - 1) {
507
+ char next = sub_pattern[i + 1];
508
+ if (ESCAPED_IN_REGEXPS_BUT_NOT_IN_LITERALS.find(next) != ESCAPED_IN_REGEXPS_BUT_NOT_IN_LITERALS.end()) {
509
+ i++;
510
+ literal += sub_pattern[i];
511
+ i++;
512
+ } else {
513
+ literal += sub_pattern.substr(i, 2);
514
+ i += 2;
515
+ }
516
+ } else if (sub_pattern[i] == '"') {
517
+ literal += "\\\"";
518
+ i++;
519
+ } else if (!is_non_literal(sub_pattern[i]) &&
520
+ (i == length - 1 || literal.empty() || sub_pattern[i + 1] == '.' || !is_non_literal(sub_pattern[i + 1]))) {
521
+ literal += sub_pattern[i];
522
+ i++;
523
+ } else {
524
+ break;
525
+ }
526
+ }
527
+ if (!literal.empty()) {
528
+ seq.emplace_back(literal, true);
529
+ }
530
+ }
531
+ }
532
+ return join_seq();
533
+ };
534
+ return _add_rule(name, "\"\\\"\" (" + to_rule(transform()) + ") \"\\\"\" space");
535
+ }
536
+
537
+ /*
538
+ Returns a rule that matches a JSON string that is none of the provided strings
539
+
540
+ not_strings({"a"})
541
+ -> ["] ( [a] char+ | [^"a] char* )? ["] space
542
+ not_strings({"and", "also"})
543
+ -> ["] ( [a] ([l] ([s] ([o] char+ | [^"o] char*) | [^"s] char*) | [n] ([d] char+ | [^"d] char*) | [^"ln] char*) | [^"a] char* )? ["] space
544
+ */
545
+ std::string _not_strings(const std::vector<std::string> & strings) {
546
+
547
+ struct TrieNode {
548
+ std::map<char, TrieNode> children;
549
+ bool is_end_of_string;
550
+
551
+ TrieNode() : is_end_of_string(false) {}
552
+
553
+ void insert(const std::string & string) {
554
+ auto node = this;
555
+ for (char c : string) {
556
+ node = &node->children[c];
557
+ }
558
+ node->is_end_of_string = true;
559
+ }
560
+ };
561
+
562
+ TrieNode trie;
563
+ for (const auto & s : strings) {
564
+ trie.insert(s);
565
+ }
566
+
567
+ std::string char_rule = _add_primitive("char", PRIMITIVE_RULES.at("char"));
568
+ std::ostringstream out;
569
+ out << "[\"] ( ";
570
+ std::function<void(const TrieNode &)> visit = [&](const TrieNode & node) {
571
+ std::ostringstream rejects;
572
+ auto first = true;
573
+ for (const auto & kv : node.children) {
574
+ rejects << kv.first;
575
+ if (first) {
576
+ first = false;
577
+ } else {
578
+ out << " | ";
579
+ }
580
+ out << "[" << kv.first << "]";
581
+ if (!kv.second.children.empty()) {
582
+ out << " (";
583
+ visit(kv.second);
584
+ out << ")";
585
+ } else if (kv.second.is_end_of_string) {
586
+ out << " " << char_rule << "+";
587
+ }
588
+ }
589
+ if (!node.children.empty()) {
590
+ if (!first) {
591
+ out << " | ";
592
+ }
593
+ out << "[^\"" << rejects.str() << "] " << char_rule << "*";
594
+ }
595
+ };
596
+ visit(trie);
597
+
598
+ out << " )";
599
+ if (!trie.is_end_of_string) {
600
+ out << "?";
601
+ }
602
+ out << " [\"] space";
603
+ return out.str();
604
+ }
605
+
606
+ std::string _resolve_ref(const std::string & ref) {
607
+ auto it = ref.find('#');
608
+ std::string ref_fragment = it != std::string::npos ? ref.substr(it + 1) : ref;
609
+ static const std::regex nonalphanumeric_regex(R"([^a-zA-Z0-9-]+)");
610
+ std::string ref_name = "ref" + std::regex_replace(ref_fragment, nonalphanumeric_regex, "-");
611
+ if (_rules.find(ref_name) == _rules.end() && _refs_being_resolved.find(ref) == _refs_being_resolved.end()) {
612
+ _refs_being_resolved.insert(ref);
613
+ json resolved = _refs[ref];
614
+ ref_name = visit(resolved, ref_name);
615
+ _refs_being_resolved.erase(ref);
616
+ }
617
+ return ref_name;
618
+ }
619
+
620
+ std::string _build_object_rule(
621
+ const std::vector<std::pair<std::string, json>> & properties,
622
+ const std::unordered_set<std::string> & required,
623
+ const std::string & name,
624
+ const json & additional_properties)
625
+ {
626
+ std::vector<std::string> required_props;
627
+ std::vector<std::string> optional_props;
628
+ std::unordered_map<std::string, std::string> prop_kv_rule_names;
629
+ std::vector<std::string> prop_names;
630
+ for (const auto & kv : properties) {
631
+ const auto &prop_name = kv.first;
632
+ const auto &prop_schema = kv.second;
633
+
634
+ std::string prop_rule_name = visit(prop_schema, name + (name.empty() ? "" : "-") + prop_name);
635
+ prop_kv_rule_names[prop_name] = _add_rule(
636
+ name + (name.empty() ? "" : "-") + prop_name + "-kv",
637
+ format_literal(json(prop_name).dump()) + " space \":\" space " + prop_rule_name
638
+ );
639
+ if (required.find(prop_name) != required.end()) {
640
+ required_props.push_back(prop_name);
641
+ } else {
642
+ optional_props.push_back(prop_name);
643
+ }
644
+ prop_names.push_back(prop_name);
645
+ }
646
+ if ((additional_properties.is_boolean() && additional_properties.get<bool>()) || additional_properties.is_object()) {
647
+ std::string sub_name = name + (name.empty() ? "" : "-") + "additional";
648
+ std::string value_rule =
649
+ additional_properties.is_object() ? visit(additional_properties, sub_name + "-value")
650
+ : _add_primitive("value", PRIMITIVE_RULES.at("value"));
651
+
652
+ auto key_rule =
653
+ prop_names.empty() ? _add_primitive("string", PRIMITIVE_RULES.at("string"))
654
+ : _add_rule(sub_name + "-k", _not_strings(prop_names));
655
+ std::string kv_rule = _add_rule(sub_name + "-kv", key_rule + " \":\" space " + value_rule);
656
+ prop_kv_rule_names["*"] = kv_rule;
657
+ optional_props.push_back("*");
658
+ }
659
+
660
+ std::string rule = "\"{\" space ";
661
+ for (size_t i = 0; i < required_props.size(); i++) {
662
+ if (i > 0) {
663
+ rule += " \",\" space ";
664
+ }
665
+ rule += prop_kv_rule_names[required_props[i]];
666
+ }
667
+
668
+ if (!optional_props.empty()) {
669
+ rule += " (";
670
+ if (!required_props.empty()) {
671
+ rule += " \",\" space ( ";
672
+ }
673
+
674
+ std::function<std::string(const std::vector<std::string> &, bool)> get_recursive_refs = [&](const std::vector<std::string> & ks, bool first_is_optional) {
675
+ std::string res;
676
+ if (ks.empty()) {
677
+ return res;
678
+ }
679
+ std::string k = ks[0];
680
+ std::string kv_rule_name = prop_kv_rule_names[k];
681
+ std::string comma_ref = "( \",\" space " + kv_rule_name + " )";
682
+ if (first_is_optional) {
683
+ res = comma_ref + (k == "*" ? "*" : "?");
684
+ } else {
685
+ res = kv_rule_name + (k == "*" ? " " + comma_ref + "*" : "");
686
+ }
687
+ if (ks.size() > 1) {
688
+ res += " " + _add_rule(
689
+ name + (name.empty() ? "" : "-") + k + "-rest",
690
+ get_recursive_refs(std::vector<std::string>(ks.begin() + 1, ks.end()), true)
691
+ );
692
+ }
693
+ return res;
694
+ };
695
+
696
+ for (size_t i = 0; i < optional_props.size(); i++) {
697
+ if (i > 0) {
698
+ rule += " | ";
699
+ }
700
+ rule += get_recursive_refs(std::vector<std::string>(optional_props.begin() + i, optional_props.end()), false);
701
+ }
702
+ if (!required_props.empty()) {
703
+ rule += " )";
704
+ }
705
+ rule += " )?";
706
+ }
707
+
708
+ rule += " \"}\" space";
709
+
710
+ return rule;
711
+ }
712
+
713
+ std::string _add_primitive(const std::string & name, const BuiltinRule & rule) {
714
+ auto n = _add_rule(name, rule.content);
715
+ for (const auto & dep : rule.deps) {
716
+ BuiltinRule dep_rule;
717
+ auto it = PRIMITIVE_RULES.find(dep);
718
+ if (it == PRIMITIVE_RULES.end()) {
719
+ it = STRING_FORMAT_RULES.find(dep);
720
+ if (it == STRING_FORMAT_RULES.end()) {
721
+ _errors.push_back("Rule " + dep + " not known");
722
+ continue;
723
+ }
724
+ }
725
+ if (_rules.find(dep) == _rules.end()) {
726
+ _add_primitive(dep, it->second);
727
+ }
728
+ }
729
+ return n;
730
+ }
731
+
732
+ public:
733
+ common_schema_converter(
734
+ const std::function<json(const std::string &)> & fetch_json,
735
+ bool dotall)
736
+ : _fetch_json(fetch_json), _dotall(dotall)
737
+ {
738
+ _rules["space"] = SPACE_RULE;
739
+ }
740
+
741
+ void resolve_refs(json & schema, const std::string & url) {
742
+ /*
743
+ * Resolves all $ref fields in the given schema, fetching any remote schemas,
744
+ * replacing each $ref with absolute reference URL and populates _refs with the
745
+ * respective referenced (sub)schema dictionaries.
746
+ */
747
+ std::function<void(json &)> visit_refs = [&](json & n) {
748
+ if (n.is_array()) {
749
+ for (auto & x : n) {
750
+ visit_refs(x);
751
+ }
752
+ } else if (n.is_object()) {
753
+ if (n.contains("$ref")) {
754
+ std::string ref = n["$ref"];
755
+ if (_refs.find(ref) == _refs.end()) {
756
+ json target;
757
+ if (ref.find("https://") == 0) {
758
+ std::string base_url = ref.substr(0, ref.find('#'));
759
+ auto it = _refs.find(base_url);
760
+ if (it != _refs.end()) {
761
+ target = it->second;
762
+ } else {
763
+ // Fetch the referenced schema and resolve its refs
764
+ auto referenced = _fetch_json(ref);
765
+ resolve_refs(referenced, base_url);
766
+ _refs[base_url] = referenced;
767
+ }
768
+ if (ref.find('#') == std::string::npos || ref.substr(ref.find('#') + 1).empty()) {
769
+ return;
770
+ }
771
+ } else if (ref.find("#/") == 0) {
772
+ target = schema;
773
+ n["$ref"] = url + ref;
774
+ ref = url + ref;
775
+ } else {
776
+ _errors.push_back("Unsupported ref: " + ref);
777
+ return;
778
+ }
779
+ std::string pointer = ref.substr(ref.find('#') + 1);
780
+ std::vector<std::string> tokens = string_split(pointer, "/");
781
+ for (size_t i = 1; i < tokens.size(); ++i) {
782
+ std::string sel = tokens[i];
783
+ if (target.is_object() && target.contains(sel)) {
784
+ target = target[sel];
785
+ } else if (target.is_array()) {
786
+ size_t sel_index;
787
+ try {
788
+ sel_index = std::stoul(sel);
789
+ } catch (const std::invalid_argument & e) {
790
+ sel_index = target.size();
791
+ }
792
+ if (sel_index >= target.size()) {
793
+ _errors.push_back("Error resolving ref " + ref + ": " + sel + " not in " + target.dump());
794
+ return;
795
+ }
796
+ target = target[sel_index];
797
+ } else {
798
+ _errors.push_back("Error resolving ref " + ref + ": " + sel + " not in " + target.dump());
799
+ return;
800
+ }
801
+ }
802
+ _refs[ref] = target;
803
+ }
804
+ } else {
805
+ for (auto & kv : n.items()) {
806
+ visit_refs(kv.value());
807
+ }
808
+ }
809
+ }
810
+ };
811
+
812
+ visit_refs(schema);
813
+ }
814
+
815
+ std::string _generate_constant_rule(const json & value) {
816
+ return format_literal(value.dump());
817
+ }
818
+
819
+ std::string visit(const json & schema, const std::string & name) {
820
+ json schema_type = schema.contains("type") ? schema["type"] : json();
821
+ std::string schema_format = schema.contains("format") ? schema["format"].get<std::string>() : "";
822
+ std::string rule_name = is_reserved_name(name) ? name + "-" : name.empty() ? "root" : name;
823
+
824
+ if (schema.contains("$ref")) {
825
+ return _add_rule(rule_name, _resolve_ref(schema["$ref"]));
826
+ } else if (schema.contains("oneOf") || schema.contains("anyOf")) {
827
+ std::vector<json> alt_schemas = schema.contains("oneOf") ? schema["oneOf"].get<std::vector<json>>() : schema["anyOf"].get<std::vector<json>>();
828
+ return _add_rule(rule_name, _generate_union_rule(name, alt_schemas));
829
+ } else if (schema_type.is_array()) {
830
+ std::vector<json> schema_types;
831
+ for (const auto & t : schema_type) {
832
+ json schema_copy(schema);
833
+ schema_copy["type"] = t;
834
+ schema_types.push_back(schema_copy);
835
+ }
836
+ return _add_rule(rule_name, _generate_union_rule(name, schema_types));
837
+ } else if (schema.contains("const")) {
838
+ return _add_rule(rule_name, _generate_constant_rule(schema["const"]) + " space");
839
+ } else if (schema.contains("enum")) {
840
+ std::vector<std::string> enum_values;
841
+ for (const auto & v : schema["enum"]) {
842
+ enum_values.push_back(_generate_constant_rule(v));
843
+ }
844
+ return _add_rule(rule_name, "(" + string_join(enum_values, " | ") + ") space");
845
+ } else if ((schema_type.is_null() || schema_type == "object")
846
+ && (schema.contains("properties") ||
847
+ (schema.contains("additionalProperties") && schema["additionalProperties"] != true))) {
848
+ std::unordered_set<std::string> required;
849
+ if (schema.contains("required") && schema["required"].is_array()) {
850
+ for (const auto & item : schema["required"]) {
851
+ if (item.is_string()) {
852
+ required.insert(item.get<std::string>());
853
+ }
854
+ }
855
+ }
856
+ std::vector<std::pair<std::string, json>> properties;
857
+ if (schema.contains("properties")) {
858
+ for (const auto & prop : schema["properties"].items()) {
859
+ properties.emplace_back(prop.key(), prop.value());
860
+ }
861
+ }
862
+ return _add_rule(rule_name,
863
+ _build_object_rule(
864
+ properties, required, name,
865
+ schema.contains("additionalProperties") ? schema["additionalProperties"] : json()));
866
+ } else if ((schema_type.is_null() || schema_type == "object" || schema_type == "string") && schema.contains("allOf")) {
867
+ std::unordered_set<std::string> required;
868
+ std::vector<std::pair<std::string, json>> properties;
869
+ std::map<std::string, size_t> enum_values;
870
+ std::string hybrid_name = name;
871
+ std::function<void(const json &, bool)> add_component = [&](const json & comp_schema, bool is_required) {
872
+ if (comp_schema.contains("$ref")) {
873
+ add_component(_refs[comp_schema["$ref"]], is_required);
874
+ } else if (comp_schema.contains("properties")) {
875
+ for (const auto & prop : comp_schema["properties"].items()) {
876
+ properties.emplace_back(prop.key(), prop.value());
877
+ if (is_required) {
878
+ required.insert(prop.key());
879
+ }
880
+ }
881
+ } else if (comp_schema.contains("enum")) {
882
+ for (const auto & v : comp_schema["enum"]) {
883
+ const auto rule = _generate_constant_rule(v);
884
+ if (enum_values.find(rule) == enum_values.end()) {
885
+ enum_values[rule] = 0;
886
+ }
887
+ enum_values[rule] += 1;
888
+ }
889
+ } else {
890
+ // todo warning
891
+ }
892
+ };
893
+ for (auto & t : schema["allOf"]) {
894
+ if (t.contains("anyOf")) {
895
+ for (auto & tt : t["anyOf"]) {
896
+ add_component(tt, false);
897
+ }
898
+ } else {
899
+ add_component(t, true);
900
+ }
901
+ }
902
+ if (!enum_values.empty()) {
903
+ std::vector<std::string> enum_intersection;
904
+ for (const auto & p : enum_values) {
905
+ if (p.second == schema["allOf"].size()) {
906
+ enum_intersection.push_back(p.first);
907
+ }
908
+ }
909
+ if (!enum_intersection.empty()) {
910
+ return _add_rule(rule_name, "(" + string_join(enum_intersection, " | ") + ") space");
911
+ }
912
+ }
913
+ return _add_rule(rule_name, _build_object_rule(properties, required, hybrid_name, json()));
914
+ } else if ((schema_type.is_null() || schema_type == "array") && (schema.contains("items") || schema.contains("prefixItems"))) {
915
+ json items = schema.contains("items") ? schema["items"] : schema["prefixItems"];
916
+ if (items.is_array()) {
917
+ std::string rule = "\"[\" space ";
918
+ for (size_t i = 0; i < items.size(); i++) {
919
+ if (i > 0) {
920
+ rule += " \",\" space ";
921
+ }
922
+ rule += visit(items[i], name + (name.empty() ? "" : "-") + "tuple-" + std::to_string(i));
923
+ }
924
+ rule += " \"]\" space";
925
+ return _add_rule(rule_name, rule);
926
+ } else {
927
+ std::string item_rule_name = visit(items, name + (name.empty() ? "" : "-") + "item");
928
+ int min_items = schema.contains("minItems") ? schema["minItems"].get<int>() : 0;
929
+ json max_items_json = schema.contains("maxItems") ? schema["maxItems"] : json();
930
+ int max_items = max_items_json.is_number_integer() ? max_items_json.get<int>() : std::numeric_limits<int>::max();
931
+
932
+ return _add_rule(rule_name, "\"[\" space " + build_repetition(item_rule_name, min_items, max_items, "\",\" space") + " \"]\" space");
933
+ }
934
+ } else if ((schema_type.is_null() || schema_type == "string") && schema.contains("pattern")) {
935
+ return _visit_pattern(schema["pattern"], rule_name);
936
+ } else if ((schema_type.is_null() || schema_type == "string") && std::regex_match(schema_format, std::regex("^uuid[1-5]?$"))) {
937
+ return _add_primitive(rule_name == "root" ? "root" : schema_format, PRIMITIVE_RULES.at("uuid"));
938
+ } else if ((schema_type.is_null() || schema_type == "string") && STRING_FORMAT_RULES.find(schema_format + "-string") != STRING_FORMAT_RULES.end()) {
939
+ auto prim_name = schema_format + "-string";
940
+ return _add_rule(rule_name, _add_primitive(prim_name, STRING_FORMAT_RULES.at(prim_name)));
941
+ } else if (schema_type == "string" && (schema.contains("minLength") || schema.contains("maxLength"))) {
942
+ std::string char_rule = _add_primitive("char", PRIMITIVE_RULES.at("char"));
943
+ int min_len = schema.contains("minLength") ? schema["minLength"].get<int>() : 0;
944
+ int max_len = schema.contains("maxLength") ? schema["maxLength"].get<int>() : std::numeric_limits<int>::max();
945
+ return _add_rule(rule_name, "\"\\\"\" " + build_repetition(char_rule, min_len, max_len) + " \"\\\"\" space");
946
+ } else if (schema_type == "integer" && (schema.contains("minimum") || schema.contains("exclusiveMinimum") || schema.contains("maximum") || schema.contains("exclusiveMaximum"))) {
947
+ int64_t min_value = std::numeric_limits<int64_t>::min();
948
+ int64_t max_value = std::numeric_limits<int64_t>::max();
949
+ if (schema.contains("minimum")) {
950
+ min_value = schema["minimum"].get<int64_t>();
951
+ } else if (schema.contains("exclusiveMinimum")) {
952
+ min_value = schema["exclusiveMinimum"].get<int64_t>() + 1;
953
+ }
954
+ if (schema.contains("maximum")) {
955
+ max_value = schema["maximum"].get<int64_t>();
956
+ } else if (schema.contains("exclusiveMaximum")) {
957
+ max_value = schema["exclusiveMaximum"].get<int64_t>() - 1;
958
+ }
959
+ std::stringstream out;
960
+ out << "(";
961
+ _build_min_max_int(min_value, max_value, out);
962
+ out << ") space";
963
+ return _add_rule(rule_name, out.str());
964
+ } else if (schema.empty() || schema_type == "object") {
965
+ return _add_rule(rule_name, _add_primitive("object", PRIMITIVE_RULES.at("object")));
966
+ } else {
967
+ if (!schema_type.is_string() || PRIMITIVE_RULES.find(schema_type.get<std::string>()) == PRIMITIVE_RULES.end()) {
968
+ _errors.push_back("Unrecognized schema: " + schema.dump());
969
+ return "";
970
+ }
971
+ // TODO: support minimum, maximum, exclusiveMinimum, exclusiveMaximum at least for zero
972
+ return _add_primitive(rule_name == "root" ? "root" : schema_type.get<std::string>(), PRIMITIVE_RULES.at(schema_type.get<std::string>()));
973
+ }
974
+ }
975
+
976
+ void check_errors() {
977
+ if (!_errors.empty()) {
978
+ throw std::invalid_argument("JSON schema conversion failed:\n" + string_join(_errors, "\n"));
979
+ }
980
+ if (!_warnings.empty()) {
981
+ fprintf(stderr, "WARNING: JSON schema conversion was incomplete: %s\n", string_join(_warnings, "; ").c_str());
982
+ }
983
+ }
984
+
985
+ std::string format_grammar() {
986
+ std::stringstream ss;
987
+ for (const auto & kv : _rules) {
988
+ ss << kv.first << " ::= " << kv.second << std::endl;
989
+ }
990
+ return ss.str();
991
+ }
992
+ };
993
+
994
+ // common_schema_info implementation (pimpl)
995
+
996
+ common_schema_info::common_schema_info()
997
+ : impl_(std::make_unique<common_schema_converter>(
998
+ [](const std::string &) { return json(); },
999
+ false)) {}
1000
+
1001
+ common_schema_info::~common_schema_info() = default;
1002
+
1003
+ common_schema_info::common_schema_info(common_schema_info &&) noexcept = default;
1004
+ common_schema_info & common_schema_info::operator=(common_schema_info &&) noexcept = default;
1005
+
1006
+ void common_schema_info::resolve_refs(nlohmann::ordered_json & schema) {
1007
+ impl_->resolve_refs(schema, "");
1008
+ }
1009
+
1010
+ // Determines if a JSON schema can resolve to a string type through any path.
1011
+ // Some models emit raw string values rather than JSON-encoded strings for string parameters.
1012
+ // If any branch of the schema (via oneOf, anyOf, $ref, etc.) permits a string, this returns
1013
+ // true, allowing callers to handle the value as a raw string for simplicity.
1014
+ bool common_schema_info::resolves_to_string(const nlohmann::ordered_json & schema) {
1015
+ std::unordered_set<std::string> visited_refs;
1016
+
1017
+ std::function<bool(const json &)> check = [&](const json & s) -> bool {
1018
+ if (!s.is_object()) {
1019
+ return false;
1020
+ }
1021
+
1022
+ // Handle $ref
1023
+ if (s.contains("$ref")) {
1024
+ const std::string & ref = s["$ref"];
1025
+ if (visited_refs.find(ref) != visited_refs.end()) {
1026
+ // Circular reference, assume not a string to be safe
1027
+ return false;
1028
+ }
1029
+ visited_refs.insert(ref);
1030
+ auto it = impl_->_refs.find(ref);
1031
+ if (it != impl_->_refs.end()) {
1032
+ return check(it->second);
1033
+ }
1034
+ return false;
1035
+ }
1036
+
1037
+ // Check type field
1038
+ if (s.contains("type")) {
1039
+ const json & schema_type = s["type"];
1040
+ if (schema_type.is_string()) {
1041
+ if (schema_type == "string") {
1042
+ return true;
1043
+ }
1044
+ } else if (schema_type.is_array()) {
1045
+ // Type can be an array like ["string", "null"]
1046
+ for (const auto & t : schema_type) {
1047
+ if (t == "string") {
1048
+ return true;
1049
+ }
1050
+ }
1051
+ }
1052
+ }
1053
+
1054
+ // Check oneOf/anyOf - if any alternative can be a string
1055
+ if (s.contains("oneOf")) {
1056
+ for (const auto & alt : s["oneOf"]) {
1057
+ if (check(alt)) {
1058
+ return true;
1059
+ }
1060
+ }
1061
+ }
1062
+ if (s.contains("anyOf")) {
1063
+ for (const auto & alt : s["anyOf"]) {
1064
+ if (check(alt)) {
1065
+ return true;
1066
+ }
1067
+ }
1068
+ }
1069
+
1070
+ // Check allOf - all components must be compatible with string type
1071
+ if (s.contains("allOf")) {
1072
+ bool all_string = true;
1073
+ for (const auto & component : s["allOf"]) {
1074
+ if (!check(component)) {
1075
+ all_string = false;
1076
+ break;
1077
+ }
1078
+ }
1079
+ if (all_string) {
1080
+ return true;
1081
+ }
1082
+ }
1083
+
1084
+ // Check const - if the constant value is a string
1085
+ if (s.contains("const")) {
1086
+ if (s["const"].is_string()) {
1087
+ return true;
1088
+ }
1089
+ }
1090
+
1091
+ // Check enum - if any enum value is a string
1092
+ if (s.contains("enum")) {
1093
+ for (const auto & val : s["enum"]) {
1094
+ if (val.is_string()) {
1095
+ return true;
1096
+ }
1097
+ }
1098
+ }
1099
+
1100
+ // String-specific keywords imply string type
1101
+ if (s.contains("pattern") || s.contains("minLength") || s.contains("maxLength")) {
1102
+ return true;
1103
+ }
1104
+
1105
+ // Check format - many formats imply string
1106
+ if (s.contains("format")) {
1107
+ const std::string & fmt = s["format"];
1108
+ if (fmt == "date" || fmt == "time" || fmt == "date-time" ||
1109
+ fmt == "uri" || fmt == "email" || fmt == "hostname" ||
1110
+ fmt == "ipv4" || fmt == "ipv6" || fmt == "uuid" ||
1111
+ fmt.find("uuid") == 0) {
1112
+ return true;
1113
+ }
1114
+ }
1115
+
1116
+ return false;
1117
+ };
1118
+
1119
+ return check(schema);
1120
+ }
1121
+
1122
+ std::string json_schema_to_grammar(const json & schema, bool force_gbnf) {
1123
+ #ifdef LLAMA_USE_LLGUIDANCE
1124
+ if (!force_gbnf) {
1125
+ return "%llguidance {}\nstart: %json " + schema.dump();
1126
+ }
1127
+ #else
1128
+ (void)force_gbnf;
1129
+ #endif // LLAMA_USE_LLGUIDANCE
1130
+ return build_grammar([&](const common_grammar_builder & callbacks) {
1131
+ auto copy = schema;
1132
+ callbacks.resolve_refs(copy);
1133
+ callbacks.add_schema("", copy);
1134
+ });
1135
+ }
1136
+
1137
+ std::string build_grammar(const std::function<void(const common_grammar_builder &)> & cb, const common_grammar_options & options) {
1138
+ common_schema_converter converter([&](const std::string &) { return json(); }, options.dotall);
1139
+ common_grammar_builder builder {
1140
+ /* .add_rule = */ [&](const std::string & name, const std::string & rule) {
1141
+ return converter._add_rule(name, rule);
1142
+ },
1143
+ /* .add_schema = */ [&](const std::string & name, const nlohmann::ordered_json & schema) {
1144
+ return converter.visit(schema, name == "root" ? "" : name);
1145
+ },
1146
+ /* .resolve_refs = */ [&](nlohmann::ordered_json & schema) {
1147
+ converter.resolve_refs(schema, "");
1148
+ }
1149
+ };
1150
+ cb(builder);
1151
+ converter.check_errors();
1152
+ return converter.format_grammar();
1153
+ }