gpt-tokenizer 2.0.0 → 2.1.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 (328) hide show
  1. package/README.md +54 -8
  2. package/cjs/GptEncoding.d.ts +33 -6
  3. package/cjs/GptEncoding.js +79 -34
  4. package/cjs/GptEncoding.js.map +1 -1
  5. package/cjs/GptEncoding.test.js +54 -0
  6. package/cjs/GptEncoding.test.js.map +1 -1
  7. package/cjs/encoding/cl100k_base.d.ts +2 -2
  8. package/cjs/encoding/cl100k_base.js +4 -2
  9. package/cjs/encoding/cl100k_base.js.map +1 -1
  10. package/cjs/encoding/p50k_base.d.ts +1 -1
  11. package/cjs/encoding/p50k_edit.d.ts +1 -1
  12. package/cjs/encoding/r50k_base.d.ts +1 -1
  13. package/cjs/main.d.ts +1 -0
  14. package/cjs/main.js +7 -0
  15. package/cjs/main.js.map +1 -1
  16. package/cjs/mapping.d.ts +37 -0
  17. package/cjs/mapping.js +34 -2
  18. package/cjs/mapping.js.map +1 -1
  19. package/cjs/model/ada.d.ts +1 -0
  20. package/cjs/model/ada.js +7 -0
  21. package/cjs/model/ada.js.map +1 -1
  22. package/cjs/model/babbage.d.ts +1 -0
  23. package/cjs/model/babbage.js +7 -0
  24. package/cjs/model/babbage.js.map +1 -1
  25. package/cjs/model/code-cushman-001.d.ts +1 -0
  26. package/cjs/model/code-cushman-001.js +7 -0
  27. package/cjs/model/code-cushman-001.js.map +1 -1
  28. package/cjs/model/code-cushman-002.d.ts +1 -0
  29. package/cjs/model/code-cushman-002.js +7 -0
  30. package/cjs/model/code-cushman-002.js.map +1 -1
  31. package/cjs/model/code-davinci-001.d.ts +1 -0
  32. package/cjs/model/code-davinci-001.js +7 -0
  33. package/cjs/model/code-davinci-001.js.map +1 -1
  34. package/cjs/model/code-davinci-002.d.ts +1 -0
  35. package/cjs/model/code-davinci-002.js +7 -0
  36. package/cjs/model/code-davinci-002.js.map +1 -1
  37. package/cjs/model/code-davinci-edit-001.d.ts +1 -0
  38. package/cjs/model/code-davinci-edit-001.js +7 -0
  39. package/cjs/model/code-davinci-edit-001.js.map +1 -1
  40. package/cjs/model/code-search-ada-code-001.d.ts +1 -0
  41. package/cjs/model/code-search-ada-code-001.js +7 -0
  42. package/cjs/model/code-search-ada-code-001.js.map +1 -1
  43. package/cjs/model/code-search-babbage-code-001.d.ts +1 -0
  44. package/cjs/model/code-search-babbage-code-001.js +7 -0
  45. package/cjs/model/code-search-babbage-code-001.js.map +1 -1
  46. package/cjs/model/curie.d.ts +1 -0
  47. package/cjs/model/curie.js +7 -0
  48. package/cjs/model/curie.js.map +1 -1
  49. package/cjs/model/cushman-codex.d.ts +1 -0
  50. package/cjs/model/cushman-codex.js +7 -0
  51. package/cjs/model/cushman-codex.js.map +1 -1
  52. package/cjs/model/davinci-codex.d.ts +1 -0
  53. package/cjs/model/davinci-codex.js +7 -0
  54. package/cjs/model/davinci-codex.js.map +1 -1
  55. package/cjs/model/davinci.d.ts +1 -0
  56. package/cjs/model/davinci.js +7 -0
  57. package/cjs/model/davinci.js.map +1 -1
  58. package/cjs/model/gpt-3.5-turbo-0301.d.ts +6 -0
  59. package/cjs/model/gpt-3.5-turbo-0301.js +38 -0
  60. package/cjs/model/gpt-3.5-turbo-0301.js.map +1 -0
  61. package/cjs/model/gpt-3.5-turbo.d.ts +6 -1
  62. package/cjs/model/gpt-3.5-turbo.js +21 -1
  63. package/cjs/model/gpt-3.5-turbo.js.map +1 -1
  64. package/cjs/model/gpt-4-0314.d.ts +6 -0
  65. package/cjs/model/gpt-4-0314.js +38 -0
  66. package/cjs/model/gpt-4-0314.js.map +1 -0
  67. package/cjs/model/gpt-4-32k-0314.d.ts +6 -0
  68. package/cjs/model/gpt-4-32k-0314.js +38 -0
  69. package/cjs/model/gpt-4-32k-0314.js.map +1 -0
  70. package/cjs/model/gpt-4-32k.d.ts +6 -0
  71. package/cjs/model/gpt-4-32k.js +38 -0
  72. package/cjs/model/gpt-4-32k.js.map +1 -0
  73. package/cjs/model/gpt-4.d.ts +6 -1
  74. package/cjs/model/gpt-4.js +21 -1
  75. package/cjs/model/gpt-4.js.map +1 -1
  76. package/cjs/model/text-ada-001.d.ts +1 -0
  77. package/cjs/model/text-ada-001.js +7 -0
  78. package/cjs/model/text-ada-001.js.map +1 -1
  79. package/cjs/model/text-babbage-001.d.ts +1 -0
  80. package/cjs/model/text-babbage-001.js +7 -0
  81. package/cjs/model/text-babbage-001.js.map +1 -1
  82. package/cjs/model/text-curie-001.d.ts +1 -0
  83. package/cjs/model/text-curie-001.js +7 -0
  84. package/cjs/model/text-curie-001.js.map +1 -1
  85. package/cjs/model/text-davinci-001.d.ts +1 -0
  86. package/cjs/model/text-davinci-001.js +7 -0
  87. package/cjs/model/text-davinci-001.js.map +1 -1
  88. package/cjs/model/text-davinci-002.d.ts +1 -0
  89. package/cjs/model/text-davinci-002.js +7 -0
  90. package/cjs/model/text-davinci-002.js.map +1 -1
  91. package/cjs/model/text-davinci-003.d.ts +1 -0
  92. package/cjs/model/text-davinci-003.js +7 -0
  93. package/cjs/model/text-davinci-003.js.map +1 -1
  94. package/cjs/model/text-davinci-edit-001.d.ts +1 -0
  95. package/cjs/model/text-davinci-edit-001.js +7 -0
  96. package/cjs/model/text-davinci-edit-001.js.map +1 -1
  97. package/cjs/model/text-embedding-ada-002.d.ts +1 -0
  98. package/cjs/model/text-embedding-ada-002.js +7 -0
  99. package/cjs/model/text-embedding-ada-002.js.map +1 -1
  100. package/cjs/model/text-search-ada-doc-001.d.ts +1 -0
  101. package/cjs/model/text-search-ada-doc-001.js +7 -0
  102. package/cjs/model/text-search-ada-doc-001.js.map +1 -1
  103. package/cjs/model/text-search-babbage-doc-001.d.ts +1 -0
  104. package/cjs/model/text-search-babbage-doc-001.js +7 -0
  105. package/cjs/model/text-search-babbage-doc-001.js.map +1 -1
  106. package/cjs/model/text-search-curie-doc-001.d.ts +1 -0
  107. package/cjs/model/text-search-curie-doc-001.js +7 -0
  108. package/cjs/model/text-search-curie-doc-001.js.map +1 -1
  109. package/cjs/model/text-search-davinci-doc-001.d.ts +1 -0
  110. package/cjs/model/text-search-davinci-doc-001.js +7 -0
  111. package/cjs/model/text-search-davinci-doc-001.js.map +1 -1
  112. package/cjs/model/text-similarity-ada-001.d.ts +1 -0
  113. package/cjs/model/text-similarity-ada-001.js +7 -0
  114. package/cjs/model/text-similarity-ada-001.js.map +1 -1
  115. package/cjs/model/text-similarity-babbage-001.d.ts +1 -0
  116. package/cjs/model/text-similarity-babbage-001.js +7 -0
  117. package/cjs/model/text-similarity-babbage-001.js.map +1 -1
  118. package/cjs/model/text-similarity-curie-001.d.ts +1 -0
  119. package/cjs/model/text-similarity-curie-001.js +7 -0
  120. package/cjs/model/text-similarity-curie-001.js.map +1 -1
  121. package/cjs/model/text-similarity-davinci-001.d.ts +1 -0
  122. package/cjs/model/text-similarity-davinci-001.js +7 -0
  123. package/cjs/model/text-similarity-davinci-001.js.map +1 -1
  124. package/cjs/modelParams.d.ts +5 -4
  125. package/cjs/modelParams.js +7 -4
  126. package/cjs/modelParams.js.map +1 -1
  127. package/cjs/specialTokens.d.ts +3 -0
  128. package/cjs/specialTokens.js +4 -1
  129. package/cjs/specialTokens.js.map +1 -1
  130. package/cjs/util.d.ts +2 -0
  131. package/cjs/util.js +19 -0
  132. package/cjs/util.js.map +1 -0
  133. package/dist/cl100k_base.js +1 -1
  134. package/dist/cl100k_base.js.map +1 -1
  135. package/dist/p50k_base.js +1 -1
  136. package/dist/p50k_base.js.map +1 -1
  137. package/dist/p50k_edit.js +1 -1
  138. package/dist/p50k_edit.js.map +1 -1
  139. package/dist/r50k_base.js +1 -1
  140. package/dist/r50k_base.js.map +1 -1
  141. package/esm/GptEncoding.d.ts +33 -6
  142. package/esm/GptEncoding.js +81 -36
  143. package/esm/GptEncoding.js.map +1 -1
  144. package/esm/GptEncoding.test.js +55 -1
  145. package/esm/GptEncoding.test.js.map +1 -1
  146. package/esm/codegen/generateByModel.js +19 -0
  147. package/esm/codegen/generateByModel.js.map +1 -0
  148. package/esm/{generateJsModels.js → codegen/generateJsEncodings.js} +4 -4
  149. package/esm/codegen/generateJsEncodings.js.map +1 -0
  150. package/esm/encoding/cl100k_base.d.ts +2 -2
  151. package/esm/encoding/cl100k_base.js +2 -2
  152. package/esm/encoding/cl100k_base.js.map +1 -1
  153. package/esm/encoding/p50k_base.d.ts +1 -1
  154. package/esm/encoding/p50k_edit.d.ts +1 -1
  155. package/esm/encoding/r50k_base.d.ts +1 -1
  156. package/esm/main.d.ts +1 -0
  157. package/esm/main.js +2 -0
  158. package/esm/main.js.map +1 -1
  159. package/esm/mapping.d.ts +37 -0
  160. package/esm/mapping.js +32 -0
  161. package/esm/mapping.js.map +1 -1
  162. package/esm/model/ada.d.ts +1 -0
  163. package/esm/model/ada.js +2 -0
  164. package/esm/model/ada.js.map +1 -1
  165. package/esm/model/babbage.d.ts +1 -0
  166. package/esm/model/babbage.js +2 -0
  167. package/esm/model/babbage.js.map +1 -1
  168. package/esm/model/code-cushman-001.d.ts +1 -0
  169. package/esm/model/code-cushman-001.js +2 -0
  170. package/esm/model/code-cushman-001.js.map +1 -1
  171. package/esm/model/code-cushman-002.d.ts +1 -0
  172. package/esm/model/code-cushman-002.js +2 -0
  173. package/esm/model/code-cushman-002.js.map +1 -1
  174. package/esm/model/code-davinci-001.d.ts +1 -0
  175. package/esm/model/code-davinci-001.js +2 -0
  176. package/esm/model/code-davinci-001.js.map +1 -1
  177. package/esm/model/code-davinci-002.d.ts +1 -0
  178. package/esm/model/code-davinci-002.js +2 -0
  179. package/esm/model/code-davinci-002.js.map +1 -1
  180. package/esm/model/code-davinci-edit-001.d.ts +1 -0
  181. package/esm/model/code-davinci-edit-001.js +2 -0
  182. package/esm/model/code-davinci-edit-001.js.map +1 -1
  183. package/esm/model/code-search-ada-code-001.d.ts +1 -0
  184. package/esm/model/code-search-ada-code-001.js +2 -0
  185. package/esm/model/code-search-ada-code-001.js.map +1 -1
  186. package/esm/model/code-search-babbage-code-001.d.ts +1 -0
  187. package/esm/model/code-search-babbage-code-001.js +2 -0
  188. package/esm/model/code-search-babbage-code-001.js.map +1 -1
  189. package/esm/model/curie.d.ts +1 -0
  190. package/esm/model/curie.js +2 -0
  191. package/esm/model/curie.js.map +1 -1
  192. package/esm/model/cushman-codex.d.ts +1 -0
  193. package/esm/model/cushman-codex.js +2 -0
  194. package/esm/model/cushman-codex.js.map +1 -1
  195. package/esm/model/davinci-codex.d.ts +1 -0
  196. package/esm/model/davinci-codex.js +2 -0
  197. package/esm/model/davinci-codex.js.map +1 -1
  198. package/esm/model/davinci.d.ts +1 -0
  199. package/esm/model/davinci.js +2 -0
  200. package/esm/model/davinci.js.map +1 -1
  201. package/esm/model/gpt-3.5-turbo-0301.d.ts +6 -0
  202. package/esm/model/gpt-3.5-turbo-0301.js +11 -0
  203. package/esm/model/gpt-3.5-turbo-0301.js.map +1 -0
  204. package/esm/model/gpt-3.5-turbo.d.ts +6 -1
  205. package/esm/model/gpt-3.5-turbo.js +10 -1
  206. package/esm/model/gpt-3.5-turbo.js.map +1 -1
  207. package/esm/model/gpt-4-0314.d.ts +6 -0
  208. package/esm/model/gpt-4-0314.js +11 -0
  209. package/esm/model/gpt-4-0314.js.map +1 -0
  210. package/esm/model/gpt-4-32k-0314.d.ts +6 -0
  211. package/esm/model/gpt-4-32k-0314.js +11 -0
  212. package/esm/model/gpt-4-32k-0314.js.map +1 -0
  213. package/esm/model/gpt-4-32k.d.ts +6 -0
  214. package/esm/model/gpt-4-32k.js +11 -0
  215. package/esm/model/gpt-4-32k.js.map +1 -0
  216. package/esm/model/gpt-4.d.ts +6 -1
  217. package/esm/model/gpt-4.js +10 -1
  218. package/esm/model/gpt-4.js.map +1 -1
  219. package/esm/model/text-ada-001.d.ts +1 -0
  220. package/esm/model/text-ada-001.js +2 -0
  221. package/esm/model/text-ada-001.js.map +1 -1
  222. package/esm/model/text-babbage-001.d.ts +1 -0
  223. package/esm/model/text-babbage-001.js +2 -0
  224. package/esm/model/text-babbage-001.js.map +1 -1
  225. package/esm/model/text-curie-001.d.ts +1 -0
  226. package/esm/model/text-curie-001.js +2 -0
  227. package/esm/model/text-curie-001.js.map +1 -1
  228. package/esm/model/text-davinci-001.d.ts +1 -0
  229. package/esm/model/text-davinci-001.js +2 -0
  230. package/esm/model/text-davinci-001.js.map +1 -1
  231. package/esm/model/text-davinci-002.d.ts +1 -0
  232. package/esm/model/text-davinci-002.js +2 -0
  233. package/esm/model/text-davinci-002.js.map +1 -1
  234. package/esm/model/text-davinci-003.d.ts +1 -0
  235. package/esm/model/text-davinci-003.js +2 -0
  236. package/esm/model/text-davinci-003.js.map +1 -1
  237. package/esm/model/text-davinci-edit-001.d.ts +1 -0
  238. package/esm/model/text-davinci-edit-001.js +2 -0
  239. package/esm/model/text-davinci-edit-001.js.map +1 -1
  240. package/esm/model/text-embedding-ada-002.d.ts +1 -0
  241. package/esm/model/text-embedding-ada-002.js +2 -0
  242. package/esm/model/text-embedding-ada-002.js.map +1 -1
  243. package/esm/model/text-search-ada-doc-001.d.ts +1 -0
  244. package/esm/model/text-search-ada-doc-001.js +2 -0
  245. package/esm/model/text-search-ada-doc-001.js.map +1 -1
  246. package/esm/model/text-search-babbage-doc-001.d.ts +1 -0
  247. package/esm/model/text-search-babbage-doc-001.js +2 -0
  248. package/esm/model/text-search-babbage-doc-001.js.map +1 -1
  249. package/esm/model/text-search-curie-doc-001.d.ts +1 -0
  250. package/esm/model/text-search-curie-doc-001.js +2 -0
  251. package/esm/model/text-search-curie-doc-001.js.map +1 -1
  252. package/esm/model/text-search-davinci-doc-001.d.ts +1 -0
  253. package/esm/model/text-search-davinci-doc-001.js +2 -0
  254. package/esm/model/text-search-davinci-doc-001.js.map +1 -1
  255. package/esm/model/text-similarity-ada-001.d.ts +1 -0
  256. package/esm/model/text-similarity-ada-001.js +2 -0
  257. package/esm/model/text-similarity-ada-001.js.map +1 -1
  258. package/esm/model/text-similarity-babbage-001.d.ts +1 -0
  259. package/esm/model/text-similarity-babbage-001.js +2 -0
  260. package/esm/model/text-similarity-babbage-001.js.map +1 -1
  261. package/esm/model/text-similarity-curie-001.d.ts +1 -0
  262. package/esm/model/text-similarity-curie-001.js +2 -0
  263. package/esm/model/text-similarity-curie-001.js.map +1 -1
  264. package/esm/model/text-similarity-davinci-001.d.ts +1 -0
  265. package/esm/model/text-similarity-davinci-001.js +2 -0
  266. package/esm/model/text-similarity-davinci-001.js.map +1 -1
  267. package/esm/modelParams.d.ts +5 -4
  268. package/esm/modelParams.js +6 -3
  269. package/esm/modelParams.js.map +1 -1
  270. package/esm/specialTokens.d.ts +3 -0
  271. package/esm/specialTokens.js +3 -0
  272. package/esm/specialTokens.js.map +1 -1
  273. package/esm/util.d.ts +2 -0
  274. package/esm/util.js +14 -0
  275. package/esm/util.js.map +1 -0
  276. package/package.json +8 -6
  277. package/src/GptEncoding.test.ts +78 -1
  278. package/src/GptEncoding.ts +125 -44
  279. package/src/__snapshots__/GptEncoding.test.ts.snap +811 -0
  280. package/src/codegen/generateByModel.ts +35 -0
  281. package/src/{generateJsModels.ts → codegen/generateJsEncodings.ts} +3 -3
  282. package/src/encoding/cl100k_base.ts +4 -0
  283. package/src/main.ts +2 -0
  284. package/src/mapping.ts +42 -0
  285. package/src/model/ada.ts +2 -0
  286. package/src/model/babbage.ts +2 -0
  287. package/src/model/code-cushman-001.ts +2 -0
  288. package/src/model/code-cushman-002.ts +2 -0
  289. package/src/model/code-davinci-001.ts +2 -0
  290. package/src/model/code-davinci-002.ts +2 -0
  291. package/src/model/code-davinci-edit-001.ts +2 -0
  292. package/src/model/code-search-ada-code-001.ts +2 -0
  293. package/src/model/code-search-babbage-code-001.ts +2 -0
  294. package/src/model/curie.ts +2 -0
  295. package/src/model/cushman-codex.ts +2 -0
  296. package/src/model/davinci-codex.ts +2 -0
  297. package/src/model/davinci.ts +2 -0
  298. package/src/model/gpt-3.5-turbo-0301.ts +32 -0
  299. package/src/model/gpt-3.5-turbo.ts +32 -1
  300. package/src/model/gpt-4-0314.ts +32 -0
  301. package/src/model/gpt-4-32k-0314.ts +32 -0
  302. package/src/model/gpt-4-32k.ts +32 -0
  303. package/src/model/gpt-4.ts +32 -1
  304. package/src/model/text-ada-001.ts +2 -0
  305. package/src/model/text-babbage-001.ts +2 -0
  306. package/src/model/text-curie-001.ts +2 -0
  307. package/src/model/text-davinci-001.ts +2 -0
  308. package/src/model/text-davinci-002.ts +2 -0
  309. package/src/model/text-davinci-003.ts +2 -0
  310. package/src/model/text-davinci-edit-001.ts +2 -0
  311. package/src/model/text-embedding-ada-002.ts +2 -0
  312. package/src/model/text-search-ada-doc-001.ts +2 -0
  313. package/src/model/text-search-babbage-doc-001.ts +2 -0
  314. package/src/model/text-search-curie-doc-001.ts +2 -0
  315. package/src/model/text-search-davinci-doc-001.ts +2 -0
  316. package/src/model/text-similarity-ada-001.ts +2 -0
  317. package/src/model/text-similarity-babbage-001.ts +2 -0
  318. package/src/model/text-similarity-curie-001.ts +2 -0
  319. package/src/model/text-similarity-davinci-001.ts +2 -0
  320. package/src/modelParams.ts +17 -10
  321. package/src/specialTokens.ts +3 -0
  322. package/src/util.ts +15 -0
  323. package/esm/generateByModel.js +0 -13
  324. package/esm/generateByModel.js.map +0 -1
  325. package/esm/generateJsModels.js.map +0 -1
  326. package/src/generateByModel.ts +0 -20
  327. /package/esm/{generateByModel.d.ts → codegen/generateByModel.d.ts} +0 -0
  328. /package/esm/{generateJsModels.d.ts → codegen/generateJsEncodings.d.ts} +0 -0
