gpt-tokenizer 2.0.0-beta.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) 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 +3 -3
  8. package/cjs/encoding/cl100k_base.js +6 -4
  9. package/cjs/encoding/cl100k_base.js.map +1 -1
  10. package/cjs/encoding/p50k_base.d.ts +2 -2
  11. package/cjs/encoding/p50k_base.js +4 -4
  12. package/cjs/encoding/p50k_base.js.map +1 -1
  13. package/cjs/encoding/p50k_edit.d.ts +2 -2
  14. package/cjs/encoding/p50k_edit.js +4 -4
  15. package/cjs/encoding/p50k_edit.js.map +1 -1
  16. package/cjs/encoding/r50k_base.d.ts +2 -2
  17. package/cjs/encoding/r50k_base.js +4 -4
  18. package/cjs/encoding/r50k_base.js.map +1 -1
  19. package/cjs/mapping.d.ts +37 -0
  20. package/cjs/mapping.js +34 -2
  21. package/cjs/mapping.js.map +1 -1
  22. package/cjs/model/gpt-3.5-turbo-0301.d.ts +6 -0
  23. package/cjs/model/gpt-3.5-turbo-0301.js +38 -0
  24. package/cjs/model/gpt-3.5-turbo-0301.js.map +1 -0
  25. package/cjs/model/gpt-3.5-turbo.d.ts +6 -1
  26. package/cjs/model/gpt-3.5-turbo.js +21 -1
  27. package/cjs/model/gpt-3.5-turbo.js.map +1 -1
  28. package/cjs/model/gpt-4-0314.d.ts +6 -0
  29. package/cjs/model/gpt-4-0314.js +38 -0
  30. package/cjs/model/gpt-4-0314.js.map +1 -0
  31. package/cjs/model/gpt-4-32k-0314.d.ts +6 -0
  32. package/cjs/model/gpt-4-32k-0314.js +38 -0
  33. package/cjs/model/gpt-4-32k-0314.js.map +1 -0
  34. package/cjs/model/gpt-4-32k.d.ts +6 -0
  35. package/cjs/model/gpt-4-32k.js +38 -0
  36. package/cjs/model/gpt-4-32k.js.map +1 -0
  37. package/cjs/model/gpt-4.d.ts +6 -1
  38. package/cjs/model/gpt-4.js +21 -1
  39. package/cjs/model/gpt-4.js.map +1 -1
  40. package/cjs/modelParams.d.ts +5 -4
  41. package/cjs/modelParams.js +7 -4
  42. package/cjs/modelParams.js.map +1 -1
  43. package/cjs/specialTokens.d.ts +3 -0
  44. package/cjs/specialTokens.js +4 -1
  45. package/cjs/specialTokens.js.map +1 -1
  46. package/cjs/util.d.ts +2 -0
  47. package/cjs/util.js +19 -0
  48. package/cjs/util.js.map +1 -0
  49. package/dist/cl100k_base.js +1 -1
  50. package/dist/cl100k_base.js.map +1 -1
  51. package/dist/p50k_base.js +1 -1
  52. package/dist/p50k_base.js.map +1 -1
  53. package/dist/p50k_edit.js +1 -1
  54. package/dist/p50k_edit.js.map +1 -1
  55. package/dist/r50k_base.js +1 -1
  56. package/dist/r50k_base.js.map +1 -1
  57. package/esm/GptEncoding.d.ts +33 -6
  58. package/esm/GptEncoding.js +81 -36
  59. package/esm/GptEncoding.js.map +1 -1
  60. package/esm/GptEncoding.test.js +55 -1
  61. package/esm/GptEncoding.test.js.map +1 -1
  62. package/esm/codegen/generateByModel.js +19 -0
  63. package/esm/codegen/generateByModel.js.map +1 -0
  64. package/esm/{generateJsModels.js → codegen/generateJsEncodings.js} +4 -4
  65. package/esm/codegen/generateJsEncodings.js.map +1 -0
  66. package/esm/encoding/cl100k_base.d.ts +3 -3
  67. package/esm/encoding/cl100k_base.js +3 -3
  68. package/esm/encoding/cl100k_base.js.map +1 -1
  69. package/esm/encoding/p50k_base.d.ts +2 -2
  70. package/esm/encoding/p50k_base.js +1 -1
  71. package/esm/encoding/p50k_base.js.map +1 -1
  72. package/esm/encoding/p50k_edit.d.ts +2 -2
  73. package/esm/encoding/p50k_edit.js +1 -1
  74. package/esm/encoding/p50k_edit.js.map +1 -1
  75. package/esm/encoding/r50k_base.d.ts +2 -2
  76. package/esm/encoding/r50k_base.js +1 -1
  77. package/esm/encoding/r50k_base.js.map +1 -1
  78. package/esm/mapping.d.ts +37 -0
  79. package/esm/mapping.js +32 -0
  80. package/esm/mapping.js.map +1 -1
  81. package/esm/model/gpt-3.5-turbo-0301.d.ts +6 -0
  82. package/esm/model/gpt-3.5-turbo-0301.js +11 -0
  83. package/esm/model/gpt-3.5-turbo-0301.js.map +1 -0
  84. package/esm/model/gpt-3.5-turbo.d.ts +6 -1
  85. package/esm/model/gpt-3.5-turbo.js +10 -1
  86. package/esm/model/gpt-3.5-turbo.js.map +1 -1
  87. package/esm/model/gpt-4-0314.d.ts +6 -0
  88. package/esm/model/gpt-4-0314.js +11 -0
  89. package/esm/model/gpt-4-0314.js.map +1 -0
  90. package/esm/model/gpt-4-32k-0314.d.ts +6 -0
  91. package/esm/model/gpt-4-32k-0314.js +11 -0
  92. package/esm/model/gpt-4-32k-0314.js.map +1 -0
  93. package/esm/model/gpt-4-32k.d.ts +6 -0
  94. package/esm/model/gpt-4-32k.js +11 -0
  95. package/esm/model/gpt-4-32k.js.map +1 -0
  96. package/esm/model/gpt-4.d.ts +6 -1
  97. package/esm/model/gpt-4.js +10 -1
  98. package/esm/model/gpt-4.js.map +1 -1
  99. package/esm/modelParams.d.ts +5 -4
  100. package/esm/modelParams.js +6 -3
  101. package/esm/modelParams.js.map +1 -1
  102. package/esm/specialTokens.d.ts +3 -0
  103. package/esm/specialTokens.js +3 -0
  104. package/esm/specialTokens.js.map +1 -1
  105. package/esm/util.d.ts +2 -0
  106. package/esm/util.js +14 -0
  107. package/esm/util.js.map +1 -0
  108. package/package.json +8 -6
  109. package/src/GptEncoding.test.ts +78 -1
  110. package/src/GptEncoding.ts +125 -44
  111. package/src/__snapshots__/GptEncoding.test.ts.snap +811 -0
  112. package/src/codegen/generateByModel.ts +35 -0
  113. package/src/{generateJsModels.ts → codegen/generateJsEncodings.ts} +3 -3
  114. package/src/encoding/cl100k_base.ts +5 -1
  115. package/src/encoding/p50k_base.ts +1 -1
  116. package/src/encoding/p50k_edit.ts +1 -1
  117. package/src/encoding/r50k_base.ts +1 -1
  118. package/src/mapping.ts +42 -0
  119. package/src/model/gpt-3.5-turbo-0301.ts +32 -0
  120. package/src/model/gpt-3.5-turbo.ts +32 -1
  121. package/src/model/gpt-4-0314.ts +32 -0
  122. package/src/model/gpt-4-32k-0314.ts +32 -0
  123. package/src/model/gpt-4-32k.ts +32 -0
  124. package/src/model/gpt-4.ts +32 -1
  125. package/src/modelParams.ts +17 -10
  126. package/src/specialTokens.ts +3 -0
  127. package/src/util.ts +15 -0
  128. package/esm/generateByModel.js +0 -13
  129. package/esm/generateByModel.js.map +0 -1
  130. package/esm/generateJsModels.js.map +0 -1
  131. package/src/generateByModel.ts +0 -20
  132. /package/esm/{generateByModel.d.ts → codegen/generateByModel.d.ts} +0 -0
  133. /package/esm/{generateJsModels.d.ts → codegen/generateJsEncodings.d.ts} +0 -0
