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.
- package/README.md +54 -8
- package/cjs/GptEncoding.d.ts +33 -6
- package/cjs/GptEncoding.js +79 -34
- package/cjs/GptEncoding.js.map +1 -1
- package/cjs/GptEncoding.test.js +54 -0
- package/cjs/GptEncoding.test.js.map +1 -1
- package/cjs/encoding/cl100k_base.d.ts +3 -3
- package/cjs/encoding/cl100k_base.js +6 -4
- package/cjs/encoding/cl100k_base.js.map +1 -1
- package/cjs/encoding/p50k_base.d.ts +2 -2
- package/cjs/encoding/p50k_base.js +4 -4
- package/cjs/encoding/p50k_base.js.map +1 -1
- package/cjs/encoding/p50k_edit.d.ts +2 -2
- package/cjs/encoding/p50k_edit.js +4 -4
- package/cjs/encoding/p50k_edit.js.map +1 -1
- package/cjs/encoding/r50k_base.d.ts +2 -2
- package/cjs/encoding/r50k_base.js +4 -4
- package/cjs/encoding/r50k_base.js.map +1 -1
- package/cjs/mapping.d.ts +37 -0
- package/cjs/mapping.js +34 -2
- package/cjs/mapping.js.map +1 -1
- package/cjs/model/gpt-3.5-turbo-0301.d.ts +6 -0
- package/cjs/model/gpt-3.5-turbo-0301.js +38 -0
- package/cjs/model/gpt-3.5-turbo-0301.js.map +1 -0
- package/cjs/model/gpt-3.5-turbo.d.ts +6 -1
- package/cjs/model/gpt-3.5-turbo.js +21 -1
- package/cjs/model/gpt-3.5-turbo.js.map +1 -1
- package/cjs/model/gpt-4-0314.d.ts +6 -0
- package/cjs/model/gpt-4-0314.js +38 -0
- package/cjs/model/gpt-4-0314.js.map +1 -0
- package/cjs/model/gpt-4-32k-0314.d.ts +6 -0
- package/cjs/model/gpt-4-32k-0314.js +38 -0
- package/cjs/model/gpt-4-32k-0314.js.map +1 -0
- package/cjs/model/gpt-4-32k.d.ts +6 -0
- package/cjs/model/gpt-4-32k.js +38 -0
- package/cjs/model/gpt-4-32k.js.map +1 -0
- package/cjs/model/gpt-4.d.ts +6 -1
- package/cjs/model/gpt-4.js +21 -1
- package/cjs/model/gpt-4.js.map +1 -1
- package/cjs/modelParams.d.ts +5 -4
- package/cjs/modelParams.js +7 -4
- package/cjs/modelParams.js.map +1 -1
- package/cjs/specialTokens.d.ts +3 -0
- package/cjs/specialTokens.js +4 -1
- package/cjs/specialTokens.js.map +1 -1
- package/cjs/util.d.ts +2 -0
- package/cjs/util.js +19 -0
- package/cjs/util.js.map +1 -0
- package/dist/cl100k_base.js +1 -1
- package/dist/cl100k_base.js.map +1 -1
- package/dist/p50k_base.js +1 -1
- package/dist/p50k_base.js.map +1 -1
- package/dist/p50k_edit.js +1 -1
- package/dist/p50k_edit.js.map +1 -1
- package/dist/r50k_base.js +1 -1
- package/dist/r50k_base.js.map +1 -1
- package/esm/GptEncoding.d.ts +33 -6
- package/esm/GptEncoding.js +81 -36
- package/esm/GptEncoding.js.map +1 -1
- package/esm/GptEncoding.test.js +55 -1
- package/esm/GptEncoding.test.js.map +1 -1
- package/esm/codegen/generateByModel.js +19 -0
- package/esm/codegen/generateByModel.js.map +1 -0
- package/esm/{generateJsModels.js → codegen/generateJsEncodings.js} +4 -4
- package/esm/codegen/generateJsEncodings.js.map +1 -0
- package/esm/encoding/cl100k_base.d.ts +3 -3
- package/esm/encoding/cl100k_base.js +3 -3
- package/esm/encoding/cl100k_base.js.map +1 -1
- package/esm/encoding/p50k_base.d.ts +2 -2
- package/esm/encoding/p50k_base.js +1 -1
- package/esm/encoding/p50k_base.js.map +1 -1
- package/esm/encoding/p50k_edit.d.ts +2 -2
- package/esm/encoding/p50k_edit.js +1 -1
- package/esm/encoding/p50k_edit.js.map +1 -1
- package/esm/encoding/r50k_base.d.ts +2 -2
- package/esm/encoding/r50k_base.js +1 -1
- package/esm/encoding/r50k_base.js.map +1 -1
- package/esm/mapping.d.ts +37 -0
- package/esm/mapping.js +32 -0
- package/esm/mapping.js.map +1 -1
- package/esm/model/gpt-3.5-turbo-0301.d.ts +6 -0
- package/esm/model/gpt-3.5-turbo-0301.js +11 -0
- package/esm/model/gpt-3.5-turbo-0301.js.map +1 -0
- package/esm/model/gpt-3.5-turbo.d.ts +6 -1
- package/esm/model/gpt-3.5-turbo.js +10 -1
- package/esm/model/gpt-3.5-turbo.js.map +1 -1
- package/esm/model/gpt-4-0314.d.ts +6 -0
- package/esm/model/gpt-4-0314.js +11 -0
- package/esm/model/gpt-4-0314.js.map +1 -0
- package/esm/model/gpt-4-32k-0314.d.ts +6 -0
- package/esm/model/gpt-4-32k-0314.js +11 -0
- package/esm/model/gpt-4-32k-0314.js.map +1 -0
- package/esm/model/gpt-4-32k.d.ts +6 -0
- package/esm/model/gpt-4-32k.js +11 -0
- package/esm/model/gpt-4-32k.js.map +1 -0
- package/esm/model/gpt-4.d.ts +6 -1
- package/esm/model/gpt-4.js +10 -1
- package/esm/model/gpt-4.js.map +1 -1
- package/esm/modelParams.d.ts +5 -4
- package/esm/modelParams.js +6 -3
- package/esm/modelParams.js.map +1 -1
- package/esm/specialTokens.d.ts +3 -0
- package/esm/specialTokens.js +3 -0
- package/esm/specialTokens.js.map +1 -1
- package/esm/util.d.ts +2 -0
- package/esm/util.js +14 -0
- package/esm/util.js.map +1 -0
- package/package.json +8 -6
- package/src/GptEncoding.test.ts +78 -1
- package/src/GptEncoding.ts +125 -44
- package/src/__snapshots__/GptEncoding.test.ts.snap +811 -0
- package/src/codegen/generateByModel.ts +35 -0
- package/src/{generateJsModels.ts → codegen/generateJsEncodings.ts} +3 -3
- package/src/encoding/cl100k_base.ts +5 -1
- package/src/encoding/p50k_base.ts +1 -1
- package/src/encoding/p50k_edit.ts +1 -1
- package/src/encoding/r50k_base.ts +1 -1
- package/src/mapping.ts +42 -0
- package/src/model/gpt-3.5-turbo-0301.ts +32 -0
- package/src/model/gpt-3.5-turbo.ts +32 -1
- package/src/model/gpt-4-0314.ts +32 -0
- package/src/model/gpt-4-32k-0314.ts +32 -0
- package/src/model/gpt-4-32k.ts +32 -0
- package/src/model/gpt-4.ts +32 -1
- package/src/modelParams.ts +17 -10
- package/src/specialTokens.ts +3 -0
- package/src/util.ts +15 -0
- package/esm/generateByModel.js +0 -13
- package/esm/generateByModel.js.map +0 -1
- package/esm/generateJsModels.js.map +0 -1
- package/src/generateByModel.ts +0 -20
- /package/esm/{generateByModel.d.ts → codegen/generateByModel.d.ts} +0 -0
- /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, '
|
|
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, '
|
|
43
|
+
await fs.mkdir(path.join(__dirname, '../encodings'), { recursive: true })
|
|
44
44
|
await fs.writeFile(
|
|
45
|
-
path.join(__dirname,
|
|
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
|
-
|
|
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
|
package/src/model/gpt-4.ts
CHANGED
|
@@ -1 +1,32 @@
|
|
|
1
|
-
|
|
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
|
package/src/modelParams.ts
CHANGED
|
@@ -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
|
|
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):
|
|
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):
|
|
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):
|
|
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):
|
|
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
|
|
94
|
+
export function getEncodingParams(
|
|
88
95
|
encodingName: EncodingName,
|
|
89
96
|
getMergeableRanks: GetMergeableRanksFn,
|
|
90
|
-
):
|
|
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<
|
|
120
|
+
): Promise<EncodingParams> {
|
|
114
121
|
const mergeableBytePairRanks = await getMergeableRanks(encodingName)
|
|
115
|
-
return
|
|
122
|
+
return getEncodingParams(encodingName, () => mergeableBytePairRanks)
|
|
116
123
|
}
|
package/src/specialTokens.ts
CHANGED
|
@@ -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
|
+
}
|
package/esm/generateByModel.js
DELETED
|
@@ -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"}
|
package/src/generateByModel.ts
DELETED
|
@@ -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
|
-
)
|
|
File without changes
|
|
File without changes
|