@@ -1,2 +1,4 @@
1
+ // eslint-disable-next-line no-restricted-exports, import/no-default-export
2
+ export { default } from '../encoding/cl100k_base.js';
1
3
  export * from '../encoding/cl100k_base.js';
2
4
  //# sourceMappingURL=text-embedding-ada-002.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-embedding-ada-002.js","sourceRoot":"","sources":["../../src/model/text-embedding-ada-002.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAA"}
1
+ {"version":3,"file":"text-embedding-ada-002.js","sourceRoot":"","sources":["../../src/model/text-embedding-ada-002.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACpD,cAAc,4BAA4B,CAAA"}
@@ -1 +1,2 @@
1
+ export { default } from '../encoding/r50k_base.js';
1
2
  export * from '../encoding/r50k_base.js';
@@ -1,2 +1,4 @@
1
+ // eslint-disable-next-line no-restricted-exports, import/no-default-export
2
+ export { default } from '../encoding/r50k_base.js';
1
3
  export * from '../encoding/r50k_base.js';
2
4
  //# sourceMappingURL=text-search-ada-doc-001.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-search-ada-doc-001.js","sourceRoot":"","sources":["../../src/model/text-search-ada-doc-001.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA"}
1
+ {"version":3,"file":"text-search-ada-doc-001.js","sourceRoot":"","sources":["../../src/model/text-search-ada-doc-001.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,cAAc,0BAA0B,CAAA"}
@@ -1 +1,2 @@
1
+ export { default } from '../encoding/r50k_base.js';
1
2
  export * from '../encoding/r50k_base.js';
@@ -1,2 +1,4 @@
1
+ // eslint-disable-next-line no-restricted-exports, import/no-default-export
2
+ export { default } from '../encoding/r50k_base.js';
1
3
  export * from '../encoding/r50k_base.js';
2
4
  //# sourceMappingURL=text-search-babbage-doc-001.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-search-babbage-doc-001.js","sourceRoot":"","sources":["../../src/model/text-search-babbage-doc-001.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA"}
1
+ {"version":3,"file":"text-search-babbage-doc-001.js","sourceRoot":"","sources":["../../src/model/text-search-babbage-doc-001.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,cAAc,0BAA0B,CAAA"}
@@ -1 +1,2 @@
1
+ export { default } from '../encoding/r50k_base.js';
1
2
  export * from '../encoding/r50k_base.js';
@@ -1,2 +1,4 @@
1
+ // eslint-disable-next-line no-restricted-exports, import/no-default-export
2
+ export { default } from '../encoding/r50k_base.js';
1
3
  export * from '../encoding/r50k_base.js';
2
4
  //# sourceMappingURL=text-search-curie-doc-001.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-search-curie-doc-001.js","sourceRoot":"","sources":["../../src/model/text-search-curie-doc-001.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA"}
1
+ {"version":3,"file":"text-search-curie-doc-001.js","sourceRoot":"","sources":["../../src/model/text-search-curie-doc-001.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,cAAc,0BAA0B,CAAA"}
@@ -1 +1,2 @@
1
+ export { default } from '../encoding/r50k_base.js';
1
2
  export * from '../encoding/r50k_base.js';
@@ -1,2 +1,4 @@
1
+ // eslint-disable-next-line no-restricted-exports, import/no-default-export
2
+ export { default } from '../encoding/r50k_base.js';
1
3
  export * from '../encoding/r50k_base.js';
2
4
  //# sourceMappingURL=text-search-davinci-doc-001.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-search-davinci-doc-001.js","sourceRoot":"","sources":["../../src/model/text-search-davinci-doc-001.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA"}
1
+ {"version":3,"file":"text-search-davinci-doc-001.js","sourceRoot":"","sources":["../../src/model/text-search-davinci-doc-001.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,cAAc,0BAA0B,CAAA"}
@@ -1 +1,2 @@
1
+ export { default } from '../encoding/r50k_base.js';
1
2
  export * from '../encoding/r50k_base.js';
@@ -1,2 +1,4 @@
1
+ // eslint-disable-next-line no-restricted-exports, import/no-default-export
2
+ export { default } from '../encoding/r50k_base.js';
1
3
  export * from '../encoding/r50k_base.js';
2
4
  //# sourceMappingURL=text-similarity-ada-001.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-similarity-ada-001.js","sourceRoot":"","sources":["../../src/model/text-similarity-ada-001.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA"}
1
+ {"version":3,"file":"text-similarity-ada-001.js","sourceRoot":"","sources":["../../src/model/text-similarity-ada-001.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,cAAc,0BAA0B,CAAA"}
@@ -1 +1,2 @@
1
+ export { default } from '../encoding/r50k_base.js';
1
2
  export * from '../encoding/r50k_base.js';
@@ -1,2 +1,4 @@
1
+ // eslint-disable-next-line no-restricted-exports, import/no-default-export
2
+ export { default } from '../encoding/r50k_base.js';
1
3
  export * from '../encoding/r50k_base.js';
2
4
  //# sourceMappingURL=text-similarity-babbage-001.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-similarity-babbage-001.js","sourceRoot":"","sources":["../../src/model/text-similarity-babbage-001.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA"}
1
+ {"version":3,"file":"text-similarity-babbage-001.js","sourceRoot":"","sources":["../../src/model/text-similarity-babbage-001.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,cAAc,0BAA0B,CAAA"}
@@ -1 +1,2 @@
1
+ export { default } from '../encoding/r50k_base.js';
1
2
  export * from '../encoding/r50k_base.js';
@@ -1,2 +1,4 @@
1
+ // eslint-disable-next-line no-restricted-exports, import/no-default-export
2
+ export { default } from '../encoding/r50k_base.js';
1
3
  export * from '../encoding/r50k_base.js';
2
4
  //# sourceMappingURL=text-similarity-curie-001.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-similarity-curie-001.js","sourceRoot":"","sources":["../../src/model/text-similarity-curie-001.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA"}
1
+ {"version":3,"file":"text-similarity-curie-001.js","sourceRoot":"","sources":["../../src/model/text-similarity-curie-001.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,cAAc,0BAA0B,CAAA"}
@@ -1 +1,2 @@
1
+ export { default } from '../encoding/r50k_base.js';
1
2
  export * from '../encoding/r50k_base.js';
@@ -1,2 +1,4 @@
1
+ // eslint-disable-next-line no-restricted-exports, import/no-default-export
2
+ export { default } from '../encoding/r50k_base.js';
1
3
  export * from '../encoding/r50k_base.js';
2
4
  //# sourceMappingURL=text-similarity-davinci-001.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-similarity-davinci-001.js","sourceRoot":"","sources":["../../src/model/text-similarity-davinci-001.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA"}
1
+ {"version":3,"file":"text-similarity-davinci-001.js","sourceRoot":"","sources":["../../src/model/text-similarity-davinci-001.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,cAAc,0BAA0B,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { EncoderMap } from './EncoderMap.js';
2
- import type { EncodingName } from './mapping.js';
3
- export interface ModelParams {
2
+ import type { EncodingName, ModelName } from './mapping.js';
3
+ export interface EncodingParams {
4
4
  /**
5
5
  * The expected total number of tokens in the vocabulary, including both regular and special tokens.
6
6
  * This parameter is used to ensure that the combined number of regular and special tokens matches the expected total.
@@ -15,8 +15,9 @@ export interface ModelParams {
15
15
  tokenSplitRegex: RegExp;
16
16
  mergeableBytePairRanks: EncoderMap;
17
17
  specialTokenMapping: Map<string, number>;
18
+ modelName?: ModelName;
18
19
  }
19
20
  export type GetMergeableRanksFn = (encodingName: EncodingName) => EncoderMap;
20
21
  export type GetMergeableRanksAsyncFn = (encodingName: EncodingName) => Promise<EncoderMap>;
21
- export declare function getModelParams(encodingName: EncodingName, getMergeableRanks: GetMergeableRanksFn): ModelParams;
22
- export declare function getModelParamsAsync(encodingName: EncodingName, getMergeableRanks: GetMergeableRanksAsyncFn): Promise<ModelParams>;
22
+ export declare function getEncodingParams(encodingName: EncodingName, getMergeableRanks: GetMergeableRanksFn): EncodingParams;
23
+ export declare function getModelParamsAsync(encodingName: EncodingName, getMergeableRanks: GetMergeableRanksAsyncFn): Promise<EncodingParams>;
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable no-magic-numbers */
2
2
  import { EncoderMap } from './EncoderMap.js';
3
- import { EndOfPrompt, EndOfText, FimMiddle, FimPrefix, FimSuffix, } from './specialTokens.js';
3
+ import { EndOfPrompt, EndOfText, FimMiddle, FimPrefix, FimSuffix, ImEnd, ImSep, ImStart, } from './specialTokens.js';
4
4
  const tokenSplitRegex = /'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+/gu;
5
5
  function R50KBase(mergeableBytePairRanks) {
6
6
  return {
@@ -37,6 +37,9 @@ function Cl100KBase(mergeableBytePairRanks) {
37
37
  [FimPrefix, 100258],
38
38
  [FimMiddle, 100259],
39
39
  [FimSuffix, 100260],
40
+ [ImStart, 100264],
41
+ [ImEnd, 100265],
42
+ [ImSep, 100266],
40
43
  [EndOfPrompt, 100276],
41
44
  ]);
42
45
  return {
@@ -45,7 +48,7 @@ function Cl100KBase(mergeableBytePairRanks) {
45
48
  specialTokenMapping,
46
49
  };
47
50
  }
48
- export function getModelParams(encodingName, getMergeableRanks) {
51
+ export function getEncodingParams(encodingName, getMergeableRanks) {
49
52
  const mergeableBytePairRanks = getMergeableRanks(encodingName);
50
53
  switch (encodingName.toLowerCase()) {
51
54
  case 'r50k_base':
@@ -62,6 +65,6 @@ export function getModelParams(encodingName, getMergeableRanks) {
62
65
  }
63
66
  export async function getModelParamsAsync(encodingName, getMergeableRanks) {
64
67
  const mergeableBytePairRanks = await getMergeableRanks(encodingName);
65
- return getModelParams(encodingName, () => mergeableBytePairRanks);
68
+ return getEncodingParams(encodingName, () => mergeableBytePairRanks);
66
69
  }
67
70
  //# sourceMappingURL=modelParams.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modelParams.js","sourceRoot":"","sources":["../src/modelParams.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EACL,WAAW,EACX,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,GACV,MAAM,oBAAoB,CAAA;AAmB3B,MAAM,eAAe,GACnB,8EAA8E,CAAA;AAEhF,SAAS,QAAQ,CAAC,sBAAkC;IAClD,OAAO;QACL,sBAAsB,EAAE,KAAM;QAC9B,eAAe;QACf,sBAAsB;QACtB,mBAAmB,EAAE,IAAI,GAAG,CAAiB,CAAC,CAAC,SAAS,EAAE,KAAM,CAAC,CAAC,CAAC;KACpE,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,sBAAkC;IAClD,OAAO;QACL,sBAAsB,EAAE,KAAM;QAC9B,eAAe;QACf,sBAAsB;QACtB,mBAAmB,EAAE,IAAI,GAAG,CAAiB,CAAC,CAAC,SAAS,EAAE,KAAM,CAAC,CAAC,CAAC;KACpE,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,sBAAkC;IAClD,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAiB;QAClD,CAAC,SAAS,EAAE,KAAM,CAAC;QACnB,CAAC,SAAS,EAAE,KAAM,CAAC;QACnB,CAAC,SAAS,EAAE,KAAM,CAAC;QACnB,CAAC,SAAS,EAAE,KAAM,CAAC;KACpB,CAAC,CAAA;IAEF,OAAO;QACL,eAAe;QACf,sBAAsB;QACtB,mBAAmB;KACpB,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,sBAAkC;IACpD,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAiB;QAClD,CAAC,SAAS,EAAE,MAAO,CAAC;QACpB,CAAC,SAAS,EAAE,MAAO,CAAC;QACpB,CAAC,SAAS,EAAE,MAAO,CAAC;QACpB,CAAC,SAAS,EAAE,MAAO,CAAC;QACpB,CAAC,WAAW,EAAE,MAAO,CAAC;KACvB,CAAC,CAAA;IAEF,OAAO;QACL,eAAe,EACb,uHAAuH;QACzH,sBAAsB;QACtB,mBAAmB;KACpB,CAAA;AACH,CAAC;AAOD,MAAM,UAAU,cAAc,CAC5B,YAA0B,EAC1B,iBAAsC;IAEtC,MAAM,sBAAsB,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAA;IAC9D,QAAQ,YAAY,CAAC,WAAW,EAAE,EAAE;QAClC,KAAK,WAAW;YACd,OAAO,QAAQ,CAAC,sBAAsB,CAAC,CAAA;QAEzC,KAAK,WAAW;YACd,OAAO,QAAQ,CAAC,sBAAsB,CAAC,CAAA;QAEzC,KAAK,WAAW;YACd,OAAO,QAAQ,CAAC,sBAAsB,CAAC,CAAA;QAEzC,KAAK,aAAa;YAChB,OAAO,UAAU,CAAC,sBAAsB,CAAC,CAAA;QAE3C;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAA;KAC5D;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,YAA0B,EAC1B,iBAA2C;IAE3C,MAAM,sBAAsB,GAAG,MAAM,iBAAiB,CAAC,YAAY,CAAC,CAAA;IACpE,OAAO,cAAc,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,CAAA;AACnE,CAAC"}
1
+ {"version":3,"file":"modelParams.js","sourceRoot":"","sources":["../src/modelParams.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EACL,WAAW,EACX,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,KAAK,EACL,KAAK,EACL,OAAO,GACR,MAAM,oBAAoB,CAAA;AAoB3B,MAAM,eAAe,GACnB,8EAA8E,CAAA;AAEhF,SAAS,QAAQ,CAAC,sBAAkC;IAClD,OAAO;QACL,sBAAsB,EAAE,KAAM;QAC9B,eAAe;QACf,sBAAsB;QACtB,mBAAmB,EAAE,IAAI,GAAG,CAAiB,CAAC,CAAC,SAAS,EAAE,KAAM,CAAC,CAAC,CAAC;KACpE,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,sBAAkC;IAClD,OAAO;QACL,sBAAsB,EAAE,KAAM;QAC9B,eAAe;QACf,sBAAsB;QACtB,mBAAmB,EAAE,IAAI,GAAG,CAAiB,CAAC,CAAC,SAAS,EAAE,KAAM,CAAC,CAAC,CAAC;KACpE,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,sBAAkC;IAClD,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAiB;QAClD,CAAC,SAAS,EAAE,KAAM,CAAC;QACnB,CAAC,SAAS,EAAE,KAAM,CAAC;QACnB,CAAC,SAAS,EAAE,KAAM,CAAC;QACnB,CAAC,SAAS,EAAE,KAAM,CAAC;KACpB,CAAC,CAAA;IAEF,OAAO;QACL,eAAe;QACf,sBAAsB;QACtB,mBAAmB;KACpB,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,sBAAkC;IACpD,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAiB;QAClD,CAAC,SAAS,EAAE,MAAO,CAAC;QACpB,CAAC,SAAS,EAAE,MAAO,CAAC;QACpB,CAAC,SAAS,EAAE,MAAO,CAAC;QACpB,CAAC,SAAS,EAAE,MAAO,CAAC;QACpB,CAAC,OAAO,EAAE,MAAO,CAAC;QAClB,CAAC,KAAK,EAAE,MAAO,CAAC;QAChB,CAAC,KAAK,EAAE,MAAO,CAAC;QAChB,CAAC,WAAW,EAAE,MAAO,CAAC;KACvB,CAAC,CAAA;IAEF,OAAO;QACL,eAAe,EACb,uHAAuH;QACzH,sBAAsB;QACtB,mBAAmB;KACpB,CAAA;AACH,CAAC;AAOD,MAAM,UAAU,iBAAiB,CAC/B,YAA0B,EAC1B,iBAAsC;IAEtC,MAAM,sBAAsB,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAA;IAC9D,QAAQ,YAAY,CAAC,WAAW,EAAE,EAAE;QAClC,KAAK,WAAW;YACd,OAAO,QAAQ,CAAC,sBAAsB,CAAC,CAAA;QAEzC,KAAK,WAAW;YACd,OAAO,QAAQ,CAAC,sBAAsB,CAAC,CAAA;QAEzC,KAAK,WAAW;YACd,OAAO,QAAQ,CAAC,sBAAsB,CAAC,CAAA;QAEzC,KAAK,aAAa;YAChB,OAAO,UAAU,CAAC,sBAAsB,CAAC,CAAA;QAE3C;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAA;KAC5D;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,YAA0B,EAC1B,iBAA2C;IAE3C,MAAM,sBAAsB,GAAG,MAAM,iBAAiB,CAAC,YAAY,CAAC,CAAA;IACpE,OAAO,iBAAiB,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,CAAA;AACtE,CAAC"}
@@ -2,4 +2,7 @@ export declare const EndOfText = "<|endoftext|>";
2
2
  export declare const FimPrefix = "<|fim_prefix|>";
3
3
  export declare const FimMiddle = "<|fim_middle|>";
4
4
  export declare const FimSuffix = "<|fim_suffix|>";
5
+ export declare const ImStart = "<|im_start|>";
6
+ export declare const ImEnd = "<|im_end|>";
7
+ export declare const ImSep = "<|im_sep|>";
5
8
  export declare const EndOfPrompt = "<|endofprompt|>";
@@ -2,5 +2,8 @@ export const EndOfText = '<|endoftext|>';
2
2
  export const FimPrefix = '<|fim_prefix|>';
3
3
  export const FimMiddle = '<|fim_middle|>';
4
4
  export const FimSuffix = '<|fim_suffix|>';
5
+ export const ImStart = '<|im_start|>'; // 100264
6
+ export const ImEnd = '<|im_end|>'; // 100265
7
+ export const ImSep = '<|im_sep|>'; // 100266
5
8
  export const EndOfPrompt = '<|endofprompt|>';
6
9
  //# sourceMappingURL=specialTokens.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"specialTokens.js","sourceRoot":"","sources":["../src/specialTokens.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAA;AACxC,MAAM,CAAC,MAAM,SAAS,GAAG,gBAAgB,CAAA;AACzC,MAAM,CAAC,MAAM,SAAS,GAAG,gBAAgB,CAAA;AACzC,MAAM,CAAC,MAAM,SAAS,GAAG,gBAAgB,CAAA;AACzC,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,CAAA"}
1
+ {"version":3,"file":"specialTokens.js","sourceRoot":"","sources":["../src/specialTokens.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAA;AACxC,MAAM,CAAC,MAAM,SAAS,GAAG,gBAAgB,CAAA;AACzC,MAAM,CAAC,MAAM,SAAS,GAAG,gBAAgB,CAAA;AACzC,MAAM,CAAC,MAAM,SAAS,GAAG,gBAAgB,CAAA;AACzC,MAAM,CAAC,MAAM,OAAO,GAAG,cAAc,CAAA,CAAC,SAAS;AAC/C,MAAM,CAAC,MAAM,KAAK,GAAG,YAAY,CAAA,CAAC,SAAS;AAC3C,MAAM,CAAC,MAAM,KAAK,GAAG,YAAY,CAAA,CAAC,SAAS;AAC3C,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,CAAA"}
package/esm/util.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function getMaxValueFromMap(map: Map<unknown, number>): number;
2
+ export declare function getSpecialTokenRegex(tokens: Set<string>): RegExp;
package/esm/util.js ADDED
@@ -0,0 +1,14 @@
1
+ import { escapeRegExp } from './escapeRegExp.js';
2
+ export function getMaxValueFromMap(map) {
3
+ let max = 0;
4
+ map.forEach((val) => {
5
+ max = Math.max(max, val);
6
+ });
7
+ return max;
8
+ }
9
+ export function getSpecialTokenRegex(tokens) {
10
+ const escapedTokens = [...tokens].map(escapeRegExp);
11
+ const inner = escapedTokens.join('|');
12
+ return new RegExp(`(${inner})`);
13
+ }
14
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,MAAM,UAAU,kBAAkB,CAAC,GAAyB;IAC1D,IAAI,GAAG,GAAG,CAAC,CAAA;IACX,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAClB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC1B,CAAC,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAmB;IACtD,MAAM,aAAa,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IACnD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACrC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,CAAA;AACjC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "gpt-tokenizer",
3
- "version": "2.0.0",
4
- "description": "BPE Encoder Decoder for GPT-2 / GPT-3",
3
+ "version": "2.1.1",
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",
7
7
  "encoder",
@@ -72,14 +72,16 @@
72
72
  "dist"
73
73
  ],
74
74
  "scripts": {
75
+ "codegen:models": "yarn tsx src/codegen/generateByModel.ts",
76
+ "codegen:encodings": "yarn tsx src/codegen/generateJsEncodings.ts",
75
77
  "build": "yarn build:cjs && yarn build:esm && yarn build:umd",
76
78
  "build:cjs": "yarn rrun tsc --outDir cjs --module commonjs --target es2022 --project tsconfig-cjs.json",
77
79
  "build:esm": "yarn rrun tsc --outDir esm --module esnext --target es2022 && echo '{\"name\": \"gpt-tokenizer\", \"type\": \"module\"}' > ./esm/package.json",
78
80
  "build:umd": "yarn build:umd:cl100k_base && yarn build:umd:p50k_base && yarn build:umd:p50k_edit && yarn build:umd:r50k_base",
79
- "build:umd:cl100k_base": "beemo webpack --entry='./src/main.ts' --env 'outDir=dist' --env 'moduleTarget=umd' --env 'engineTarget=web' --env 'codeTarget=es2022' --env 'name=GPTTokenizer' --env 'export=default' --env 'filename=cl100k_base.js'",
80
- "build:umd:p50k_base": "beemo webpack --entry='./src/encoding/p50k_base.ts' --env 'outDir=dist' --env 'moduleTarget=umd' --env 'engineTarget=web' --env 'codeTarget=es2022' --env 'name=GPTTokenizer' --env 'export=default' --env 'filename=p50k_base.js'",
81
- "build:umd:p50k_edit": "beemo webpack --entry='./src/encoding/p50k_edit.ts' --env 'outDir=dist' --env 'moduleTarget=umd' --env 'engineTarget=web' --env 'codeTarget=es2022' --env 'name=GPTTokenizer' --env 'export=default' --env 'filename=p50k_edit.js'",
82
- "build:umd:r50k_base": "beemo webpack --entry='./src/encoding/r50k_base.ts' --env 'outDir=dist' --env 'moduleTarget=umd' --env 'engineTarget=web' --env 'codeTarget=es2022' --env 'name=GPTTokenizer' --env 'export=default' --env 'filename=r50k_base.js'",
81
+ "build:umd:cl100k_base": "beemo webpack --entry='./src/main.ts' --env 'outDir=dist' --env 'moduleTarget=umd' --env 'engineTarget=web' --env 'codeTarget=es2022' --env 'name=GPTTokenizer_cl100k_base' --env 'filename=cl100k_base.js'",
82
+ "build:umd:p50k_base": "beemo webpack --entry='./src/encoding/p50k_base.ts' --env 'outDir=dist' --env 'moduleTarget=umd' --env 'engineTarget=web' --env 'codeTarget=es2022' --env 'name=GPTTokenizer_p50k_base' --env 'filename=p50k_base.js'",
83
+ "build:umd:p50k_edit": "beemo webpack --entry='./src/encoding/p50k_edit.ts' --env 'outDir=dist' --env 'moduleTarget=umd' --env 'engineTarget=web' --env 'codeTarget=es2022' --env 'name=GPTTokenizer_p50k_edit' --env 'filename=p50k_edit.js'",
84
+ "build:umd:r50k_base": "beemo webpack --entry='./src/encoding/r50k_base.ts' --env 'outDir=dist' --env 'moduleTarget=umd' --env 'engineTarget=web' --env 'codeTarget=es2022' --env 'name=GPTTokenizer_r50k_base' --env 'filename=r50k_base.js'",
83
85
  "clean": "git clean -dfX --exclude=node_modules src && beemo typescript:sync-project-refs",
84
86
  "format": "yarn rrun prettier --write \"./{src,tests,.config}/**/!(*.d).{.js,jsx,ts,tsx,json,md}\"",
85
87
  "postinstallDev": "yarn prepare",
@@ -1,7 +1,12 @@
1
1
  import fs from 'fs'
2
2
  import path from 'path'
3
3
  import { GptEncoding } from './GptEncoding.js'
4
- import { type EncodingName, encodingNames } from './mapping.js'
4
+ import {
5
+ type ChatModelName,
6
+ type EncodingName,
7
+ chatModelParams,
8
+ encodingNames,
9
+ } from './mapping.js'
5
10
  import { resolveEncoding } from './resolveEncoding.js'
6
11
 
7
12
  const sharedResults = {
@@ -155,6 +160,78 @@ describe.each(encodingNames)('%s', (encodingName: EncodingName) => {
155
160
  })
156
161
  })
157
162
 
163
+ const chatModelNames = Object.keys(chatModelParams) as readonly ChatModelName[]
164
+
165
+ const exampleMessages = [
166
+ {
167
+ role: 'system',
168
+ content:
169
+ 'You are a helpful, pattern-following assistant that translates corporate jargon into plain English.',
170
+ },
171
+ {
172
+ role: 'system',
173
+ name: 'example_user',
174
+ content: 'New synergies will help drive top-line growth.',
175
+ },
176
+ {
177
+ role: 'system',
178
+ name: 'example_assistant',
179
+ content: 'Things working well together will increase revenue.',
180
+ },
181
+ {
182
+ role: 'system',
183
+ name: 'example_user',
184
+ content:
185
+ "Let's circle back when we have more bandwidth to touch base on opportunities for increased leverage.",
186
+ },
187
+ {
188
+ role: 'system',
189
+ name: 'example_assistant',
190
+ content: "Let's talk later when we're less busy about how to do better.",
191
+ },
192
+ {
193
+ role: 'user',
194
+ content:
195
+ "This late pivot means we don't have time to boil the ocean for the client deliverable.",
196
+ },
197
+ ] as const
198
+
199
+ describe.each(chatModelNames)('%s', (modelName) => {
200
+ const encoding = GptEncoding.getEncodingApiForModel(
201
+ modelName,
202
+ resolveEncoding,
203
+ )
204
+ const expectedEncodedLength = modelName.startsWith('gpt-3.5-turbo')
205
+ ? 127
206
+ : 121
207
+
208
+ describe('chat functionality', () => {
209
+ it('encodes a chat correctly', () => {
210
+ const encoded = encoding.encodeChat(exampleMessages)
211
+ expect(encoded).toMatchSnapshot()
212
+ expect(encoded).toHaveLength(expectedEncodedLength)
213
+
214
+ const decoded = encoding.decode(encoded)
215
+ expect(decoded).toMatchSnapshot()
216
+ })
217
+
218
+ it('isWithinTokenLimit: false', () => {
219
+ const isWithinTokenLimit = encoding.isWithinTokenLimit(
220
+ exampleMessages,
221
+ 50,
222
+ )
223
+ expect(isWithinTokenLimit).toBe(false)
224
+ })
225
+ it('isWithinTokenLimit: true (number)', () => {
226
+ const isWithinTokenLimit = encoding.isWithinTokenLimit(
227
+ exampleMessages,
228
+ 150,
229
+ )
230
+ expect(isWithinTokenLimit).toBe(expectedEncodedLength)
231
+ })
232
+ })
233
+ })
234
+
158
235
  function loadTestPlans() {
159
236
  const testPlanPath = path.join(__dirname, '../data/TestPlans.txt')
160
237
  const testPlanData = fs.readFileSync(testPlanPath, 'utf8')
@@ -1,16 +1,16 @@
1
1
  /* eslint-disable no-param-reassign */
2
2
  import { BytePairEncodingCore } from './BytePairEncodingCore.js'
3
- import { escapeRegExp } from './escapeRegExp.js'
4
3
  import {
5
4
  type EncodingName,
6
5
  type ModelName,
6
+ chatModelParams,
7
7
  modelToEncodingMap,
8
8
  } from './mapping.js'
9
9
  import {
10
+ type EncodingParams,
10
11
  type GetMergeableRanksAsyncFn,
11
12
  type GetMergeableRanksFn,
12
- type ModelParams,
13
- getModelParams,
13
+ getEncodingParams,
14
14
  getModelParamsAsync,
15
15
  } from './modelParams.js'
16
16
  import {
@@ -19,10 +19,29 @@ import {
19
19
  FimMiddle,
20
20
  FimPrefix,
21
21
  FimSuffix,
22
+ ImEnd,
23
+ ImSep,
24
+ ImStart,
22
25
  } from './specialTokens.js'
23
26
  import { endsWithIncompleteUtfPairSurrogate } from './utfUtil.js'
27
+ import { getMaxValueFromMap, getSpecialTokenRegex } from './util.js'
24
28
 
25
- export const DISALLOW_ALL_SPECIAL_TOKENS = 'all'
29
+ export const ALL_SPECIAL_TOKENS = 'all'
30
+
31
+ export interface EncodeOptions {
32
+ allowedSpecial?: Set<string>
33
+ disallowedSpecial?: Set<string>
34
+ }
35
+
36
+ export interface ChatMessage {
37
+ role?: 'system' | 'user' | 'assistant'
38
+ name?: string
39
+ content: string
40
+ }
41
+
42
+ export interface EncodeChatOptions {
43
+ primeWithAssistantResponse?: string
44
+ }
26
45
 
27
46
  export class GptEncoding {
28
47
  static EndOfPrompt = EndOfPrompt
@@ -32,6 +51,7 @@ export class GptEncoding {
32
51
  static FimSuffix = FimSuffix
33
52
 
34
53
  decoder = new TextDecoder('utf8')
54
+ modelName?: ModelName
35
55
  private bytePairEncodingCoreProcessor: BytePairEncodingCore
36
56
  private specialTokenMapping: Map<string, number>
37
57
 
@@ -40,10 +60,11 @@ export class GptEncoding {
40
60
  mergeableBytePairRanks,
41
61
  specialTokenMapping,
42
62
  expectedVocabularySize,
43
- }: ModelParams) {
63
+ modelName,
64
+ }: EncodingParams) {
44
65
  const maxTokenValue = Math.max(
45
- GptEncoding.getMaxValueFromMap(mergeableBytePairRanks),
46
- GptEncoding.getMaxValueFromMap(specialTokenMapping),
66
+ getMaxValueFromMap(mergeableBytePairRanks),
67
+ getMaxValueFromMap(specialTokenMapping),
47
68
  )
48
69
  this.specialTokenMapping = specialTokenMapping
49
70
 
@@ -76,13 +97,14 @@ export class GptEncoding {
76
97
  this.decodeGenerator = this.decodeGenerator.bind(this)
77
98
  this.decodeAsyncGenerator = this.decodeAsyncGenerator.bind(this)
78
99
  this.isWithinTokenLimit = this.isWithinTokenLimit.bind(this)
100
+ this.modelName = modelName
79
101
  }
80
102
 
81
103
  static getEncodingApi(
82
104
  encodingName: EncodingName,
83
105
  getMergeableRanks: GetMergeableRanksFn,
84
106
  ): GptEncoding {
85
- const modelParams = getModelParams(encodingName, getMergeableRanks)
107
+ const modelParams = getEncodingParams(encodingName, getMergeableRanks)
86
108
  return new GptEncoding(modelParams)
87
109
  }
88
110
 
@@ -91,7 +113,8 @@ export class GptEncoding {
91
113
  getMergeableRanks: GetMergeableRanksFn,
92
114
  ): GptEncoding {
93
115
  const encodingName = modelToEncodingMap[modelName]
94
- return GptEncoding.getEncodingApi(encodingName, getMergeableRanks)
116
+ const modelParams = getEncodingParams(encodingName, getMergeableRanks)
117
+ return new GptEncoding({ ...modelParams, modelName })
95
118
  }
96
119
 
97
120
  static async getEncodingApiAsync(
@@ -110,43 +133,34 @@ export class GptEncoding {
110
133
  getMergeableRanks: GetMergeableRanksAsyncFn,
111
134
  ): Promise<GptEncoding> {
112
135
  const encodingName = modelToEncodingMap[modelName]
113
- return GptEncoding.getEncodingApiAsync(encodingName, getMergeableRanks)
114
- }
115
-
116
- private static getMaxValueFromMap(map: Map<unknown, number>): number {
117
- let max = 0
118
- map.forEach((val) => {
119
- max = Math.max(max, val)
120
- })
121
- return max
122
- }
123
-
124
- private static specialTokenRegex(tokens: Set<string>): RegExp {
125
- const escapedTokens = [...tokens].map(escapeRegExp)
126
- const inner = escapedTokens.join('|')
127
- return new RegExp(`(${inner})`)
136
+ const modelParams = await getModelParamsAsync(
137
+ encodingName,
138
+ getMergeableRanks,
139
+ )
140
+ return new GptEncoding({ ...modelParams, modelName })
128
141
  }
129
142
 
130
143
  encodeGenerator(
131
144
  lineToEncode: string,
132
- allowedSpecial = new Set<string>(),
133
- disallowedSpecial: Set<string> = new Set<string>([
134
- DISALLOW_ALL_SPECIAL_TOKENS,
135
- ]),
136
- ): Generator<number[], number> {
145
+ {
146
+ allowedSpecial = new Set<string>(),
147
+ disallowedSpecial = new Set<string>([ALL_SPECIAL_TOKENS]),
148
+ }: EncodeOptions = {},
149
+ ): Generator<number[], number, undefined> {
137
150
  const specialTokensSet = new Set<string>(this.specialTokenMapping.keys())
138
151
 
139
- if (disallowedSpecial.has(DISALLOW_ALL_SPECIAL_TOKENS)) {
152
+ if (disallowedSpecial.has(ALL_SPECIAL_TOKENS)) {
140
153
  disallowedSpecial = new Set<string>(specialTokensSet)
154
+ allowedSpecial.forEach((val) => disallowedSpecial.delete(val))
141
155
  disallowedSpecial.forEach((val) => allowedSpecial.delete(val))
142
156
  }
143
157
 
144
- if (allowedSpecial.has(DISALLOW_ALL_SPECIAL_TOKENS)) {
158
+ if (allowedSpecial.has(ALL_SPECIAL_TOKENS)) {
145
159
  allowedSpecial = specialTokensSet
146
160
  }
147
161
 
148
162
  if (disallowedSpecial.size > 0) {
149
- const regexPattern = GptEncoding.specialTokenRegex(disallowedSpecial)
163
+ const regexPattern = getSpecialTokenRegex(disallowedSpecial)
150
164
  const match = lineToEncode.match(regexPattern)
151
165
  if (match !== null) {
152
166
  throw new Error(`Disallowed special token found: ${match[0]}`)
@@ -159,23 +173,90 @@ export class GptEncoding {
159
173
  )
160
174
  }
161
175
 
162
- encode(
163
- lineToEncode: string,
164
- allowedSpecial = new Set<string>(),
165
- disallowedSpecial: Set<string> = new Set<string>([
166
- DISALLOW_ALL_SPECIAL_TOKENS,
167
- ]),
168
- ): number[] {
169
- return [
170
- ...this.encodeGenerator(lineToEncode, allowedSpecial, disallowedSpecial),
171
- ].flat()
176
+ encode(lineToEncode: string, encodeOptions: EncodeOptions = {}): number[] {
177
+ return [...this.encodeGenerator(lineToEncode, encodeOptions)].flat()
178
+ }
179
+
180
+ /**
181
+ * Progressively tokenizes an OpenAI chat.
182
+ * Warning: gpt-3.5-turbo and gpt-4 chat format may change over time.
183
+ * Returns tokens assuming the 'gpt-3.5-turbo-0301' / 'gpt-4-0314' format.
184
+ * Based on OpenAI's guidelines: https://github.com/openai/openai-python/blob/main/chatml.md
185
+ * Also mentioned in section 6 of this document: https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb
186
+ */
187
+ *encodeChatGenerator(
188
+ chat: Iterable<ChatMessage>,
189
+ model = this.modelName,
190
+ ): Generator<number[], void, undefined> {
191
+ if (!model) {
192
+ throw new Error(
193
+ 'Model name must be provided either during initialization or passed in to the method.',
194
+ )
195
+ }
196
+ const params = chatModelParams[model]
197
+ const chatStartToken = this.specialTokenMapping.get(ImStart)
198
+ const chatEndToken = this.specialTokenMapping.get(ImEnd)
199
+
200
+ if (!params || chatStartToken === undefined || chatEndToken === undefined) {
201
+ throw new Error(`Model '${model}' does not support chat.`)
202
+ }
203
+ const allowedSpecial = new Set([ImSep])
204
+ const { messageSeparator, roleSeparator } = params
205
+ const encodedMessageSeparator =
206
+ messageSeparator.length > 0 ? this.encode(messageSeparator) : []
207
+ const encodedRoleSeparator =
208
+ roleSeparator.length > 0
209
+ ? this.encode(roleSeparator, { allowedSpecial })
210
+ : []
211
+ const nameCache = new Map<string, number[]>()
212
+
213
+ for (const { role = 'system', name = role, content } of chat) {
214
+ if (content === undefined) {
215
+ throw new Error('Content must be defined for all messages.')
216
+ }
217
+
218
+ yield [chatStartToken]
219
+ const encodedName = nameCache.get(name) ?? this.encode(name)
220
+ nameCache.set(name, encodedName)
221
+ yield encodedName
222
+ if (encodedRoleSeparator.length > 0) {
223
+ yield encodedRoleSeparator
224
+ }
225
+ yield* this.encodeGenerator(content)
226
+ yield [chatEndToken]
227
+ yield encodedMessageSeparator
228
+ }
229
+
230
+ // every reply is primed with <|start|>assistant<|message|>
231
+ yield [chatStartToken]
232
+ yield* this.encodeGenerator('assistant')
233
+ if (encodedRoleSeparator.length > 0) {
234
+ yield encodedRoleSeparator
235
+ }
236
+ }
237
+
238
+ /**
239
+ * Encodes a chat into a single array of tokens.
240
+ * Warning: gpt-3.5-turbo and gpt-4 chat format may change over time.
241
+ * Returns tokens assuming the 'gpt-3.5-turbo-0301' / 'gpt-4-0314' format.
242
+ * Based on OpenAI's guidelines: https://github.com/openai/openai-python/blob/main/chatml.md
243
+ * Also mentioned in section 6 of this document: https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb
244
+ */
245
+ encodeChat(chat: readonly ChatMessage[], model = this.modelName): number[] {
246
+ return [...this.encodeChatGenerator(chat, model)].flat()
172
247
  }
173
248
 
174
249
  /**
175
250
  * @returns {false | number} false if token limit is exceeded, otherwise the number of tokens
176
251
  */
177
- isWithinTokenLimit(text: string, tokenLimit: number): false | number {
178
- const tokenGenerator = this.encodeGenerator(text)
252
+ isWithinTokenLimit(
253
+ input: string | Iterable<ChatMessage>,
254
+ tokenLimit: number,
255
+ ): false | number {
256
+ const tokenGenerator =
257
+ typeof input === 'string'
258
+ ? this.encodeGenerator(input)
259
+ : this.encodeChatGenerator(input)
179
260
  let count = 0
180
261
  for (const tokens of tokenGenerator) {
181
262
  count += tokens.length