gpt-tokenizer 2.7.0 → 2.8.1

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 (372) hide show
  1. package/README.md +46 -5
  2. package/cjs/BytePairEncodingCore.d.ts +14 -1
  3. package/cjs/BytePairEncodingCore.js +84 -6
  4. package/cjs/BytePairEncodingCore.js.map +1 -1
  5. package/cjs/GptEncoding.d.ts +4 -4
  6. package/cjs/GptEncoding.js +25 -14
  7. package/cjs/GptEncoding.js.map +1 -1
  8. package/cjs/constants.d.ts +1 -0
  9. package/cjs/constants.js +2 -1
  10. package/cjs/constants.js.map +1 -1
  11. package/cjs/encoding/cl100k_base.d.ts +2 -2
  12. package/cjs/encoding/cl100k_base.js +4 -2
  13. package/cjs/encoding/cl100k_base.js.map +1 -1
  14. package/cjs/encoding/o200k_base.d.ts +2 -2
  15. package/cjs/encoding/o200k_base.js +4 -2
  16. package/cjs/encoding/o200k_base.js.map +1 -1
  17. package/cjs/encoding/p50k_base.d.ts +2 -2
  18. package/cjs/encoding/p50k_base.js +4 -2
  19. package/cjs/encoding/p50k_base.js.map +1 -1
  20. package/cjs/encoding/p50k_edit.d.ts +2 -2
  21. package/cjs/encoding/p50k_edit.js +4 -2
  22. package/cjs/encoding/p50k_edit.js.map +1 -1
  23. package/cjs/encoding/r50k_base.d.ts +2 -2
  24. package/cjs/encoding/r50k_base.js +4 -2
  25. package/cjs/encoding/r50k_base.js.map +1 -1
  26. package/cjs/encodingParams/{Cl100KBase.js → cl100k_base.js} +3 -2
  27. package/cjs/encodingParams/cl100k_base.js.map +1 -0
  28. package/cjs/encodingParams/constants.d.ts +2 -0
  29. package/cjs/encodingParams/constants.js +6 -0
  30. package/cjs/encodingParams/constants.js.map +1 -0
  31. package/cjs/encodingParams/{O200KBase.js → o200k_base.js} +3 -2
  32. package/cjs/encodingParams/o200k_base.js.map +1 -0
  33. package/cjs/encodingParams/{P50KBase.js → p50k_base.js} +3 -3
  34. package/cjs/encodingParams/p50k_base.js.map +1 -0
  35. package/cjs/encodingParams/{P50KEdit.js → p50k_edit.js} +3 -3
  36. package/cjs/encodingParams/p50k_edit.js.map +1 -0
  37. package/cjs/encodingParams/{R50KBase.js → r50k_base.js} +3 -3
  38. package/cjs/encodingParams/r50k_base.js.map +1 -0
  39. package/cjs/extraApis.test.d.ts +1 -0
  40. package/cjs/extraApis.test.js +57 -0
  41. package/cjs/extraApis.test.js.map +1 -0
  42. package/cjs/model/gpt-3.5-turbo-0125.d.ts +2 -2
  43. package/cjs/model/gpt-3.5-turbo-0125.js +4 -2
  44. package/cjs/model/gpt-3.5-turbo-0125.js.map +1 -1
  45. package/cjs/model/gpt-3.5-turbo-0301.d.ts +2 -2
  46. package/cjs/model/gpt-3.5-turbo-0301.js +4 -2
  47. package/cjs/model/gpt-3.5-turbo-0301.js.map +1 -1
  48. package/cjs/model/gpt-3.5-turbo-0613.d.ts +2 -2
  49. package/cjs/model/gpt-3.5-turbo-0613.js +4 -2
  50. package/cjs/model/gpt-3.5-turbo-0613.js.map +1 -1
  51. package/cjs/model/gpt-3.5-turbo-1106.d.ts +2 -2
  52. package/cjs/model/gpt-3.5-turbo-1106.js +4 -2
  53. package/cjs/model/gpt-3.5-turbo-1106.js.map +1 -1
  54. package/cjs/model/gpt-3.5-turbo-16k-0613.d.ts +2 -2
  55. package/cjs/model/gpt-3.5-turbo-16k-0613.js +4 -2
  56. package/cjs/model/gpt-3.5-turbo-16k-0613.js.map +1 -1
  57. package/cjs/model/gpt-3.5-turbo-16k.d.ts +2 -2
  58. package/cjs/model/gpt-3.5-turbo-16k.js +4 -2
  59. package/cjs/model/gpt-3.5-turbo-16k.js.map +1 -1
  60. package/cjs/model/gpt-3.5-turbo-finetune.d.ts +2 -2
  61. package/cjs/model/gpt-3.5-turbo-finetune.js +4 -2
  62. package/cjs/model/gpt-3.5-turbo-finetune.js.map +1 -1
  63. package/cjs/model/gpt-3.5-turbo.d.ts +2 -2
  64. package/cjs/model/gpt-3.5-turbo.js +4 -2
  65. package/cjs/model/gpt-3.5-turbo.js.map +1 -1
  66. package/cjs/model/gpt-4-0125-preview.d.ts +2 -2
  67. package/cjs/model/gpt-4-0125-preview.js +4 -2
  68. package/cjs/model/gpt-4-0125-preview.js.map +1 -1
  69. package/cjs/model/gpt-4-0314.d.ts +2 -2
  70. package/cjs/model/gpt-4-0314.js +4 -2
  71. package/cjs/model/gpt-4-0314.js.map +1 -1
  72. package/cjs/model/gpt-4-0613.d.ts +2 -2
  73. package/cjs/model/gpt-4-0613.js +4 -2
  74. package/cjs/model/gpt-4-0613.js.map +1 -1
  75. package/cjs/model/gpt-4-1106-preview.d.ts +2 -2
  76. package/cjs/model/gpt-4-1106-preview.js +4 -2
  77. package/cjs/model/gpt-4-1106-preview.js.map +1 -1
  78. package/cjs/model/gpt-4-1106-vision-preview.d.ts +2 -2
  79. package/cjs/model/gpt-4-1106-vision-preview.js +4 -2
  80. package/cjs/model/gpt-4-1106-vision-preview.js.map +1 -1
  81. package/cjs/model/gpt-4-32k-0314.d.ts +2 -2
  82. package/cjs/model/gpt-4-32k-0314.js +4 -2
  83. package/cjs/model/gpt-4-32k-0314.js.map +1 -1
  84. package/cjs/model/gpt-4-32k-0613.d.ts +2 -2
  85. package/cjs/model/gpt-4-32k-0613.js +4 -2
  86. package/cjs/model/gpt-4-32k-0613.js.map +1 -1
  87. package/cjs/model/gpt-4-32k.d.ts +2 -2
  88. package/cjs/model/gpt-4-32k.js +4 -2
  89. package/cjs/model/gpt-4-32k.js.map +1 -1
  90. package/cjs/model/gpt-4-turbo-2024-04-09.d.ts +2 -2
  91. package/cjs/model/gpt-4-turbo-2024-04-09.js +4 -2
  92. package/cjs/model/gpt-4-turbo-2024-04-09.js.map +1 -1
  93. package/cjs/model/gpt-4-turbo-preview.d.ts +2 -2
  94. package/cjs/model/gpt-4-turbo-preview.js +4 -2
  95. package/cjs/model/gpt-4-turbo-preview.js.map +1 -1
  96. package/cjs/model/gpt-4-turbo.d.ts +2 -2
  97. package/cjs/model/gpt-4-turbo.js +4 -2
  98. package/cjs/model/gpt-4-turbo.js.map +1 -1
  99. package/cjs/model/gpt-4-vision-preview.d.ts +2 -2
  100. package/cjs/model/gpt-4-vision-preview.js +4 -2
  101. package/cjs/model/gpt-4-vision-preview.js.map +1 -1
  102. package/cjs/model/gpt-4.d.ts +2 -2
  103. package/cjs/model/gpt-4.js +4 -2
  104. package/cjs/model/gpt-4.js.map +1 -1
  105. package/cjs/model/gpt-4o-2024-05-13.d.ts +2 -2
  106. package/cjs/model/gpt-4o-2024-05-13.js +4 -2
  107. package/cjs/model/gpt-4o-2024-05-13.js.map +1 -1
  108. package/cjs/model/gpt-4o-2024-08-06-finetune.d.ts +2 -2
  109. package/cjs/model/gpt-4o-2024-08-06-finetune.js +4 -2
  110. package/cjs/model/gpt-4o-2024-08-06-finetune.js.map +1 -1
  111. package/cjs/model/gpt-4o-2024-08-06.d.ts +2 -2
  112. package/cjs/model/gpt-4o-2024-08-06.js +4 -2
  113. package/cjs/model/gpt-4o-2024-08-06.js.map +1 -1
  114. package/cjs/model/gpt-4o-audio-preview-2024-10-01.d.ts +2 -2
  115. package/cjs/model/gpt-4o-audio-preview-2024-10-01.js +4 -2
  116. package/cjs/model/gpt-4o-audio-preview-2024-10-01.js.map +1 -1
  117. package/cjs/model/gpt-4o-audio-preview.d.ts +2 -2
  118. package/cjs/model/gpt-4o-audio-preview.js +4 -2
  119. package/cjs/model/gpt-4o-audio-preview.js.map +1 -1
  120. package/cjs/model/gpt-4o-mini-2024-07-18-finetune.d.ts +2 -2
  121. package/cjs/model/gpt-4o-mini-2024-07-18-finetune.js +4 -2
  122. package/cjs/model/gpt-4o-mini-2024-07-18-finetune.js.map +1 -1
  123. package/cjs/model/gpt-4o-mini-2024-07-18.d.ts +2 -2
  124. package/cjs/model/gpt-4o-mini-2024-07-18.js +4 -2
  125. package/cjs/model/gpt-4o-mini-2024-07-18.js.map +1 -1
  126. package/cjs/model/gpt-4o-mini-training-2024-07-18.d.ts +2 -2
  127. package/cjs/model/gpt-4o-mini-training-2024-07-18.js +4 -2
  128. package/cjs/model/gpt-4o-mini-training-2024-07-18.js.map +1 -1
  129. package/cjs/model/gpt-4o-mini-training.d.ts +2 -2
  130. package/cjs/model/gpt-4o-mini-training.js +4 -2
  131. package/cjs/model/gpt-4o-mini-training.js.map +1 -1
  132. package/cjs/model/gpt-4o-mini.d.ts +2 -2
  133. package/cjs/model/gpt-4o-mini.js +4 -2
  134. package/cjs/model/gpt-4o-mini.js.map +1 -1
  135. package/cjs/model/gpt-4o-realtime-preview-2024-10-01.d.ts +2 -2
  136. package/cjs/model/gpt-4o-realtime-preview-2024-10-01.js +4 -2
  137. package/cjs/model/gpt-4o-realtime-preview-2024-10-01.js.map +1 -1
  138. package/cjs/model/gpt-4o-realtime-preview.d.ts +2 -2
  139. package/cjs/model/gpt-4o-realtime-preview.js +4 -2
  140. package/cjs/model/gpt-4o-realtime-preview.js.map +1 -1
  141. package/cjs/model/gpt-4o.d.ts +2 -2
  142. package/cjs/model/gpt-4o.js +4 -2
  143. package/cjs/model/gpt-4o.js.map +1 -1
  144. package/cjs/modelParams.d.ts +0 -3
  145. package/cjs/modelParams.js +10 -17
  146. package/cjs/modelParams.js.map +1 -1
  147. package/dist/cl100k_base.js +1 -1
  148. package/dist/cl100k_base.js.map +1 -1
  149. package/dist/o200k_base.js +1 -1
  150. package/dist/o200k_base.js.map +1 -1
  151. package/dist/p50k_base.js +1 -1
  152. package/dist/p50k_base.js.map +1 -1
  153. package/dist/p50k_edit.js +1 -1
  154. package/dist/p50k_edit.js.map +1 -1
  155. package/dist/r50k_base.js +1 -1
  156. package/dist/r50k_base.js.map +1 -1
  157. package/esm/BytePairEncodingCore.d.ts +14 -1
  158. package/esm/BytePairEncodingCore.js +84 -6
  159. package/esm/BytePairEncodingCore.js.map +1 -1
  160. package/esm/GptEncoding.d.ts +4 -4
  161. package/esm/GptEncoding.js +26 -15
  162. package/esm/GptEncoding.js.map +1 -1
  163. package/esm/constants.d.ts +1 -0
  164. package/esm/constants.js +1 -0
  165. package/esm/constants.js.map +1 -1
  166. package/esm/encoding/cl100k_base.d.ts +2 -2
  167. package/esm/encoding/cl100k_base.js +2 -2
  168. package/esm/encoding/cl100k_base.js.map +1 -1
  169. package/esm/encoding/o200k_base.d.ts +2 -2
  170. package/esm/encoding/o200k_base.js +2 -2
  171. package/esm/encoding/o200k_base.js.map +1 -1
  172. package/esm/encoding/p50k_base.d.ts +2 -2
  173. package/esm/encoding/p50k_base.js +2 -2
  174. package/esm/encoding/p50k_base.js.map +1 -1
  175. package/esm/encoding/p50k_edit.d.ts +2 -2
  176. package/esm/encoding/p50k_edit.js +2 -2
  177. package/esm/encoding/p50k_edit.js.map +1 -1
  178. package/esm/encoding/r50k_base.d.ts +2 -2
  179. package/esm/encoding/r50k_base.js +2 -2
  180. package/esm/encoding/r50k_base.js.map +1 -1
  181. package/esm/encodingParams/{Cl100KBase.js → cl100k_base.js} +3 -2
  182. package/esm/encodingParams/cl100k_base.js.map +1 -0
  183. package/esm/encodingParams/constants.d.ts +2 -0
  184. package/esm/encodingParams/constants.js +3 -0
  185. package/esm/encodingParams/constants.js.map +1 -0
  186. package/esm/encodingParams/{O200KBase.js → o200k_base.js} +3 -2
  187. package/esm/encodingParams/o200k_base.js.map +1 -0
  188. package/esm/encodingParams/{P50KBase.js → p50k_base.js} +4 -3
  189. package/esm/encodingParams/p50k_base.js.map +1 -0
  190. package/esm/encodingParams/{P50KEdit.js → p50k_edit.js} +4 -3
  191. package/esm/encodingParams/p50k_edit.js.map +1 -0
  192. package/esm/encodingParams/{R50KBase.js → r50k_base.js} +4 -3
  193. package/esm/encodingParams/r50k_base.js.map +1 -0
  194. package/esm/extraApis.test.d.ts +1 -0
  195. package/esm/extraApis.test.js +55 -0
  196. package/esm/extraApis.test.js.map +1 -0
  197. package/esm/model/gpt-3.5-turbo-0125.d.ts +2 -2
  198. package/esm/model/gpt-3.5-turbo-0125.js +2 -2
  199. package/esm/model/gpt-3.5-turbo-0125.js.map +1 -1
  200. package/esm/model/gpt-3.5-turbo-0301.d.ts +2 -2
  201. package/esm/model/gpt-3.5-turbo-0301.js +2 -2
  202. package/esm/model/gpt-3.5-turbo-0301.js.map +1 -1
  203. package/esm/model/gpt-3.5-turbo-0613.d.ts +2 -2
  204. package/esm/model/gpt-3.5-turbo-0613.js +2 -2
  205. package/esm/model/gpt-3.5-turbo-0613.js.map +1 -1
  206. package/esm/model/gpt-3.5-turbo-1106.d.ts +2 -2
  207. package/esm/model/gpt-3.5-turbo-1106.js +2 -2
  208. package/esm/model/gpt-3.5-turbo-1106.js.map +1 -1
  209. package/esm/model/gpt-3.5-turbo-16k-0613.d.ts +2 -2
  210. package/esm/model/gpt-3.5-turbo-16k-0613.js +2 -2
  211. package/esm/model/gpt-3.5-turbo-16k-0613.js.map +1 -1
  212. package/esm/model/gpt-3.5-turbo-16k.d.ts +2 -2
  213. package/esm/model/gpt-3.5-turbo-16k.js +2 -2
  214. package/esm/model/gpt-3.5-turbo-16k.js.map +1 -1
  215. package/esm/model/gpt-3.5-turbo-finetune.d.ts +2 -2
  216. package/esm/model/gpt-3.5-turbo-finetune.js +2 -2
  217. package/esm/model/gpt-3.5-turbo-finetune.js.map +1 -1
  218. package/esm/model/gpt-3.5-turbo.d.ts +2 -2
  219. package/esm/model/gpt-3.5-turbo.js +2 -2
  220. package/esm/model/gpt-3.5-turbo.js.map +1 -1
  221. package/esm/model/gpt-4-0125-preview.d.ts +2 -2
  222. package/esm/model/gpt-4-0125-preview.js +2 -2
  223. package/esm/model/gpt-4-0125-preview.js.map +1 -1
  224. package/esm/model/gpt-4-0314.d.ts +2 -2
  225. package/esm/model/gpt-4-0314.js +2 -2
  226. package/esm/model/gpt-4-0314.js.map +1 -1
  227. package/esm/model/gpt-4-0613.d.ts +2 -2
  228. package/esm/model/gpt-4-0613.js +2 -2
  229. package/esm/model/gpt-4-0613.js.map +1 -1
  230. package/esm/model/gpt-4-1106-preview.d.ts +2 -2
  231. package/esm/model/gpt-4-1106-preview.js +2 -2
  232. package/esm/model/gpt-4-1106-preview.js.map +1 -1
  233. package/esm/model/gpt-4-1106-vision-preview.d.ts +2 -2
  234. package/esm/model/gpt-4-1106-vision-preview.js +2 -2
  235. package/esm/model/gpt-4-1106-vision-preview.js.map +1 -1
  236. package/esm/model/gpt-4-32k-0314.d.ts +2 -2
  237. package/esm/model/gpt-4-32k-0314.js +2 -2
  238. package/esm/model/gpt-4-32k-0314.js.map +1 -1
  239. package/esm/model/gpt-4-32k-0613.d.ts +2 -2
  240. package/esm/model/gpt-4-32k-0613.js +2 -2
  241. package/esm/model/gpt-4-32k-0613.js.map +1 -1
  242. package/esm/model/gpt-4-32k.d.ts +2 -2
  243. package/esm/model/gpt-4-32k.js +2 -2
  244. package/esm/model/gpt-4-32k.js.map +1 -1
  245. package/esm/model/gpt-4-turbo-2024-04-09.d.ts +2 -2
  246. package/esm/model/gpt-4-turbo-2024-04-09.js +2 -2
  247. package/esm/model/gpt-4-turbo-2024-04-09.js.map +1 -1
  248. package/esm/model/gpt-4-turbo-preview.d.ts +2 -2
  249. package/esm/model/gpt-4-turbo-preview.js +2 -2
  250. package/esm/model/gpt-4-turbo-preview.js.map +1 -1
  251. package/esm/model/gpt-4-turbo.d.ts +2 -2
  252. package/esm/model/gpt-4-turbo.js +2 -2
  253. package/esm/model/gpt-4-turbo.js.map +1 -1
  254. package/esm/model/gpt-4-vision-preview.d.ts +2 -2
  255. package/esm/model/gpt-4-vision-preview.js +2 -2
  256. package/esm/model/gpt-4-vision-preview.js.map +1 -1
  257. package/esm/model/gpt-4.d.ts +2 -2
  258. package/esm/model/gpt-4.js +2 -2
  259. package/esm/model/gpt-4.js.map +1 -1
  260. package/esm/model/gpt-4o-2024-05-13.d.ts +2 -2
  261. package/esm/model/gpt-4o-2024-05-13.js +2 -2
  262. package/esm/model/gpt-4o-2024-05-13.js.map +1 -1
  263. package/esm/model/gpt-4o-2024-08-06-finetune.d.ts +2 -2
  264. package/esm/model/gpt-4o-2024-08-06-finetune.js +2 -2
  265. package/esm/model/gpt-4o-2024-08-06-finetune.js.map +1 -1
  266. package/esm/model/gpt-4o-2024-08-06.d.ts +2 -2
  267. package/esm/model/gpt-4o-2024-08-06.js +2 -2
  268. package/esm/model/gpt-4o-2024-08-06.js.map +1 -1
  269. package/esm/model/gpt-4o-audio-preview-2024-10-01.d.ts +2 -2
  270. package/esm/model/gpt-4o-audio-preview-2024-10-01.js +2 -2
  271. package/esm/model/gpt-4o-audio-preview-2024-10-01.js.map +1 -1
  272. package/esm/model/gpt-4o-audio-preview.d.ts +2 -2
  273. package/esm/model/gpt-4o-audio-preview.js +2 -2
  274. package/esm/model/gpt-4o-audio-preview.js.map +1 -1
  275. package/esm/model/gpt-4o-mini-2024-07-18-finetune.d.ts +2 -2
  276. package/esm/model/gpt-4o-mini-2024-07-18-finetune.js +2 -2
  277. package/esm/model/gpt-4o-mini-2024-07-18-finetune.js.map +1 -1
  278. package/esm/model/gpt-4o-mini-2024-07-18.d.ts +2 -2
  279. package/esm/model/gpt-4o-mini-2024-07-18.js +2 -2
  280. package/esm/model/gpt-4o-mini-2024-07-18.js.map +1 -1
  281. package/esm/model/gpt-4o-mini-training-2024-07-18.d.ts +2 -2
  282. package/esm/model/gpt-4o-mini-training-2024-07-18.js +2 -2
  283. package/esm/model/gpt-4o-mini-training-2024-07-18.js.map +1 -1
  284. package/esm/model/gpt-4o-mini-training.d.ts +2 -2
  285. package/esm/model/gpt-4o-mini-training.js +2 -2
  286. package/esm/model/gpt-4o-mini-training.js.map +1 -1
  287. package/esm/model/gpt-4o-mini.d.ts +2 -2
  288. package/esm/model/gpt-4o-mini.js +2 -2
  289. package/esm/model/gpt-4o-mini.js.map +1 -1
  290. package/esm/model/gpt-4o-realtime-preview-2024-10-01.d.ts +2 -2
  291. package/esm/model/gpt-4o-realtime-preview-2024-10-01.js +2 -2
  292. package/esm/model/gpt-4o-realtime-preview-2024-10-01.js.map +1 -1
  293. package/esm/model/gpt-4o-realtime-preview.d.ts +2 -2
  294. package/esm/model/gpt-4o-realtime-preview.js +2 -2
  295. package/esm/model/gpt-4o-realtime-preview.js.map +1 -1
  296. package/esm/model/gpt-4o.d.ts +2 -2
  297. package/esm/model/gpt-4o.js +2 -2
  298. package/esm/model/gpt-4o.js.map +1 -1
  299. package/esm/modelParams.d.ts +0 -3
  300. package/esm/modelParams.js +5 -10
  301. package/esm/modelParams.js.map +1 -1
  302. package/package.json +1 -1
  303. package/src/BytePairEncodingCore.ts +112 -8
  304. package/src/GptEncoding.ts +36 -31
  305. package/src/constants.ts +1 -0
  306. package/src/encoding/cl100k_base.ts +4 -0
  307. package/src/encoding/o200k_base.ts +4 -0
  308. package/src/encoding/p50k_base.ts +4 -0
  309. package/src/encoding/p50k_edit.ts +4 -0
  310. package/src/encoding/r50k_base.ts +4 -0
  311. package/src/encodingParams/{Cl100KBase.ts → cl100k_base.ts} +2 -2
  312. package/src/encodingParams/constants.ts +5 -0
  313. package/src/encodingParams/{O200KBase.ts → o200k_base.ts} +2 -2
  314. package/src/encodingParams/{P50KBase.ts → p50k_base.ts} +3 -2
  315. package/src/encodingParams/{P50KEdit.ts → p50k_edit.ts} +3 -2
  316. package/src/encodingParams/{R50KBase.ts → r50k_base.ts} +3 -2
  317. package/src/extraApis.test.ts +74 -0
  318. package/src/model/gpt-3.5-turbo-0125.ts +4 -0
  319. package/src/model/gpt-3.5-turbo-0301.ts +4 -0
  320. package/src/model/gpt-3.5-turbo-0613.ts +4 -0
  321. package/src/model/gpt-3.5-turbo-1106.ts +4 -0
  322. package/src/model/gpt-3.5-turbo-16k-0613.ts +4 -0
  323. package/src/model/gpt-3.5-turbo-16k.ts +4 -0
  324. package/src/model/gpt-3.5-turbo-finetune.ts +4 -0
  325. package/src/model/gpt-3.5-turbo.ts +4 -0
  326. package/src/model/gpt-4-0125-preview.ts +4 -0
  327. package/src/model/gpt-4-0314.ts +4 -0
  328. package/src/model/gpt-4-0613.ts +4 -0
  329. package/src/model/gpt-4-1106-preview.ts +4 -0
  330. package/src/model/gpt-4-1106-vision-preview.ts +4 -0
  331. package/src/model/gpt-4-32k-0314.ts +4 -0
  332. package/src/model/gpt-4-32k-0613.ts +4 -0
  333. package/src/model/gpt-4-32k.ts +4 -0
  334. package/src/model/gpt-4-turbo-2024-04-09.ts +4 -0
  335. package/src/model/gpt-4-turbo-preview.ts +4 -0
  336. package/src/model/gpt-4-turbo.ts +4 -0
  337. package/src/model/gpt-4-vision-preview.ts +4 -0
  338. package/src/model/gpt-4.ts +4 -0
  339. package/src/model/gpt-4o-2024-05-13.ts +4 -0
  340. package/src/model/gpt-4o-2024-08-06-finetune.ts +4 -0
  341. package/src/model/gpt-4o-2024-08-06.ts +4 -0
  342. package/src/model/gpt-4o-audio-preview-2024-10-01.ts +4 -0
  343. package/src/model/gpt-4o-audio-preview.ts +4 -0
  344. package/src/model/gpt-4o-mini-2024-07-18-finetune.ts +4 -0
  345. package/src/model/gpt-4o-mini-2024-07-18.ts +4 -0
  346. package/src/model/gpt-4o-mini-training-2024-07-18.ts +4 -0
  347. package/src/model/gpt-4o-mini-training.ts +4 -0
  348. package/src/model/gpt-4o-mini.ts +4 -0
  349. package/src/model/gpt-4o-realtime-preview-2024-10-01.ts +4 -0
  350. package/src/model/gpt-4o-realtime-preview.ts +4 -0
  351. package/src/model/gpt-4o.ts +4 -0
  352. package/src/modelParams.ts +5 -19
  353. package/cjs/encodingParams/Cl100KBase.js.map +0 -1
  354. package/cjs/encodingParams/O200KBase.js.map +0 -1
  355. package/cjs/encodingParams/P50KBase.js.map +0 -1
  356. package/cjs/encodingParams/P50KEdit.js.map +0 -1
  357. package/cjs/encodingParams/R50KBase.js.map +0 -1
  358. package/esm/encodingParams/Cl100KBase.js.map +0 -1
  359. package/esm/encodingParams/O200KBase.js.map +0 -1
  360. package/esm/encodingParams/P50KBase.js.map +0 -1
  361. package/esm/encodingParams/P50KEdit.js.map +0 -1
  362. package/esm/encodingParams/R50KBase.js.map +0 -1
  363. /package/cjs/encodingParams/{Cl100KBase.d.ts → cl100k_base.d.ts} +0 -0
  364. /package/cjs/encodingParams/{O200KBase.d.ts → o200k_base.d.ts} +0 -0
  365. /package/cjs/encodingParams/{P50KBase.d.ts → p50k_base.d.ts} +0 -0
  366. /package/cjs/encodingParams/{P50KEdit.d.ts → p50k_edit.d.ts} +0 -0
  367. /package/cjs/encodingParams/{R50KBase.d.ts → r50k_base.d.ts} +0 -0
  368. /package/esm/encodingParams/{Cl100KBase.d.ts → cl100k_base.d.ts} +0 -0
  369. /package/esm/encodingParams/{O200KBase.d.ts → o200k_base.d.ts} +0 -0
  370. /package/esm/encodingParams/{P50KBase.d.ts → p50k_base.d.ts} +0 -0
  371. /package/esm/encodingParams/{P50KEdit.d.ts → p50k_edit.d.ts} +0 -0
  372. /package/esm/encodingParams/{R50KBase.d.ts → r50k_base.d.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gpt-tokenizer",
3
- "version": "2.7.0",
3
+ "version": "2.8.1",
4
4
  "description": "A pure JavaScript implementation of a BPE tokenizer (Encoder/Decoder) for GPT-2 / GPT-3 / GPT-4 and other OpenAI models",
5
5
  "keywords": [
6
6
  "BPE",
@@ -1,5 +1,6 @@
1
1
  /* eslint-disable no-continue */
2
2
 
3
+ import { DEFAULT_MERGE_CACHE_SIZE } from './constants.js'
3
4
  import { compareUint8Arrays, isAscii, tryConvertToString } from './utfUtil.js'
4
5
  import { escapeRegExp } from './util.js'
5
6
 
@@ -9,6 +10,13 @@ export interface BytePairEncodingConfig {
9
10
  bytePairRankDecoder: RawBytePairRanks
10
11
  specialTokensEncoder?: Map<string, number>
11
12
  tokenSplitRegex: RegExp
13
+ /**
14
+ * LRU cache for merged tokens pairs.
15
+ * Increasing this value should make encoding similar strings faster,
16
+ * but will consume more memory.
17
+ * @default 100000
18
+ */
19
+ mergeCacheSize?: number
12
20
  }
13
21
 
14
22
  const emptyBuffer = new Uint8Array(0)
@@ -36,14 +44,21 @@ export class BytePairEncodingCore {
36
44
  private specialTokensDecoder: Map<number, string>
37
45
  private specialTokenPatternRegex: RegExp
38
46
  private textEncoder = new TextEncoder()
47
+ private mergeCache?: Map<string, number[]>
48
+ private mergeCacheSize: number
39
49
 
40
50
  constructor({
41
51
  bytePairRankDecoder,
42
52
  specialTokensEncoder,
43
53
  tokenSplitRegex,
54
+ mergeCacheSize = DEFAULT_MERGE_CACHE_SIZE,
44
55
  }: BytePairEncodingConfig) {
45
56
  this.bytePairRankDecoder = bytePairRankDecoder
46
57
  this.bytePairStringRankEncoder = new Map<string, number>()
58
+ this.mergeCacheSize = mergeCacheSize
59
+ if (mergeCacheSize > 0) {
60
+ this.mergeCache = new Map()
61
+ }
47
62
 
48
63
  // size without array holes (which may be present in the encoder)
49
64
  this.mergeableBytePairRankCount = Object.keys(bytePairRankDecoder).length
@@ -73,12 +88,26 @@ export class BytePairEncodingCore {
73
88
  )
74
89
  const allSpecialTokensRegex = escapedSpecialTokens.join('|')
75
90
  try {
76
- this.specialTokenPatternRegex = new RegExp(allSpecialTokensRegex)
91
+ this.specialTokenPatternRegex = new RegExp(allSpecialTokensRegex, 'y')
77
92
  } catch {
78
93
  throw new Error('Invalid regular expression pattern.')
79
94
  }
80
95
  }
81
96
 
97
+ setMergeCacheSize(newSize: number): void {
98
+ if (this.mergeCacheSize === 0 && newSize > 0) {
99
+ this.mergeCache = new Map()
100
+ }
101
+ this.mergeCacheSize = newSize
102
+ if (newSize === 0) {
103
+ this.mergeCache = undefined
104
+ }
105
+ }
106
+
107
+ clearMergeCache(): void {
108
+ this.mergeCache?.clear()
109
+ }
110
+
82
111
  *encodeNativeGenerator(
83
112
  text: string,
84
113
  allowedSpecial?: Set<string>,
@@ -96,7 +125,10 @@ export class BytePairEncodingCore {
96
125
 
97
126
  const endIndex = nextSpecialStartIndex ?? text.length
98
127
 
99
- const textBeforeSpecial = text.slice(startIndex, endIndex)
128
+ const textBeforeSpecial =
129
+ startIndex === 0 && endIndex === text.length
130
+ ? text
131
+ : text.slice(startIndex, endIndex)
100
132
 
101
133
  for (const [match] of textBeforeSpecial.matchAll(this.tokenSplitRegex)) {
102
134
  const token = this.getBpeRankFromString(match)
@@ -146,7 +178,10 @@ export class BytePairEncodingCore {
146
178
 
147
179
  const endIndex = nextSpecialStartIndex ?? text.length
148
180
 
149
- const textBeforeSpecial = text.slice(startIndex, endIndex)
181
+ const textBeforeSpecial =
182
+ startIndex === 0 && endIndex === text.length
183
+ ? text
184
+ : text.slice(startIndex, endIndex)
150
185
 
151
186
  for (const [match] of textBeforeSpecial.matchAll(this.tokenSplitRegex)) {
152
187
  const token = this.getBpeRankFromString(match)
@@ -178,6 +213,56 @@ export class BytePairEncodingCore {
178
213
  return tokensArray
179
214
  }
180
215
 
216
+ countNative(text: string, allowedSpecial?: Set<string>): number {
217
+ let startIndex = 0
218
+ let tokensCount = 0
219
+
220
+ // eslint-disable-next-line no-constant-condition
221
+ while (true) {
222
+ const nextSpecialMatch = this.findNextSpecialToken(
223
+ text,
224
+ allowedSpecial,
225
+ startIndex,
226
+ )
227
+ const nextSpecialStartIndex = nextSpecialMatch?.[0]
228
+
229
+ const endIndex = nextSpecialStartIndex ?? text.length
230
+
231
+ const textBeforeSpecial =
232
+ startIndex === 0 && endIndex === text.length
233
+ ? text
234
+ : text.slice(startIndex, endIndex)
235
+
236
+ for (const [match] of textBeforeSpecial.matchAll(this.tokenSplitRegex)) {
237
+ const token = this.getBpeRankFromString(match)
238
+ if (token !== undefined) {
239
+ tokensCount++
240
+
241
+ continue
242
+ }
243
+
244
+ const tokens = this.bytePairEncode(match)
245
+ tokensCount += tokens.length
246
+ }
247
+
248
+ if (nextSpecialStartIndex !== undefined) {
249
+ const specialToken = nextSpecialMatch![1]
250
+ const specialTokenValue = this.specialTokensEncoder.get(specialToken)
251
+ if (specialTokenValue === undefined) {
252
+ throw new Error(
253
+ `Special token "${specialToken}" is not in the special token encoder.`,
254
+ )
255
+ }
256
+ tokensCount++
257
+ startIndex = nextSpecialStartIndex + specialToken.length
258
+ } else {
259
+ break
260
+ }
261
+ }
262
+
263
+ return tokensCount
264
+ }
265
+
181
266
  *decodeNativeGenerator(
182
267
  tokens: Iterable<number>,
183
268
  ): Generator<Uint8Array | string, void, void> {
@@ -308,9 +393,8 @@ export class BytePairEncodingCore {
308
393
 
309
394
  // eslint-disable-next-line no-constant-condition
310
395
  while (true) {
311
- const nextSpecialMatch = this.specialTokenPatternRegex.exec(
312
- text.slice(Math.max(0, searchIndex)),
313
- )
396
+ this.specialTokenPatternRegex.lastIndex = searchIndex
397
+ const nextSpecialMatch = this.specialTokenPatternRegex.exec(text)
314
398
 
315
399
  if (!nextSpecialMatch) {
316
400
  return undefined
@@ -341,14 +425,34 @@ export class BytePairEncodingCore {
341
425
  return this.specialTokensDecoder.get(tokenRank)
342
426
  }
343
427
 
428
+ private addToMergeCache(key: string, value: number[]): void {
429
+ if (!this.mergeCache) return
430
+
431
+ if (this.mergeCache.size >= this.mergeCacheSize) {
432
+ // Remove least recently used item (first item)
433
+ const firstKey = this.mergeCache.keys().next().value!
434
+ this.mergeCache.delete(firstKey)
435
+ }
436
+ this.mergeCache.set(key, value)
437
+ }
438
+
344
439
  private bytePairEncode(input: string): number[] {
345
440
  if (input.length === 1 && isAscii(input.codePointAt(0)!)) {
346
441
  return [this.getBpeRankFromStringOrThrow(input)]
347
442
  }
348
443
 
349
- const inputBytes = this.textEncoder.encode(input)
444
+ if (this.mergeCache?.has(input)) {
445
+ const result = this.mergeCache.get(input)!
446
+ // Move to end to mark as recently used
447
+ this.mergeCache.delete(input)
448
+ this.mergeCache.set(input, result)
449
+ return result
450
+ }
350
451
 
351
- return this.bytePairMerge(inputBytes)
452
+ const inputBytes = this.textEncoder.encode(input)
453
+ const result = this.bytePairMerge(inputBytes)
454
+ this.addToMergeCache(input, result)
455
+ return result
352
456
  }
353
457
 
354
458
  private bytePairMerge(
@@ -12,10 +12,8 @@ import {
12
12
  } from './mapping.js'
13
13
  import {
14
14
  type EncodingParams,
15
- type GetMergeableRanksAsyncFn,
16
15
  type GetMergeableRanksFn,
17
16
  getEncodingParams,
18
- getModelParamsAsync,
19
17
  } from './modelParams.js'
20
18
  import {
21
19
  EndOfPrompt,
@@ -129,6 +127,8 @@ export class GptEncoding {
129
127
  this.encodeChat = this.encodeChat.bind(this)
130
128
  this.encodeChatGenerator = this.encodeChatGenerator.bind(this)
131
129
  this.countTokens = this.countTokens.bind(this)
130
+ this.setMergeCacheSize = this.setMergeCacheSize.bind(this)
131
+ this.clearMergeCache = this.clearMergeCache.bind(this)
132
132
  this.modelName = modelName
133
133
  }
134
134
 
@@ -149,29 +149,6 @@ export class GptEncoding {
149
149
  return new GptEncoding({ ...modelParams, modelName })
150
150
  }
151
151
 
152
- static async getEncodingApiAsync(
153
- encodingName: EncodingName,
154
- getMergeableRanks: GetMergeableRanksAsyncFn,
155
- ): Promise<GptEncoding> {
156
- const modelParams = await getModelParamsAsync(
157
- encodingName,
158
- getMergeableRanks,
159
- )
160
- return new GptEncoding(modelParams)
161
- }
162
-
163
- static async getEncodingApiForModelAsync(
164
- modelName: ModelName,
165
- getMergeableRanks: GetMergeableRanksAsyncFn,
166
- ): Promise<GptEncoding> {
167
- const encodingName = modelToEncodingMap[modelName]
168
- const modelParams = await getModelParamsAsync(
169
- encodingName,
170
- getMergeableRanks,
171
- )
172
- return new GptEncoding({ ...modelParams, modelName })
173
- }
174
-
175
152
  private processSpecialTokens({
176
153
  allowedSpecial,
177
154
  disallowedSpecial,
@@ -210,7 +187,9 @@ export class GptEncoding {
210
187
  allowedSpecial.forEach((val) => disallowedSpecialSet.delete(val))
211
188
  // disallowed takes precedence over allowed
212
189
  disallowedSpecial.forEach((val) => allowedSpecial.delete(val))
213
- regexPattern = getSpecialTokenRegex(disallowedSpecial)
190
+ if (disallowedSpecial.size > 0) {
191
+ regexPattern = getSpecialTokenRegex(disallowedSpecial)
192
+ }
214
193
  } else {
215
194
  regexPattern = this.allSpecialTokenRegex
216
195
  }
@@ -354,11 +333,29 @@ export class GptEncoding {
354
333
  * Counts the number of tokens in the input.
355
334
  * @returns {number} The number of tokens.
356
335
  */
357
- countTokens(input: string | Iterable<ChatMessage>): number {
358
- const tokenGenerator =
359
- typeof input === 'string'
360
- ? this.encodeGenerator(input)
361
- : this.encodeChatGenerator(input)
336
+ countTokens(
337
+ input: string | Iterable<ChatMessage>,
338
+ encodeOptions?: EncodeOptions,
339
+ ): number {
340
+ if (typeof input === 'string') {
341
+ const specialTokenConfig = encodeOptions
342
+ ? this.processSpecialTokens(encodeOptions)
343
+ : this.defaultSpecialTokenConfig
344
+
345
+ if (specialTokenConfig.regexPattern) {
346
+ const match = input.match(specialTokenConfig.regexPattern)
347
+ if (match !== null) {
348
+ throw new Error(`Disallowed special token found: ${match[0]}`)
349
+ }
350
+ }
351
+
352
+ return this.bytePairEncodingCoreProcessor.countNative(
353
+ input,
354
+ specialTokenConfig.allowedSpecial,
355
+ )
356
+ }
357
+
358
+ const tokenGenerator = this.encodeChatGenerator(input)
362
359
  let count = 0
363
360
  for (const tokens of tokenGenerator) {
364
361
  count += tokens.length
@@ -366,6 +363,14 @@ export class GptEncoding {
366
363
  return count
367
364
  }
368
365
 
366
+ setMergeCacheSize(size: number): void {
367
+ this.bytePairEncodingCoreProcessor.setMergeCacheSize(size)
368
+ }
369
+
370
+ clearMergeCache(): void {
371
+ this.bytePairEncodingCoreProcessor.clearMergeCache()
372
+ }
373
+
369
374
  decode(inputTokensToDecode: Iterable<number>): string {
370
375
  return this.bytePairEncodingCoreProcessor.decodeNative(inputTokensToDecode)
371
376
  }
package/src/constants.ts CHANGED
@@ -1 +1,2 @@
1
1
  export const ALL_SPECIAL_TOKENS = 'all'
2
+ export const DEFAULT_MERGE_CACHE_SIZE = 100_000
@@ -17,8 +17,11 @@ const {
17
17
  encodeChat,
18
18
  encodeChatGenerator,
19
19
  vocabularySize,
20
+ setMergeCacheSize,
21
+ clearMergeCache,
20
22
  } = api
21
23
  export {
24
+ clearMergeCache,
22
25
  countTokens,
23
26
  decode,
24
27
  decodeAsyncGenerator,
@@ -28,6 +31,7 @@ export {
28
31
  encodeChatGenerator,
29
32
  encodeGenerator,
30
33
  isWithinTokenLimit,
34
+ setMergeCacheSize,
31
35
  vocabularySize,
32
36
  }
33
37
  // eslint-disable-next-line import/no-default-export
@@ -17,8 +17,11 @@ const {
17
17
  encodeChat,
18
18
  encodeChatGenerator,
19
19
  vocabularySize,
20
+ setMergeCacheSize,
21
+ clearMergeCache,
20
22
  } = api
21
23
  export {
24
+ clearMergeCache,
22
25
  countTokens,
23
26
  decode,
24
27
  decodeAsyncGenerator,
@@ -28,6 +31,7 @@ export {
28
31
  encodeChatGenerator,
29
32
  encodeGenerator,
30
33
  isWithinTokenLimit,
34
+ setMergeCacheSize,
31
35
  vocabularySize,
32
36
  }
33
37
  // eslint-disable-next-line import/no-default-export
@@ -15,8 +15,11 @@ const {
15
15
  isWithinTokenLimit,
16
16
  countTokens,
17
17
  vocabularySize,
18
+ setMergeCacheSize,
19
+ clearMergeCache,
18
20
  } = api
19
21
  export {
22
+ clearMergeCache,
20
23
  countTokens,
21
24
  decode,
22
25
  decodeAsyncGenerator,
@@ -24,6 +27,7 @@ export {
24
27
  encode,
25
28
  encodeGenerator,
26
29
  isWithinTokenLimit,
30
+ setMergeCacheSize,
27
31
  vocabularySize,
28
32
  }
29
33
  // eslint-disable-next-line import/no-default-export
@@ -15,8 +15,11 @@ const {
15
15
  isWithinTokenLimit,
16
16
  countTokens,
17
17
  vocabularySize,
18
+ setMergeCacheSize,
19
+ clearMergeCache,
18
20
  } = api
19
21
  export {
22
+ clearMergeCache,
20
23
  countTokens,
21
24
  decode,
22
25
  decodeAsyncGenerator,
@@ -24,6 +27,7 @@ export {
24
27
  encode,
25
28
  encodeGenerator,
26
29
  isWithinTokenLimit,
30
+ setMergeCacheSize,
27
31
  vocabularySize,
28
32
  }
29
33
  // eslint-disable-next-line import/no-default-export
@@ -15,8 +15,11 @@ const {
15
15
  isWithinTokenLimit,
16
16
  countTokens,
17
17
  vocabularySize,
18
+ setMergeCacheSize,
19
+ clearMergeCache,
18
20
  } = api
19
21
  export {
22
+ clearMergeCache,
20
23
  countTokens,
21
24
  decode,
22
25
  decodeAsyncGenerator,
@@ -24,6 +27,7 @@ export {
24
27
  encode,
25
28
  encodeGenerator,
26
29
  isWithinTokenLimit,
30
+ setMergeCacheSize,
27
31
  vocabularySize,
28
32
  }
29
33
  // eslint-disable-next-line import/no-default-export
@@ -11,6 +11,7 @@ import {
11
11
  ImSep,
12
12
  ImStart,
13
13
  } from '../specialTokens.js'
14
+ import { CL_AND_O_TOKEN_SPLIT_PATTERN } from './constants.js'
14
15
 
15
16
  export function Cl100KBase(
16
17
  bytePairRankDecoder: RawBytePairRanks,
@@ -27,8 +28,7 @@ export function Cl100KBase(
27
28
  ])
28
29
 
29
30
  return {
30
- tokenSplitRegex:
31
- /(?:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|\p{N}{1,3}| ?[^\s\p{L}\p{N}]+[\r\n]*|\s*[\r\n]+|\s+(?!\S)|\s+/giu,
31
+ tokenSplitRegex: CL_AND_O_TOKEN_SPLIT_PATTERN,
32
32
  bytePairRankDecoder,
33
33
  specialTokensEncoder: specialTokenMapping,
34
34
  }
@@ -0,0 +1,5 @@
1
+ export const R50K_TOKEN_SPLIT_REGEX =
2
+ /'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+/gu
3
+
4
+ export const CL_AND_O_TOKEN_SPLIT_PATTERN =
5
+ /(?:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|\p{N}{1,3}| ?[^\s\p{L}\p{N}]+[\r\n]*|\s*[\r\n]+|\s+(?!\S)|\s+/giu
@@ -11,6 +11,7 @@ import {
11
11
  ImSep,
12
12
  ImStart,
13
13
  } from '../specialTokens.js'
14
+ import { CL_AND_O_TOKEN_SPLIT_PATTERN } from './constants.js'
14
15
 
15
16
  export function O200KBase(
16
17
  bytePairRankDecoder: RawBytePairRanks,
@@ -27,8 +28,7 @@ export function O200KBase(
27
28
  ])
28
29
 
29
30
  return {
30
- tokenSplitRegex:
31
- /(?:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|\p{N}{1,3}| ?[^\s\p{L}\p{N}]+[\r\n]*|\s*[\r\n]+|\s+(?!\S)|\s+/giu,
31
+ tokenSplitRegex: CL_AND_O_TOKEN_SPLIT_PATTERN,
32
32
  bytePairRankDecoder,
33
33
  specialTokensEncoder: specialTokenMapping,
34
34
  }
@@ -1,14 +1,15 @@
1
1
  /* eslint-disable no-magic-numbers */
2
2
  import type { RawBytePairRanks } from '../BytePairEncodingCore.js'
3
- import { type EncodingParams, tokenSplitRegex } from '../modelParams.js'
3
+ import { type EncodingParams } from '../modelParams.js'
4
4
  import { EndOfText } from '../specialTokens.js'
5
+ import { R50K_TOKEN_SPLIT_REGEX } from './constants.js'
5
6
 
6
7
  export function P50KBase(
7
8
  bytePairRankDecoder: RawBytePairRanks,
8
9
  ): EncodingParams {
9
10
  return {
10
11
  expectedVocabularySize: 50_281,
11
- tokenSplitRegex,
12
+ tokenSplitRegex: R50K_TOKEN_SPLIT_REGEX,
12
13
  bytePairRankDecoder,
13
14
  specialTokensEncoder: new Map<string, number>([[EndOfText, 50_256]]),
14
15
  }
@@ -1,7 +1,8 @@
1
1
  /* eslint-disable no-magic-numbers */
2
2
  import type { RawBytePairRanks } from '../BytePairEncodingCore.js'
3
- import { type EncodingParams, tokenSplitRegex } from '../modelParams.js'
3
+ import { type EncodingParams } from '../modelParams.js'
4
4
  import { EndOfText, FimMiddle, FimPrefix, FimSuffix } from '../specialTokens.js'
5
+ import { R50K_TOKEN_SPLIT_REGEX } from './constants.js'
5
6
 
6
7
  export function P50KEdit(
7
8
  bytePairRankDecoder: RawBytePairRanks,
@@ -14,7 +15,7 @@ export function P50KEdit(
14
15
  ])
15
16
 
16
17
  return {
17
- tokenSplitRegex,
18
+ tokenSplitRegex: R50K_TOKEN_SPLIT_REGEX,
18
19
  bytePairRankDecoder,
19
20
  specialTokensEncoder: specialTokenMapping,
20
21
  }
@@ -1,14 +1,15 @@
1
1
  /* eslint-disable no-magic-numbers */
2
2
  import type { RawBytePairRanks } from '../BytePairEncodingCore.js'
3
- import { type EncodingParams, tokenSplitRegex } from '../modelParams.js'
3
+ import { type EncodingParams } from '../modelParams.js'
4
4
  import { EndOfText } from '../specialTokens.js'
5
+ import { R50K_TOKEN_SPLIT_REGEX } from './constants.js'
5
6
 
6
7
  export function R50KBase(
7
8
  bytePairRankDecoder: RawBytePairRanks,
8
9
  ): EncodingParams {
9
10
  return {
10
11
  expectedVocabularySize: 50_257,
11
- tokenSplitRegex,
12
+ tokenSplitRegex: R50K_TOKEN_SPLIT_REGEX,
12
13
  bytePairRankDecoder,
13
14
  specialTokensEncoder: new Map<string, number>([[EndOfText, 50_256]]),
14
15
  }
@@ -0,0 +1,74 @@
1
+ import { type ChatMessage, GptEncoding } from './GptEncoding.js'
2
+ import { resolveEncoding } from './resolveEncoding.js'
3
+
4
+ const sampleText = 'This is a test message.'
5
+ const sampleChat: ChatMessage[] = [
6
+ {
7
+ role: 'system',
8
+ content: 'You are a helpful assistant.',
9
+ },
10
+ {
11
+ role: 'user',
12
+ content: 'Hello, how are you?',
13
+ },
14
+ {
15
+ role: 'assistant',
16
+ content: 'I am doing well, thank you for asking.',
17
+ },
18
+ ]
19
+
20
+ describe('countTokens', () => {
21
+ const encoding = GptEncoding.getEncodingApiForModel(
22
+ 'gpt-3.5-turbo',
23
+ resolveEncoding,
24
+ )
25
+
26
+ describe('text input', () => {
27
+ it('counts tokens in empty string', () => {
28
+ expect(encoding.countTokens('')).toBe(0)
29
+ })
30
+
31
+ it('counts tokens in simple text', () => {
32
+ expect(encoding.countTokens(sampleText)).toBe(
33
+ encoding.encode(sampleText).length,
34
+ )
35
+ })
36
+
37
+ it('counts tokens in text with special characters', () => {
38
+ const textWithSpecial = 'Hello 👋 world! 🌍'
39
+ expect(encoding.countTokens(textWithSpecial)).toBe(
40
+ encoding.encode(textWithSpecial).length,
41
+ )
42
+ })
43
+ })
44
+
45
+ describe('chat input', () => {
46
+ it('counts tokens in empty chat', () => {
47
+ expect(encoding.countTokens([])).toBe(3) // Due to assistant prompt tokens
48
+ })
49
+
50
+ it('counts tokens in sample chat', () => {
51
+ expect(encoding.countTokens(sampleChat)).toBe(
52
+ encoding.encodeChat(sampleChat).length,
53
+ )
54
+ })
55
+
56
+ it('matches token counts from encode methods', () => {
57
+ const tokens = encoding.encodeChat(sampleChat)
58
+ const count = encoding.countTokens(sampleChat)
59
+ expect(count).toBe(tokens.length)
60
+ })
61
+
62
+ it('counts tokens in single message chat', () => {
63
+ const singleMessage = [
64
+ {
65
+ role: 'user',
66
+ content: 'Hello world',
67
+ },
68
+ ] as const
69
+ expect(encoding.countTokens(singleMessage)).toBe(
70
+ encoding.encodeChat(singleMessage).length,
71
+ )
72
+ })
73
+ })
74
+ })
@@ -13,11 +13,14 @@ const {
13
13
  encode,
14
14
  encodeGenerator,
15
15
  isWithinTokenLimit,
16
+ countTokens,
16
17
  encodeChat,
17
18
  encodeChatGenerator,
18
19
  vocabularySize,
20
+ setMergeCacheSize,
19
21
  } = api
20
22
  export {
23
+ countTokens,
21
24
  decode,
22
25
  decodeAsyncGenerator,
23
26
  decodeGenerator,
@@ -26,6 +29,7 @@ export {
26
29
  encodeChatGenerator,
27
30
  encodeGenerator,
28
31
  isWithinTokenLimit,
32
+ setMergeCacheSize,
29
33
  vocabularySize,
30
34
  }
31
35
  // eslint-disable-next-line import/no-default-export
@@ -13,11 +13,14 @@ const {
13
13
  encode,
14
14
  encodeGenerator,
15
15
  isWithinTokenLimit,
16
+ countTokens,
16
17
  encodeChat,
17
18
  encodeChatGenerator,
18
19
  vocabularySize,
20
+ setMergeCacheSize,
19
21
  } = api
20
22
  export {
23
+ countTokens,
21
24
  decode,
22
25
  decodeAsyncGenerator,
23
26
  decodeGenerator,
@@ -26,6 +29,7 @@ export {
26
29
  encodeChatGenerator,
27
30
  encodeGenerator,
28
31
  isWithinTokenLimit,
32
+ setMergeCacheSize,
29
33
  vocabularySize,
30
34
  }
31
35
  // eslint-disable-next-line import/no-default-export
@@ -13,11 +13,14 @@ const {
13
13
  encode,
14
14
  encodeGenerator,
15
15
  isWithinTokenLimit,
16
+ countTokens,
16
17
  encodeChat,
17
18
  encodeChatGenerator,
18
19
  vocabularySize,
20
+ setMergeCacheSize,
19
21
  } = api
20
22
  export {
23
+ countTokens,
21
24
  decode,
22
25
  decodeAsyncGenerator,
23
26
  decodeGenerator,
@@ -26,6 +29,7 @@ export {
26
29
  encodeChatGenerator,
27
30
  encodeGenerator,
28
31
  isWithinTokenLimit,
32
+ setMergeCacheSize,
29
33
  vocabularySize,
30
34
  }
31
35
  // eslint-disable-next-line import/no-default-export
@@ -13,11 +13,14 @@ const {
13
13
  encode,
14
14
  encodeGenerator,
15
15
  isWithinTokenLimit,
16
+ countTokens,
16
17
  encodeChat,
17
18
  encodeChatGenerator,
18
19
  vocabularySize,
20
+ setMergeCacheSize,
19
21
  } = api
20
22
  export {
23
+ countTokens,
21
24
  decode,
22
25
  decodeAsyncGenerator,
23
26
  decodeGenerator,
@@ -26,6 +29,7 @@ export {
26
29
  encodeChatGenerator,
27
30
  encodeGenerator,
28
31
  isWithinTokenLimit,
32
+ setMergeCacheSize,
29
33
  vocabularySize,
30
34
  }
31
35
  // eslint-disable-next-line import/no-default-export