@@ -0,0 +1,35 @@
1
+ import * as fs from 'fs/promises'
2
+ import * as path from 'path'
3
+ import { fileURLToPath } from 'url'
4
+ import { chatModelParams, modelToEncodingMap } from '../mapping.js'
5
+
6
+ // eslint-disable-next-line no-underscore-dangle
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url))
8
+
9
+ const chatModels = Object.keys(chatModelParams)
10
+
11
+ const template = await fs.readFile(
12
+ path.join(__dirname, '../encoding/cl100k_base.ts'),
13
+ 'utf8',
14
+ )
15
+
16
+ await Promise.all(
17
+ Object.entries(modelToEncodingMap).map(async ([modelName, encoding]) => {
18
+ await fs.mkdir(path.join(__dirname, '../model'), { recursive: true })
19
+ const isChatModel = chatModels.includes(modelName)
20
+
21
+ const content = isChatModel
22
+ ? template.replace(
23
+ `getEncodingApi('cl100k_base'`,
24
+ `getEncodingApiForModel('${modelName}'`,
25
+ )
26
+ : `export * from '../encoding/${encoding}.js'\n`
27
+ await fs.writeFile(
28
+ path.join(__dirname, `../model/${modelName}.ts`),
29
+ content,
30
+ )
31
+
32
+ // eslint-disable-next-line no-console
33
+ console.log(`encoding/${modelName}.ts`)
34
+ }),
35
+ )
@@ -28,7 +28,7 @@ const processFilesInDirectory = async (
28
28
  const __dirname = path.dirname(fileURLToPath(import.meta.url))
29
29
 
30
30
  await processFilesInDirectory(
31
- path.join(__dirname, '../data'),
31
+ path.join(__dirname, '../../data'),
32
32
  async (filePath) => {
33
33
  if (!filePath.endsWith('.tiktoken')) return
34
34
 
@@ -40,9 +40,9 @@ await processFilesInDirectory(
40
40
  return [token, Number.parseInt(rank!, 10)]
41
41
  })
42
42
 
43
- await fs.mkdir(path.join(__dirname, 'models'), { recursive: true })
43
+ await fs.mkdir(path.join(__dirname, '../encodings'), { recursive: true })
44
44
  await fs.writeFile(
45
- path.join(__dirname, `models/${modelName}.js`),
45
+ path.join(__dirname, `../encodings/${modelName}.js`),
46
46
  `/* eslint-disable */\n// @ts-nocheck\n// prettier-ignore\n/** @type {[string, number][]} */\nconst encoder = ${JSON.stringify(
47
47
  encoder,
48
48
  )};\nexport default encoder;`,
@@ -5,7 +5,7 @@ import { GptEncoding } from '../GptEncoding.js'
5
5
 
6
6
  export * from '../specialTokens.js'
7
7
 
8
- const api = GptEncoding.getEncodingApi('cl100k_base', () =>
8
+ export const api = GptEncoding.getEncodingApi('cl100k_base', () =>
9
9
  convertTokenBytePairEncodingFromTuples(encoder),
10
10
  )
11
11
  const {
@@ -15,12 +15,16 @@ const {
15
15
  encode,
16
16
  encodeGenerator,
17
17
  isWithinTokenLimit,
18
+ encodeChat,
19
+ encodeChatGenerator,
18
20
  } = api
19
21
  export {
20
22
  decode,
21
23
  decodeAsyncGenerator,
22
24
  decodeGenerator,
23
25
  encode,
26
+ encodeChat,
27
+ encodeChatGenerator,
24
28
  encodeGenerator,
25
29
  isWithinTokenLimit,
26
30
  }
@@ -5,7 +5,7 @@ import { GptEncoding } from '../GptEncoding.js'
5
5
 
6
6
  export * from '../specialTokens.js'
7
7
 
8
- const api = GptEncoding.getEncodingApi('p50k_base', () =>
8
+ export const api = GptEncoding.getEncodingApi('p50k_base', () =>
9
9
  convertTokenBytePairEncodingFromTuples(encoder),
10
10
  )
11
11
  const {
@@ -5,7 +5,7 @@ import { GptEncoding } from '../GptEncoding.js'
5
5
 
6
6
  export * from '../specialTokens.js'
7
7
 
8
- const api = GptEncoding.getEncodingApi('p50k_edit', () =>
8
+ export const api = GptEncoding.getEncodingApi('p50k_edit', () =>
9
9
  convertTokenBytePairEncodingFromTuples(encoder),
10
10
  )
11
11
  const {
@@ -5,7 +5,7 @@ import { GptEncoding } from '../GptEncoding.js'
5
5
 
6
6
  export * from '../specialTokens.js'
7
7
 
8
- const api = GptEncoding.getEncodingApi('r50k_base', () =>
8
+ export const api = GptEncoding.getEncodingApi('r50k_base', () =>
9
9
  convertTokenBytePairEncodingFromTuples(encoder),
10
10
  )
11
11
  const {
package/src/mapping.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  /* eslint-disable camelcase */
2
+
3
+ import { ImSep } from './specialTokens.js'
4
+
2
5
  export const cl100k_base = 'cl100k_base'
3
6
  export const p50k_base = 'p50k_base'
4
7
  export const p50k_edit = 'p50k_edit'
@@ -14,7 +17,11 @@ export const encodingNames = [
14
17
  export const modelToEncodingMap = {
15
18
  // chat
16
19
  'gpt-4': cl100k_base,
20
+ 'gpt-4-32k': cl100k_base,
21
+ 'gpt-4-0314': cl100k_base,
22
+ 'gpt-4-32k-0314': cl100k_base,
17
23
  'gpt-3.5-turbo': cl100k_base,
24
+ 'gpt-3.5-turbo-0301': cl100k_base,
18
25
  // text
19
26
  'text-davinci-003': p50k_base,
20
27
  'text-davinci-002': p50k_base,
@@ -51,5 +58,40 @@ export const modelToEncodingMap = {
51
58
  'code-search-ada-code-001': r50k_base,
52
59
  } as const
53
60
 
61
+ export interface ChatParameters {
62
+ messageSeparator: string
63
+ roleSeparator: string
64
+ }
65
+
66
+ const internalChatModelParams = {
67
+ 'gpt-3.5-turbo': {
68
+ messageSeparator: '\n',
69
+ roleSeparator: '\n',
70
+ },
71
+ 'gpt-3.5-turbo-0301': {
72
+ messageSeparator: '\n',
73
+ roleSeparator: '\n',
74
+ },
75
+ 'gpt-4': {
76
+ messageSeparator: '',
77
+ roleSeparator: ImSep,
78
+ },
79
+ 'gpt-4-0314': {
80
+ messageSeparator: '',
81
+ roleSeparator: ImSep,
82
+ },
83
+ 'gpt-4-32k': {
84
+ messageSeparator: '',
85
+ roleSeparator: ImSep,
86
+ },
87
+ 'gpt-4-32k-0314': {
88
+ messageSeparator: '',
89
+ roleSeparator: ImSep,
90
+ },
91
+ }
92
+
93
+ export const chatModelParams: Partial<Record<ModelName, ChatParameters>> =
94
+ internalChatModelParams
54
95
  export type ModelName = keyof typeof modelToEncodingMap
96
+ export type ChatModelName = keyof typeof internalChatModelParams
55
97
  export type EncodingName = (typeof modelToEncodingMap)[ModelName]
@@ -0,0 +1,32 @@
1
+ /* eslint-disable import/extensions */
2
+ import { convertTokenBytePairEncodingFromTuples } from '../convertTokenBytePairEncodingFromTuples.js'
3
+ import encoder from '../encodings/cl100k_base.js'
4
+ import { GptEncoding } from '../GptEncoding.js'
5
+
6
+ export * from '../specialTokens.js'
7
+
8
+ const api = GptEncoding.getEncodingApiForModel('gpt-3.5-turbo-0301', () =>
9
+ convertTokenBytePairEncodingFromTuples(encoder),
10
+ )
11
+ const {
12
+ decode,
13
+ decodeAsyncGenerator,
14
+ decodeGenerator,
15
+ encode,
16
+ encodeGenerator,
17
+ isWithinTokenLimit,
18
+ encodeChat,
19
+ encodeChatGenerator,
20
+ } = api
21
+ export {
22
+ decode,
23
+ decodeAsyncGenerator,
24
+ decodeGenerator,
25
+ encode,
26
+ encodeChat,
27
+ encodeChatGenerator,
28
+ encodeGenerator,
29
+ isWithinTokenLimit,
30
+ }
31
+ // eslint-disable-next-line import/no-default-export
32
+ export default api
@@ -1 +1,32 @@
1
- export * from '../encoding/cl100k_base.js'
1
+ /* eslint-disable import/extensions */
2
+ import { convertTokenBytePairEncodingFromTuples } from '../convertTokenBytePairEncodingFromTuples.js'
3
+ import encoder from '../encodings/cl100k_base.js'
4
+ import { GptEncoding } from '../GptEncoding.js'
5
+
6
+ export * from '../specialTokens.js'
7
+
8
+ const api = GptEncoding.getEncodingApiForModel('gpt-3.5-turbo', () =>
9
+ convertTokenBytePairEncodingFromTuples(encoder),
10
+ )
11
+ const {
12
+ decode,
13
+ decodeAsyncGenerator,
14
+ decodeGenerator,
15
+ encode,
16
+ encodeGenerator,
17
+ isWithinTokenLimit,
18
+ encodeChat,
19
+ encodeChatGenerator,
20
+ } = api
21
+ export {
22
+ decode,
23
+ decodeAsyncGenerator,
24
+ decodeGenerator,
25
+ encode,
26
+ encodeChat,
27
+ encodeChatGenerator,
28
+ encodeGenerator,
29
+ isWithinTokenLimit,
30
+ }
31
+ // eslint-disable-next-line import/no-default-export
32
+ export default api
@@ -0,0 +1,32 @@
1
+ /* eslint-disable import/extensions */
2
+ import { convertTokenBytePairEncodingFromTuples } from '../convertTokenBytePairEncodingFromTuples.js'
3
+ import encoder from '../encodings/cl100k_base.js'
4
+ import { GptEncoding } from '../GptEncoding.js'
5
+
6
+ export * from '../specialTokens.js'
7
+
8
+ const api = GptEncoding.getEncodingApiForModel('gpt-4-0314', () =>
9
+ convertTokenBytePairEncodingFromTuples(encoder),
10
+ )
11
+ const {
12
+ decode,
13
+ decodeAsyncGenerator,
14
+ decodeGenerator,
15
+ encode,
16
+ encodeGenerator,
17
+ isWithinTokenLimit,
18
+ encodeChat,
19
+ encodeChatGenerator,
20
+ } = api
21
+ export {
22
+ decode,
23
+ decodeAsyncGenerator,
24
+ decodeGenerator,
25
+ encode,
26
+ encodeChat,
27
+ encodeChatGenerator,
28
+ encodeGenerator,
29
+ isWithinTokenLimit,
30
+ }
31
+ // eslint-disable-next-line import/no-default-export
32
+ export default api
@@ -0,0 +1,32 @@
1
+ /* eslint-disable import/extensions */
2
+ import { convertTokenBytePairEncodingFromTuples } from '../convertTokenBytePairEncodingFromTuples.js'
3
+ import encoder from '../encodings/cl100k_base.js'
4
+ import { GptEncoding } from '../GptEncoding.js'
5
+
6
+ export * from '../specialTokens.js'
7
+
8
+ const api = GptEncoding.getEncodingApiForModel('gpt-4-32k-0314', () =>
9
+ convertTokenBytePairEncodingFromTuples(encoder),
10
+ )
11
+ const {
12
+ decode,
13
+ decodeAsyncGenerator,
14
+ decodeGenerator,
15
+ encode,
16
+ encodeGenerator,
17
+ isWithinTokenLimit,
18
+ encodeChat,
19
+ encodeChatGenerator,
20
+ } = api
21
+ export {
22
+ decode,
23
+ decodeAsyncGenerator,
24
+ decodeGenerator,
25
+ encode,
26
+ encodeChat,
27
+ encodeChatGenerator,
28
+ encodeGenerator,
29
+ isWithinTokenLimit,
30
+ }
31
+ // eslint-disable-next-line import/no-default-export
32
+ export default api
@@ -0,0 +1,32 @@
1
+ /* eslint-disable import/extensions */
2
+ import { convertTokenBytePairEncodingFromTuples } from '../convertTokenBytePairEncodingFromTuples.js'
3
+ import encoder from '../encodings/cl100k_base.js'
4
+ import { GptEncoding } from '../GptEncoding.js'
5
+
6
+ export * from '../specialTokens.js'
7
+
8
+ const api = GptEncoding.getEncodingApiForModel('gpt-4-32k', () =>
9
+ convertTokenBytePairEncodingFromTuples(encoder),
10
+ )
11
+ const {
12
+ decode,
13
+ decodeAsyncGenerator,
14
+ decodeGenerator,
15
+ encode,
16
+ encodeGenerator,
17
+ isWithinTokenLimit,
18
+ encodeChat,
19
+ encodeChatGenerator,
20
+ } = api
21
+ export {
22
+ decode,
23
+ decodeAsyncGenerator,
24
+ decodeGenerator,
25
+ encode,
26
+ encodeChat,
27
+ encodeChatGenerator,
28
+ encodeGenerator,
29
+ isWithinTokenLimit,
30
+ }
31
+ // eslint-disable-next-line import/no-default-export
32
+ export default api
@@ -1 +1,32 @@
1
- export * from '../encoding/cl100k_base.js'
1
+ /* eslint-disable import/extensions */
2
+ import { convertTokenBytePairEncodingFromTuples } from '../convertTokenBytePairEncodingFromTuples.js'
3
+ import encoder from '../encodings/cl100k_base.js'
4
+ import { GptEncoding } from '../GptEncoding.js'
5
+
6
+ export * from '../specialTokens.js'
7
+
8
+ const api = GptEncoding.getEncodingApiForModel('gpt-4', () =>
9
+ convertTokenBytePairEncodingFromTuples(encoder),
10
+ )
11
+ const {
12
+ decode,
13
+ decodeAsyncGenerator,
14
+ decodeGenerator,
15
+ encode,
16
+ encodeGenerator,
17
+ isWithinTokenLimit,
18
+ encodeChat,
19
+ encodeChatGenerator,
20
+ } = api
21
+ export {
22
+ decode,
23
+ decodeAsyncGenerator,
24
+ decodeGenerator,
25
+ encode,
26
+ encodeChat,
27
+ encodeChatGenerator,
28
+ encodeGenerator,
29
+ isWithinTokenLimit,
30
+ }
31
+ // eslint-disable-next-line import/no-default-export
32
+ export default api
@@ -1,15 +1,18 @@
1
1
  /* eslint-disable no-magic-numbers */
2
2
  import { EncoderMap } from './EncoderMap.js'
3
- import type { EncodingName } from './mapping.js'
3
+ import type { EncodingName, ModelName } from './mapping.js'
4
4
  import {
5
5
  EndOfPrompt,
6
6
  EndOfText,
7
7
  FimMiddle,
8
8
  FimPrefix,
9
9
  FimSuffix,
10
+ ImEnd,
11
+ ImSep,
12
+ ImStart,
10
13
  } from './specialTokens.js'
11
14
 
12
- export interface ModelParams {
15
+ export interface EncodingParams {
13
16
  /**
14
17
  * The expected total number of tokens in the vocabulary, including both regular and special tokens.
15
18
  * This parameter is used to ensure that the combined number of regular and special tokens matches the expected total.
@@ -24,12 +27,13 @@ export interface ModelParams {
24
27
  tokenSplitRegex: RegExp
25
28
  mergeableBytePairRanks: EncoderMap
26
29
  specialTokenMapping: Map<string, number>
30
+ modelName?: ModelName
27
31
  }
28
32
 
29
33
  const tokenSplitRegex =
30
34
  /'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+/gu
31
35
 
32
- function R50KBase(mergeableBytePairRanks: EncoderMap): ModelParams {
36
+ function R50KBase(mergeableBytePairRanks: EncoderMap): EncodingParams {
33
37
  return {
34
38
  expectedVocabularySize: 50_257,
35
39
  tokenSplitRegex,
@@ -38,7 +42,7 @@ function R50KBase(mergeableBytePairRanks: EncoderMap): ModelParams {
38
42
  }
39
43
  }
40
44
 
41
- function P50KBase(mergeableBytePairRanks: EncoderMap): ModelParams {
45
+ function P50KBase(mergeableBytePairRanks: EncoderMap): EncodingParams {
42
46
  return {
43
47
  expectedVocabularySize: 50_281,
44
48
  tokenSplitRegex,
@@ -47,7 +51,7 @@ function P50KBase(mergeableBytePairRanks: EncoderMap): ModelParams {
47
51
  }
48
52
  }
49
53
 
50
- function P50KEdit(mergeableBytePairRanks: EncoderMap): ModelParams {
54
+ function P50KEdit(mergeableBytePairRanks: EncoderMap): EncodingParams {
51
55
  const specialTokenMapping = new Map<string, number>([
52
56
  [EndOfText, 50_256],
53
57
  [FimPrefix, 50_281],
@@ -62,12 +66,15 @@ function P50KEdit(mergeableBytePairRanks: EncoderMap): ModelParams {
62
66
  }
63
67
  }
64
68
 
65
- function Cl100KBase(mergeableBytePairRanks: EncoderMap): ModelParams {
69
+ function Cl100KBase(mergeableBytePairRanks: EncoderMap): EncodingParams {
66
70
  const specialTokenMapping = new Map<string, number>([
67
71
  [EndOfText, 100_257],
68
72
  [FimPrefix, 100_258],
69
73
  [FimMiddle, 100_259],
70
74
  [FimSuffix, 100_260],
75
+ [ImStart, 100_264],
76
+ [ImEnd, 100_265],
77
+ [ImSep, 100_266],
71
78
  [EndOfPrompt, 100_276],
72
79
  ])
73
80
 
@@ -84,10 +91,10 @@ export type GetMergeableRanksAsyncFn = (
84
91
  encodingName: EncodingName,
85
92
  ) => Promise<EncoderMap>
86
93
 
87
- export function getModelParams(
94
+ export function getEncodingParams(
88
95
  encodingName: EncodingName,
89
96
  getMergeableRanks: GetMergeableRanksFn,
90
- ): ModelParams {
97
+ ): EncodingParams {
91
98
  const mergeableBytePairRanks = getMergeableRanks(encodingName)
92
99
  switch (encodingName.toLowerCase()) {
93
100
  case 'r50k_base':
@@ -110,7 +117,7 @@ export function getModelParams(
110
117
  export async function getModelParamsAsync(
111
118
  encodingName: EncodingName,
112
119
  getMergeableRanks: GetMergeableRanksAsyncFn,
113
- ): Promise<ModelParams> {
120
+ ): Promise<EncodingParams> {
114
121
  const mergeableBytePairRanks = await getMergeableRanks(encodingName)
115
- return getModelParams(encodingName, () => mergeableBytePairRanks)
122
+ return getEncodingParams(encodingName, () => mergeableBytePairRanks)
116
123
  }
@@ -2,4 +2,7 @@ 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|>'
package/src/util.ts ADDED
@@ -0,0 +1,15 @@
1
+ import { escapeRegExp } from './escapeRegExp.js'
2
+
3
+ export function getMaxValueFromMap(map: Map<unknown, number>): number {
4
+ let max = 0
5
+ map.forEach((val) => {
6
+ max = Math.max(max, val)
7
+ })
8
+ return max
9
+ }
10
+
11
+ export function getSpecialTokenRegex(tokens: Set<string>): RegExp {
12
+ const escapedTokens = [...tokens].map(escapeRegExp)
13
+ const inner = escapedTokens.join('|')
14
+ return new RegExp(`(${inner})`)
15
+ }
@@ -1,13 +0,0 @@
1
- import * as fs from 'fs/promises';
2
- import * as path from 'path';
3
- import { fileURLToPath } from 'url';
4
- import { modelToEncodingMap } from './mapping.js';
5
- // eslint-disable-next-line no-underscore-dangle
6
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
7
- await Promise.all(Object.entries(modelToEncodingMap).map(async ([modelName, encoding]) => {
8
- await fs.mkdir(path.join(__dirname, 'model'), { recursive: true });
9
- await fs.writeFile(path.join(__dirname, `model/${modelName}.ts`), `export * from '../encoding/${encoding}.js'\n`);
10
- // eslint-disable-next-line no-console
11
- console.log(`encoding/${modelName}.js`);
12
- }));
13
- //# sourceMappingURL=generateByModel.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generateByModel.js","sourceRoot":"","sources":["../src/generateByModel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEjD,gDAAgD;AAChD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAE9D,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE;IACrE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAClE,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,SAAS,KAAK,CAAC,EAC7C,8BAA8B,QAAQ,QAAQ,CAC/C,CAAA;IAED,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,KAAK,CAAC,CAAA;AACzC,CAAC,CAAC,CACH,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"generateJsModels.js","sourceRoot":"","sources":["../src/generateJsModels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AAInC,MAAM,uBAAuB,GAAG,KAAK,EACnC,aAAqB,EACrB,EAAoB,EACL,EAAE;IACjB,IAAI;QACF,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QAEtE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,uCAAuC;YACvC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAAE,SAAQ;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;YACpD,4CAA4C;YAC5C,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAA;SACnB;KACF;IAAC,OAAO,KAAK,EAAE;QACd,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;KAC3C;AACH,CAAC,CAAA;AAED,gDAAgD;AAChD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAE9D,MAAM,uBAAuB,CAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAC/B,KAAK,EAAE,QAAQ,EAAE,EAAE;IACjB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAM;IAE3C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IACtD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3C,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAClC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAK,EAAE,EAAE,CAAC,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACnE,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,SAAS,KAAK,CAAC,EAC9C,gHAAgH,IAAI,CAAC,SAAS,CAC5H,OAAO,CACR,4BAA4B,CAC9B,CAAA;IAED,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,SAAS,SAAS,KAAK,CAAC,CAAA;AACtC,CAAC,CACF,CAAA"}
@@ -1,20 +0,0 @@
1
- import * as fs from 'fs/promises'
2
- import * as path from 'path'
3
- import { fileURLToPath } from 'url'
4
- import { modelToEncodingMap } from './mapping.js'
5
-
6
- // eslint-disable-next-line no-underscore-dangle
7
- const __dirname = path.dirname(fileURLToPath(import.meta.url))
8
-
9
- await Promise.all(
10
- Object.entries(modelToEncodingMap).map(async ([modelName, encoding]) => {
11
- await fs.mkdir(path.join(__dirname, 'model'), { recursive: true })
12
- await fs.writeFile(
13
- path.join(__dirname, `model/${modelName}.ts`),
14
- `export * from '../encoding/${encoding}.js'\n`,
15
- )
16
-
17
- // eslint-disable-next-line no-console
18
- console.log(`encoding/${modelName}.js`)
19
- }),
20
- )