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
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/esm/modelParams.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EncoderMap } from './EncoderMap.js';
|
|
2
|
-
import type { EncodingName } from './mapping.js';
|
|
3
|
-
export interface
|
|
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
|
|
22
|
-
export declare function getModelParamsAsync(encodingName: EncodingName, getMergeableRanks: GetMergeableRanksAsyncFn): Promise<
|
|
22
|
+
export declare function getEncodingParams(encodingName: EncodingName, getMergeableRanks: GetMergeableRanksFn): EncodingParams;
|
|
23
|
+
export declare function getModelParamsAsync(encodingName: EncodingName, getMergeableRanks: GetMergeableRanksAsyncFn): Promise<EncodingParams>;
|
package/esm/modelParams.js
CHANGED
|
@@ -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
|
|
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
|
|
68
|
+
return getEncodingParams(encodingName, () => mergeableBytePairRanks);
|
|
66
69
|
}
|
|
67
70
|
//# sourceMappingURL=modelParams.js.map
|
package/esm/modelParams.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/esm/specialTokens.d.ts
CHANGED
|
@@ -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|>";
|
package/esm/specialTokens.js
CHANGED
|
@@ -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
|
package/esm/specialTokens.js.map
CHANGED
|
@@ -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
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
|
package/esm/util.js.map
ADDED
|
@@ -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.
|
|
4
|
-
"description": "BPE Encoder
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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",
|
package/src/GptEncoding.test.ts
CHANGED
|
@@ -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 {
|
|
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')
|
package/src/GptEncoding.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
63
|
+
modelName,
|
|
64
|
+
}: EncodingParams) {
|
|
44
65
|
const maxTokenValue = Math.max(
|
|
45
|
-
|
|
46
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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(
|
|
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(
|
|
158
|
+
if (allowedSpecial.has(ALL_SPECIAL_TOKENS)) {
|
|
145
159
|
allowedSpecial = specialTokensSet
|
|
146
160
|
}
|
|
147
161
|
|
|
148
162
|
if (disallowedSpecial.size > 0) {
|
|
149
|
-
const regexPattern =
|
|
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
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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(
|
|
178
|
-
|
|
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
|