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.
- 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 +2 -2
- package/cjs/encoding/cl100k_base.js +4 -2
- package/cjs/encoding/cl100k_base.js.map +1 -1
- package/cjs/encoding/p50k_base.d.ts +1 -1
- package/cjs/encoding/p50k_edit.d.ts +1 -1
- package/cjs/encoding/r50k_base.d.ts +1 -1
- package/cjs/main.d.ts +1 -0
- package/cjs/main.js +7 -0
- package/cjs/main.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/ada.d.ts +1 -0
- package/cjs/model/ada.js +7 -0
- package/cjs/model/ada.js.map +1 -1
- package/cjs/model/babbage.d.ts +1 -0
- package/cjs/model/babbage.js +7 -0
- package/cjs/model/babbage.js.map +1 -1
- package/cjs/model/code-cushman-001.d.ts +1 -0
- package/cjs/model/code-cushman-001.js +7 -0
- package/cjs/model/code-cushman-001.js.map +1 -1
- package/cjs/model/code-cushman-002.d.ts +1 -0
- package/cjs/model/code-cushman-002.js +7 -0
- package/cjs/model/code-cushman-002.js.map +1 -1
- package/cjs/model/code-davinci-001.d.ts +1 -0
- package/cjs/model/code-davinci-001.js +7 -0
- package/cjs/model/code-davinci-001.js.map +1 -1
- package/cjs/model/code-davinci-002.d.ts +1 -0
- package/cjs/model/code-davinci-002.js +7 -0
- package/cjs/model/code-davinci-002.js.map +1 -1
- package/cjs/model/code-davinci-edit-001.d.ts +1 -0
- package/cjs/model/code-davinci-edit-001.js +7 -0
- package/cjs/model/code-davinci-edit-001.js.map +1 -1
- package/cjs/model/code-search-ada-code-001.d.ts +1 -0
- package/cjs/model/code-search-ada-code-001.js +7 -0
- package/cjs/model/code-search-ada-code-001.js.map +1 -1
- package/cjs/model/code-search-babbage-code-001.d.ts +1 -0
- package/cjs/model/code-search-babbage-code-001.js +7 -0
- package/cjs/model/code-search-babbage-code-001.js.map +1 -1
- package/cjs/model/curie.d.ts +1 -0
- package/cjs/model/curie.js +7 -0
- package/cjs/model/curie.js.map +1 -1
- package/cjs/model/cushman-codex.d.ts +1 -0
- package/cjs/model/cushman-codex.js +7 -0
- package/cjs/model/cushman-codex.js.map +1 -1
- package/cjs/model/davinci-codex.d.ts +1 -0
- package/cjs/model/davinci-codex.js +7 -0
- package/cjs/model/davinci-codex.js.map +1 -1
- package/cjs/model/davinci.d.ts +1 -0
- package/cjs/model/davinci.js +7 -0
- package/cjs/model/davinci.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/model/text-ada-001.d.ts +1 -0
- package/cjs/model/text-ada-001.js +7 -0
- package/cjs/model/text-ada-001.js.map +1 -1
- package/cjs/model/text-babbage-001.d.ts +1 -0
- package/cjs/model/text-babbage-001.js +7 -0
- package/cjs/model/text-babbage-001.js.map +1 -1
- package/cjs/model/text-curie-001.d.ts +1 -0
- package/cjs/model/text-curie-001.js +7 -0
- package/cjs/model/text-curie-001.js.map +1 -1
- package/cjs/model/text-davinci-001.d.ts +1 -0
- package/cjs/model/text-davinci-001.js +7 -0
- package/cjs/model/text-davinci-001.js.map +1 -1
- package/cjs/model/text-davinci-002.d.ts +1 -0
- package/cjs/model/text-davinci-002.js +7 -0
- package/cjs/model/text-davinci-002.js.map +1 -1
- package/cjs/model/text-davinci-003.d.ts +1 -0
- package/cjs/model/text-davinci-003.js +7 -0
- package/cjs/model/text-davinci-003.js.map +1 -1
- package/cjs/model/text-davinci-edit-001.d.ts +1 -0
- package/cjs/model/text-davinci-edit-001.js +7 -0
- package/cjs/model/text-davinci-edit-001.js.map +1 -1
- package/cjs/model/text-embedding-ada-002.d.ts +1 -0
- package/cjs/model/text-embedding-ada-002.js +7 -0
- package/cjs/model/text-embedding-ada-002.js.map +1 -1
- package/cjs/model/text-search-ada-doc-001.d.ts +1 -0
- package/cjs/model/text-search-ada-doc-001.js +7 -0
- package/cjs/model/text-search-ada-doc-001.js.map +1 -1
- package/cjs/model/text-search-babbage-doc-001.d.ts +1 -0
- package/cjs/model/text-search-babbage-doc-001.js +7 -0
- package/cjs/model/text-search-babbage-doc-001.js.map +1 -1
- package/cjs/model/text-search-curie-doc-001.d.ts +1 -0
- package/cjs/model/text-search-curie-doc-001.js +7 -0
- package/cjs/model/text-search-curie-doc-001.js.map +1 -1
- package/cjs/model/text-search-davinci-doc-001.d.ts +1 -0
- package/cjs/model/text-search-davinci-doc-001.js +7 -0
- package/cjs/model/text-search-davinci-doc-001.js.map +1 -1
- package/cjs/model/text-similarity-ada-001.d.ts +1 -0
- package/cjs/model/text-similarity-ada-001.js +7 -0
- package/cjs/model/text-similarity-ada-001.js.map +1 -1
- package/cjs/model/text-similarity-babbage-001.d.ts +1 -0
- package/cjs/model/text-similarity-babbage-001.js +7 -0
- package/cjs/model/text-similarity-babbage-001.js.map +1 -1
- package/cjs/model/text-similarity-curie-001.d.ts +1 -0
- package/cjs/model/text-similarity-curie-001.js +7 -0
- package/cjs/model/text-similarity-curie-001.js.map +1 -1
- package/cjs/model/text-similarity-davinci-001.d.ts +1 -0
- package/cjs/model/text-similarity-davinci-001.js +7 -0
- package/cjs/model/text-similarity-davinci-001.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 +2 -2
- package/esm/encoding/cl100k_base.js +2 -2
- package/esm/encoding/cl100k_base.js.map +1 -1
- package/esm/encoding/p50k_base.d.ts +1 -1
- package/esm/encoding/p50k_edit.d.ts +1 -1
- package/esm/encoding/r50k_base.d.ts +1 -1
- package/esm/main.d.ts +1 -0
- package/esm/main.js +2 -0
- package/esm/main.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/ada.d.ts +1 -0
- package/esm/model/ada.js +2 -0
- package/esm/model/ada.js.map +1 -1
- package/esm/model/babbage.d.ts +1 -0
- package/esm/model/babbage.js +2 -0
- package/esm/model/babbage.js.map +1 -1
- package/esm/model/code-cushman-001.d.ts +1 -0
- package/esm/model/code-cushman-001.js +2 -0
- package/esm/model/code-cushman-001.js.map +1 -1
- package/esm/model/code-cushman-002.d.ts +1 -0
- package/esm/model/code-cushman-002.js +2 -0
- package/esm/model/code-cushman-002.js.map +1 -1
- package/esm/model/code-davinci-001.d.ts +1 -0
- package/esm/model/code-davinci-001.js +2 -0
- package/esm/model/code-davinci-001.js.map +1 -1
- package/esm/model/code-davinci-002.d.ts +1 -0
- package/esm/model/code-davinci-002.js +2 -0
- package/esm/model/code-davinci-002.js.map +1 -1
- package/esm/model/code-davinci-edit-001.d.ts +1 -0
- package/esm/model/code-davinci-edit-001.js +2 -0
- package/esm/model/code-davinci-edit-001.js.map +1 -1
- package/esm/model/code-search-ada-code-001.d.ts +1 -0
- package/esm/model/code-search-ada-code-001.js +2 -0
- package/esm/model/code-search-ada-code-001.js.map +1 -1
- package/esm/model/code-search-babbage-code-001.d.ts +1 -0
- package/esm/model/code-search-babbage-code-001.js +2 -0
- package/esm/model/code-search-babbage-code-001.js.map +1 -1
- package/esm/model/curie.d.ts +1 -0
- package/esm/model/curie.js +2 -0
- package/esm/model/curie.js.map +1 -1
- package/esm/model/cushman-codex.d.ts +1 -0
- package/esm/model/cushman-codex.js +2 -0
- package/esm/model/cushman-codex.js.map +1 -1
- package/esm/model/davinci-codex.d.ts +1 -0
- package/esm/model/davinci-codex.js +2 -0
- package/esm/model/davinci-codex.js.map +1 -1
- package/esm/model/davinci.d.ts +1 -0
- package/esm/model/davinci.js +2 -0
- package/esm/model/davinci.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/model/text-ada-001.d.ts +1 -0
- package/esm/model/text-ada-001.js +2 -0
- package/esm/model/text-ada-001.js.map +1 -1
- package/esm/model/text-babbage-001.d.ts +1 -0
- package/esm/model/text-babbage-001.js +2 -0
- package/esm/model/text-babbage-001.js.map +1 -1
- package/esm/model/text-curie-001.d.ts +1 -0
- package/esm/model/text-curie-001.js +2 -0
- package/esm/model/text-curie-001.js.map +1 -1
- package/esm/model/text-davinci-001.d.ts +1 -0
- package/esm/model/text-davinci-001.js +2 -0
- package/esm/model/text-davinci-001.js.map +1 -1
- package/esm/model/text-davinci-002.d.ts +1 -0
- package/esm/model/text-davinci-002.js +2 -0
- package/esm/model/text-davinci-002.js.map +1 -1
- package/esm/model/text-davinci-003.d.ts +1 -0
- package/esm/model/text-davinci-003.js +2 -0
- package/esm/model/text-davinci-003.js.map +1 -1
- package/esm/model/text-davinci-edit-001.d.ts +1 -0
- package/esm/model/text-davinci-edit-001.js +2 -0
- package/esm/model/text-davinci-edit-001.js.map +1 -1
- package/esm/model/text-embedding-ada-002.d.ts +1 -0
- package/esm/model/text-embedding-ada-002.js +2 -0
- package/esm/model/text-embedding-ada-002.js.map +1 -1
- package/esm/model/text-search-ada-doc-001.d.ts +1 -0
- package/esm/model/text-search-ada-doc-001.js +2 -0
- package/esm/model/text-search-ada-doc-001.js.map +1 -1
- package/esm/model/text-search-babbage-doc-001.d.ts +1 -0
- package/esm/model/text-search-babbage-doc-001.js +2 -0
- package/esm/model/text-search-babbage-doc-001.js.map +1 -1
- package/esm/model/text-search-curie-doc-001.d.ts +1 -0
- package/esm/model/text-search-curie-doc-001.js +2 -0
- package/esm/model/text-search-curie-doc-001.js.map +1 -1
- package/esm/model/text-search-davinci-doc-001.d.ts +1 -0
- package/esm/model/text-search-davinci-doc-001.js +2 -0
- package/esm/model/text-search-davinci-doc-001.js.map +1 -1
- package/esm/model/text-similarity-ada-001.d.ts +1 -0
- package/esm/model/text-similarity-ada-001.js +2 -0
- package/esm/model/text-similarity-ada-001.js.map +1 -1
- package/esm/model/text-similarity-babbage-001.d.ts +1 -0
- package/esm/model/text-similarity-babbage-001.js +2 -0
- package/esm/model/text-similarity-babbage-001.js.map +1 -1
- package/esm/model/text-similarity-curie-001.d.ts +1 -0
- package/esm/model/text-similarity-curie-001.js +2 -0
- package/esm/model/text-similarity-curie-001.js.map +1 -1
- package/esm/model/text-similarity-davinci-001.d.ts +1 -0
- package/esm/model/text-similarity-davinci-001.js +2 -0
- package/esm/model/text-similarity-davinci-001.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 +4 -0
- package/src/main.ts +2 -0
- package/src/mapping.ts +42 -0
- package/src/model/ada.ts +2 -0
- package/src/model/babbage.ts +2 -0
- package/src/model/code-cushman-001.ts +2 -0
- package/src/model/code-cushman-002.ts +2 -0
- package/src/model/code-davinci-001.ts +2 -0
- package/src/model/code-davinci-002.ts +2 -0
- package/src/model/code-davinci-edit-001.ts +2 -0
- package/src/model/code-search-ada-code-001.ts +2 -0
- package/src/model/code-search-babbage-code-001.ts +2 -0
- package/src/model/curie.ts +2 -0
- package/src/model/cushman-codex.ts +2 -0
- package/src/model/davinci-codex.ts +2 -0
- package/src/model/davinci.ts +2 -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/model/text-ada-001.ts +2 -0
- package/src/model/text-babbage-001.ts +2 -0
- package/src/model/text-curie-001.ts +2 -0
- package/src/model/text-davinci-001.ts +2 -0
- package/src/model/text-davinci-002.ts +2 -0
- package/src/model/text-davinci-003.ts +2 -0
- package/src/model/text-davinci-edit-001.ts +2 -0
- package/src/model/text-embedding-ada-002.ts +2 -0
- package/src/model/text-search-ada-doc-001.ts +2 -0
- package/src/model/text-search-babbage-doc-001.ts +2 -0
- package/src/model/text-search-curie-doc-001.ts +2 -0
- package/src/model/text-search-davinci-doc-001.ts +2 -0
- package/src/model/text-similarity-ada-001.ts +2 -0
- package/src/model/text-similarity-babbage-001.ts +2 -0
- package/src/model/text-similarity-curie-001.ts +2 -0
- package/src/model/text-similarity-davinci-001.ts +2 -0
- 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
|
+
: `// eslint-disable-next-line no-restricted-exports, import/no-default-export\nexport { default } from '../encoding/${encoding}.js'\nexport * 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;`,
|
|
@@ -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
|
}
|
package/src/main.ts
CHANGED
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]
|
package/src/model/ada.ts
CHANGED
package/src/model/babbage.ts
CHANGED
package/src/model/curie.ts
CHANGED
package/src/model/davinci.ts
CHANGED
|
@@ -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"}
|