diff --git a/legacy/examples/sentiment.ts b/legacy/examples/sentiment.ts index 0c30539a..b36e3cdb 100644 --- a/legacy/examples/sentiment.ts +++ b/legacy/examples/sentiment.ts @@ -13,12 +13,12 @@ export async function main() { ) .input(z.object({ texts: z.string().array() })) .output(z.array(z.object({ text: z.string(), label: z.string() }))) - // .examples([ - // { input: 'The food was digusting', output: 'negative' }, - // { input: 'We had a fantastic night', output: 'positive' }, - // { input: 'Recommended', output: 'positive' }, - // { input: 'The waiter was rude', output: 'negative' } - // ]) + .examples([ + { input: 'The food was digusting', output: 'negative' }, + { input: 'We had a fantastic night', output: 'positive' }, + { input: 'Recommended', output: 'positive' }, + { input: 'The waiter was rude', output: 'negative' } + ]) .call({ texts: [ 'I went to this place and it was just so awful.', diff --git a/legacy/package.json b/legacy/package.json index 46eca4c6..2c37feda 100644 --- a/legacy/package.json +++ b/legacy/package.json @@ -38,16 +38,16 @@ "test:eslint": "eslint \"**/*.ts\"" }, "dependencies": { - "@anthropic-ai/sdk": "^0.4.3", - "@inquirer/checkbox": "^1.3.0", - "@inquirer/editor": "^1.1.0", - "@inquirer/select": "^1.2.0", + "@anthropic-ai/sdk": "^0.4.4", + "@inquirer/checkbox": "^1.3.1", + "@inquirer/editor": "^1.2.0", + "@inquirer/select": "^1.2.1", "debug": "^4.3.4", "handlebars": "^4.7.7", "js-tiktoken": "^1.0.6", "jsonrepair": "^3.1.0", "ky": "^0.33.3", - "openai-fetch": "^1.5.0", + "openai-fetch": "^1.5.1", "p-map": "^6.0.0", "p-retry": "^5.1.2", "p-timeout": "^6.1.1", @@ -59,14 +59,14 @@ "zod-validation-error": "^1.3.0" }, "devDependencies": { - "@keyv/redis": "^2.6.0", + "@keyv/redis": "^2.6.1", "@trivago/prettier-plugin-sort-imports": "^4.1.1", "@types/debug": "^4.1.8", "@types/node": "^20.2.5", "@types/sinon": "^10.0.15", "@types/uuid": "^9.0.1", - "@typescript-eslint/eslint-plugin": "^5.59.8", - "@typescript-eslint/parser": "^5.59.8", + "@typescript-eslint/eslint-plugin": "^5.59.9", + "@typescript-eslint/parser": "^5.59.9", "ava": "^5.3.0", "del-cli": "^5.0.0", "dotenv": "^16.1.4", diff --git a/legacy/pnpm-lock.yaml b/legacy/pnpm-lock.yaml index 6e62a9c5..7047ef7b 100644 --- a/legacy/pnpm-lock.yaml +++ b/legacy/pnpm-lock.yaml @@ -6,17 +6,17 @@ settings: dependencies: '@anthropic-ai/sdk': - specifier: ^0.4.3 - version: 0.4.3 + specifier: ^0.4.4 + version: 0.4.4 '@inquirer/checkbox': - specifier: ^1.3.0 - version: 1.3.0 + specifier: ^1.3.1 + version: 1.3.1 '@inquirer/editor': - specifier: ^1.1.0 - version: 1.1.0 - '@inquirer/select': specifier: ^1.2.0 version: 1.2.0 + '@inquirer/select': + specifier: ^1.2.1 + version: 1.2.1 debug: specifier: ^4.3.4 version: 4.3.4 @@ -33,8 +33,8 @@ dependencies: specifier: ^0.33.3 version: 0.33.3 openai-fetch: - specifier: ^1.5.0 - version: 1.5.0 + specifier: ^1.5.1 + version: 1.5.1 p-map: specifier: ^6.0.0 version: 6.0.0 @@ -65,8 +65,8 @@ dependencies: devDependencies: '@keyv/redis': - specifier: ^2.6.0 - version: 2.6.0 + specifier: ^2.6.1 + version: 2.6.1 '@trivago/prettier-plugin-sort-imports': specifier: ^4.1.1 version: 4.1.1(prettier@2.8.8) @@ -83,11 +83,11 @@ devDependencies: specifier: ^9.0.1 version: 9.0.1 '@typescript-eslint/eslint-plugin': - specifier: ^5.59.8 - version: 5.59.8(@typescript-eslint/parser@5.59.8)(eslint@8.42.0)(typescript@5.1.3) + specifier: ^5.59.9 + version: 5.59.9(@typescript-eslint/parser@5.59.9)(eslint@8.42.0)(typescript@5.1.3) '@typescript-eslint/parser': - specifier: ^5.59.8 - version: 5.59.8(eslint@8.42.0)(typescript@5.1.3) + specifier: ^5.59.9 + version: 5.59.9(eslint@8.42.0)(typescript@5.1.3) ava: specifier: ^5.3.0 version: 5.3.0 @@ -151,8 +151,8 @@ devDependencies: packages: - /@anthropic-ai/sdk@0.4.3: - resolution: {integrity: sha512-SZrlXvjUUYT9rPmSzlTtmVk1OjVNpkCzILRluhiYwNcxXfQyvPJDi0CI6PyymygcgtqEF5EVqhKmC/PtPsNEIw==} + /@anthropic-ai/sdk@0.4.4: + resolution: {integrity: sha512-Z/39nQi1sSUCeLII3lsAbL1u+0JF6cR2XmUEX9sLH0VtxmIjY6cjOUYjCkYh4oapTxOkhAFnVSAFJ6cxml2qXg==} dependencies: '@fortaine/fetch-event-source': 3.0.6 cross-fetch: 3.1.6 @@ -186,21 +186,21 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.21.9 - '@babel/types': 7.22.0 + '@babel/types': 7.22.4 dev: true /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.0 + '@babel/types': 7.22.4 dev: true /@babel/helper-split-export-declaration@7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.0 + '@babel/types': 7.22.4 dev: true /@babel/helper-string-parser@7.21.5: @@ -222,8 +222,8 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser@7.22.0: - resolution: {integrity: sha512-DA65VCJRetcFmJnt9/hEmRvXNCwk0V86dxG6p6N13hzDazaLRjGdTGPGgjxZOtLuFgWzOSRX4grybmRXwQ9bSg==} + /@babel/parser@7.22.4: + resolution: {integrity: sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==} engines: {node: '>=6.0.0'} hasBin: true dependencies: @@ -235,8 +235,8 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.21.4 - '@babel/parser': 7.22.0 - '@babel/types': 7.22.0 + '@babel/parser': 7.22.4 + '@babel/types': 7.22.4 dev: true /@babel/traverse@7.17.3: @@ -249,7 +249,7 @@ packages: '@babel/helper-function-name': 7.21.0 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.22.0 + '@babel/parser': 7.22.4 '@babel/types': 7.17.0 debug: 4.3.4 globals: 11.12.0 @@ -265,8 +265,8 @@ packages: to-fast-properties: 2.0.0 dev: true - /@babel/types@7.22.0: - resolution: {integrity: sha512-NtXlm3f6cNWIv003cETdlz9sss0VMNtplyatFohxWPz90AbwuhCbHbQopkGis6bG1vOunDLN0FF/4Uv5i8LFZQ==} + /@babel/types@7.22.4: + resolution: {integrity: sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.21.5 @@ -278,7 +278,7 @@ packages: resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} dependencies: '@esbuild-kit/core-utils': 3.1.0 - get-tsconfig: 4.5.0 + get-tsconfig: 4.6.0 dev: true /@esbuild-kit/core-utils@3.1.0: @@ -292,7 +292,7 @@ packages: resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} dependencies: '@esbuild-kit/core-utils': 3.1.0 - get-tsconfig: 4.5.0 + get-tsconfig: 4.6.0 dev: true /@esbuild/android-arm64@0.17.19: @@ -555,19 +555,19 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@inquirer/checkbox@1.3.0: - resolution: {integrity: sha512-kfYE5BH7vO0j2IwSgxzDmKPzQm/OpLnIZEEbOetYM+k4+YKTbSqeqCu7VZl3d8/rtotgJQc7gb8u2pIVeJh3Mg==} + /@inquirer/checkbox@1.3.1: + resolution: {integrity: sha512-3l3aC6gYOPGaVOa9cNe4dZ8t96e3CFifC3Hee1MD+F7qaRxGAuXnhCQiUr4ngj2P7xd9U3DCDbLXNsLKQoHYCg==} engines: {node: '>=14.18.0'} dependencies: - '@inquirer/core': 2.0.0 + '@inquirer/core': 2.1.0 '@inquirer/type': 1.1.0 ansi-escapes: 4.3.2 chalk: 4.1.2 figures: 3.2.0 dev: false - /@inquirer/core@2.0.0: - resolution: {integrity: sha512-NnLGihYWEFVdFIoEDPwGO0jB5phuNcxTUHSNq5geyiOVQOnWNuX9x2rhPPeiikE/5fNXIBmqojD0+PiD9whtXw==} + /@inquirer/core@2.1.0: + resolution: {integrity: sha512-Hq9hZ5G/VUaeWkSs283HZwwMbe79lcOI5HWwW1GIM1ohouy2/x489Qf/A1BJYvMUj+QG4LSB5LtVMjn9P3Ge6Q==} engines: {node: '>=14.18.0'} dependencies: '@inquirer/type': 1.1.0 @@ -583,21 +583,21 @@ packages: wrap-ansi: 6.2.0 dev: false - /@inquirer/editor@1.1.0: - resolution: {integrity: sha512-ll6NfzutAuzRwNELERhECZCnAIzb2DdnRaNwtJ3Gfy6MrQBdYpFzGLwDyxB8+yf2iJoMOmsKWnzGbmvWNvSUhw==} + /@inquirer/editor@1.2.0: + resolution: {integrity: sha512-NMXLLNadvqIR6TD6mNZRa/PKHTvdaa4ndGGeXl+DwybQ4K7cVSJNRrztixpM1KDEoG8Ape5ightNwq25cyugTg==} engines: {node: '>=14.18.0'} dependencies: - '@inquirer/core': 2.0.0 + '@inquirer/core': 2.1.0 '@inquirer/type': 1.1.0 chalk: 4.1.2 external-editor: 3.1.0 dev: false - /@inquirer/select@1.2.0: - resolution: {integrity: sha512-2CqhtE40GFmRXDFzJeMvSowKcO2/yvIzgSpL44+Hl/SAO/1FJgmHNAFGBuqX0RbohYPnSpF8eftgiy16fA3RJw==} + /@inquirer/select@1.2.1: + resolution: {integrity: sha512-13JDLtlwFoqQUYRdMzz5wP3a4DWccJfNA/8M8MDUhhZ8HeKZ3MPaTMlpxwY+Q0Jgbmt56nf7xUuck0XXPce8Xw==} engines: {node: '>=14.18.0'} dependencies: - '@inquirer/core': 2.0.0 + '@inquirer/core': 2.1.0 '@inquirer/type': 1.1.0 ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -647,8 +647,8 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@keyv/redis@2.6.0: - resolution: {integrity: sha512-fu2mgLp6lwo0l+fT1dFHm+t16EDrD/WECho84HNapsqnelQImv81SCBdi+ky2Hw1BuH2ncku7uNbiZvB631/TA==} + /@keyv/redis@2.6.1: + resolution: {integrity: sha512-s0L2DRZoa3eahIf/I/mhG6bpb90JFKVnpd1iVlhBOr6PxsqvCyPU99BhZKRAkMThnoJZRewI7sO9G/bYjQ+B6Q==} engines: {node: '>= 14'} dependencies: ioredis: 5.3.2 @@ -717,7 +717,7 @@ packages: optional: true dependencies: '@babel/generator': 7.17.7 - '@babel/parser': 7.22.0 + '@babel/parser': 7.22.4 '@babel/traverse': 7.17.3 '@babel/types': 7.17.0 javascript-natural-sort: 0.7.1 @@ -775,8 +775,8 @@ packages: resolution: {integrity: sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==} dev: true - /@typescript-eslint/eslint-plugin@5.59.8(@typescript-eslint/parser@5.59.8)(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==} + /@typescript-eslint/eslint-plugin@5.59.9(@typescript-eslint/parser@5.59.9)(eslint@8.42.0)(typescript@5.1.3): + resolution: {integrity: sha512-4uQIBq1ffXd2YvF7MAvehWKW3zVv/w+mSfRAu+8cKbfj3nwzyqJLNcZJpQ/WZ1HLbJDiowwmQ6NO+63nCA+fqA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -787,10 +787,10 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.5.1 - '@typescript-eslint/parser': 5.59.8(eslint@8.42.0)(typescript@5.1.3) - '@typescript-eslint/scope-manager': 5.59.8 - '@typescript-eslint/type-utils': 5.59.8(eslint@8.42.0)(typescript@5.1.3) - '@typescript-eslint/utils': 5.59.8(eslint@8.42.0)(typescript@5.1.3) + '@typescript-eslint/parser': 5.59.9(eslint@8.42.0)(typescript@5.1.3) + '@typescript-eslint/scope-manager': 5.59.9 + '@typescript-eslint/type-utils': 5.59.9(eslint@8.42.0)(typescript@5.1.3) + '@typescript-eslint/utils': 5.59.9(eslint@8.42.0)(typescript@5.1.3) debug: 4.3.4 eslint: 8.42.0 grapheme-splitter: 1.0.4 @@ -803,8 +803,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@5.59.8(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==} + /@typescript-eslint/parser@5.59.9(eslint@8.42.0)(typescript@5.1.3): + resolution: {integrity: sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -813,9 +813,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.59.8 - '@typescript-eslint/types': 5.59.8 - '@typescript-eslint/typescript-estree': 5.59.8(typescript@5.1.3) + '@typescript-eslint/scope-manager': 5.59.9 + '@typescript-eslint/types': 5.59.9 + '@typescript-eslint/typescript-estree': 5.59.9(typescript@5.1.3) debug: 4.3.4 eslint: 8.42.0 typescript: 5.1.3 @@ -823,16 +823,16 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager@5.59.8: - resolution: {integrity: sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==} + /@typescript-eslint/scope-manager@5.59.9: + resolution: {integrity: sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.59.8 - '@typescript-eslint/visitor-keys': 5.59.8 + '@typescript-eslint/types': 5.59.9 + '@typescript-eslint/visitor-keys': 5.59.9 dev: true - /@typescript-eslint/type-utils@5.59.8(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==} + /@typescript-eslint/type-utils@5.59.9(eslint@8.42.0)(typescript@5.1.3): + resolution: {integrity: sha512-ksEsT0/mEHg9e3qZu98AlSrONAQtrSTljL3ow9CGej8eRo7pe+yaC/mvTjptp23Xo/xIf2mLZKC6KPv4Sji26Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -841,8 +841,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.59.8(typescript@5.1.3) - '@typescript-eslint/utils': 5.59.8(eslint@8.42.0)(typescript@5.1.3) + '@typescript-eslint/typescript-estree': 5.59.9(typescript@5.1.3) + '@typescript-eslint/utils': 5.59.9(eslint@8.42.0)(typescript@5.1.3) debug: 4.3.4 eslint: 8.42.0 tsutils: 3.21.0(typescript@5.1.3) @@ -851,13 +851,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types@5.59.8: - resolution: {integrity: sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==} + /@typescript-eslint/types@5.59.9: + resolution: {integrity: sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree@5.59.8(typescript@5.1.3): - resolution: {integrity: sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==} + /@typescript-eslint/typescript-estree@5.59.9(typescript@5.1.3): + resolution: {integrity: sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -865,8 +865,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.59.8 - '@typescript-eslint/visitor-keys': 5.59.8 + '@typescript-eslint/types': 5.59.9 + '@typescript-eslint/visitor-keys': 5.59.9 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -877,8 +877,8 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@5.59.8(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==} + /@typescript-eslint/utils@5.59.9(eslint@8.42.0)(typescript@5.1.3): + resolution: {integrity: sha512-1PuMYsju/38I5Ggblaeb98TOoUvjhRvLpLa1DoTOFaLWqaXl/1iQ1eGurTXgBY58NUdtfTXKP5xBq7q9NDaLKg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -886,9 +886,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 5.59.8 - '@typescript-eslint/types': 5.59.8 - '@typescript-eslint/typescript-estree': 5.59.8(typescript@5.1.3) + '@typescript-eslint/scope-manager': 5.59.9 + '@typescript-eslint/types': 5.59.9 + '@typescript-eslint/typescript-estree': 5.59.9(typescript@5.1.3) eslint: 8.42.0 eslint-scope: 5.1.1 semver: 7.5.1 @@ -897,11 +897,11 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys@5.59.8: - resolution: {integrity: sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==} + /@typescript-eslint/visitor-keys@5.59.9: + resolution: {integrity: sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.59.8 + '@typescript-eslint/types': 5.59.9 eslint-visitor-keys: 3.4.1 dev: true @@ -1089,7 +1089,7 @@ packages: pretty-ms: 8.0.0 resolve-cwd: 3.0.0 stack-utils: 2.0.6 - strip-ansi: 7.0.1 + strip-ansi: 7.1.0 supertap: 3.0.1 temp-dir: 3.0.0 write-file-atomic: 5.0.1 @@ -1962,8 +1962,10 @@ packages: get-intrinsic: 1.2.1 dev: true - /get-tsconfig@4.5.0: - resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==} + /get-tsconfig@4.6.0: + resolution: {integrity: sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg==} + dependencies: + resolve-pkg-maps: 1.0.0 dev: true /glob-parent@5.1.2: @@ -2946,8 +2948,8 @@ packages: mimic-fn: 4.0.0 dev: true - /openai-fetch@1.5.0: - resolution: {integrity: sha512-GSCt5JPNWTADNeip9DUXlkZMwwxczKBRokKLInTQbbX0t81VqTBBUYis36XZeWHQP4eWeWMLe9nGiTtciqZ1HA==} + /openai-fetch@1.5.1: + resolution: {integrity: sha512-LDSsXTFa2ssjYTZY51+B/69wXg8/UteqKyPtuFa+bMFRav7ACQXi3AJl+gieh3BF8La95NHCE0FS8t0F8fRHwA==} dependencies: ky: 0.33.3 zod: 3.21.4 @@ -3325,6 +3327,10 @@ packages: engines: {node: '>=8'} dev: true + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + /resolve@1.22.2: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true @@ -3363,8 +3369,8 @@ packages: glob: 7.2.3 dev: true - /rollup@3.23.0: - resolution: {integrity: sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==} + /rollup@3.23.1: + resolution: {integrity: sha512-ybRdFVHOoljGEFILHLd2g/qateqUdjE6YS41WXq4p3C/WwD3xtWxV4FYWETA1u9TeXQc5K8L8zHE5d/scOvrOQ==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -3385,7 +3391,7 @@ packages: /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.5.2 + tslib: 2.5.3 dev: true /safe-regex-test@1.0.0: @@ -3609,7 +3615,7 @@ packages: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.0.1 + strip-ansi: 7.1.0 dev: true /string.prototype.padend@3.1.4: @@ -3652,8 +3658,8 @@ packages: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.0.1: - resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 @@ -3707,7 +3713,7 @@ packages: indent-string: 5.0.0 js-yaml: 3.14.1 serialize-error: 7.0.1 - strip-ansi: 7.0.1 + strip-ansi: 7.1.0 dev: true /supports-color@5.5.0: @@ -3811,8 +3817,8 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib@2.5.2: - resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==} + /tslib@2.5.3: + resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} dev: true /tsup@6.7.0(typescript@5.1.3): @@ -3841,7 +3847,7 @@ packages: joycon: 3.1.1 postcss-load-config: 3.1.4 resolve-from: 5.0.0 - rollup: 3.23.0 + rollup: 3.23.1 source-map: 0.8.0-beta.0 sucrase: 3.32.0 tree-kill: 1.2.2 diff --git a/legacy/src/llm.ts b/legacy/src/llm.ts index 7893ea0b..09a2db19 100644 --- a/legacy/src/llm.ts +++ b/legacy/src/llm.ts @@ -1,4 +1,5 @@ import { jsonrepair } from 'jsonrepair' +import pMap from 'p-map' import { dedent } from 'ts-dedent' import { type SetRequired } from 'type-fest' import { ZodRawShape, ZodTypeAny, z } from 'zod' @@ -7,6 +8,11 @@ import { printNode, zodToTs } from 'zod-to-ts' import * as types from './types' import { BaseTask } from './task' import { getCompiledTemplate } from './template' +import { + Tokenizer, + getModelNameForTiktoken, + getTokenizerForModel +} from './tokenizer' import { extractJSONArrayFromString, extractJSONObjectFromString @@ -24,6 +30,7 @@ export abstract class BaseLLM< protected _model: string protected _modelParams: TModelParams | undefined protected _examples: types.LLMExample[] | undefined + protected _tokenizer?: Tokenizer | null constructor( options: SetRequired< @@ -86,6 +93,30 @@ export abstract class BaseLLM< this._modelParams = { ...this._modelParams, ...params } as TModelParams return this } + + async getNumTokens(text: string): Promise { + if (this._tokenizer === undefined) { + const model = this._model || 'gpt2' + + try { + this._tokenizer = await getTokenizerForModel(model) + } catch (err) { + this._tokenizer = null + + console.warn( + `Failed to initialize tokenizer for model "${model}", falling back to approximate count`, + err + ) + } + } + + if (this._tokenizer) { + return this._tokenizer.encode(text).length + } + + // fallback to approximate calculation if tokenizer is not available + return Math.ceil(text.length / 4) + } } export abstract class BaseChatModel< @@ -111,9 +142,7 @@ export abstract class BaseChatModel< messages: types.ChatMessage[] ): Promise> - protected override async _call( - input?: types.ParsedData - ): Promise> { + public async buildMessages(input?: types.ParsedData) { if (this._inputSchema) { const inputSchema = this._inputSchema instanceof z.ZodType @@ -183,6 +212,14 @@ export abstract class BaseChatModel< // TODO: filter/compress messages based on token counts + return messages + } + + protected override async _call( + input?: types.ParsedData + ): Promise> { + const messages = await this.buildMessages(input) + console.log('>>>') console.log(messages) @@ -244,13 +281,69 @@ export abstract class BaseChatModel< return { result: outputSchema.parse(output), - metadata: {} + metadata: { + input, + messages, + completion + } } } else { return { result: output, - metadata: {} + metadata: { + input, + messages, + completion + } } } } + + async getNumTokensForMessages(messages: types.ChatMessage[]): Promise<{ + numTokensTotal: number + numTokensPerMessage: number[] + }> { + let numTokensTotal = 0 + let tokensPerMessage = 0 + let tokensPerName = 0 + + const modelName = getModelNameForTiktoken(this._model) + + if (modelName === 'gpt-3.5-turbo') { + tokensPerMessage = 4 + tokensPerName = -1 + } else if (modelName.startsWith('gpt-4')) { + tokensPerMessage = 3 + tokensPerName = 1 + } else { + // TODO + } + + const numTokensPerMessage = await pMap( + messages, + async (message) => { + const [numTokensContent, numTokensRole, numTokensName] = + await Promise.all([ + this.getNumTokens(message.content), + this.getNumTokens(message.role), + message.name + ? this.getNumTokens(message.name).then((n) => n + tokensPerName) + : Promise.resolve(0) + ]) + + const numTokens = + tokensPerMessage + numTokensContent + numTokensRole + numTokensName + + numTokensTotal += numTokens + return numTokens + }, + { + concurrency: 8 + } + ) + + numTokensTotal += 3 // every reply is primed with <|start|>assistant<|message|> + + return { numTokensTotal, numTokensPerMessage } + } } diff --git a/legacy/src/task.ts b/legacy/src/task.ts index 60655b51..cfc28370 100644 --- a/legacy/src/task.ts +++ b/legacy/src/task.ts @@ -53,7 +53,8 @@ export abstract class BaseTask< public async call( input?: types.ParsedData ): Promise> { - return this._call(input).then((response) => response.result) + const res = await this.callWithMetadata(input) + return res.result } public async callWithMetadata( diff --git a/legacy/src/tokenizer.ts b/legacy/src/tokenizer.ts index 24b80811..3c4408bd 100644 --- a/legacy/src/tokenizer.ts +++ b/legacy/src/tokenizer.ts @@ -1,6 +1,176 @@ -import { getEncoding, getEncodingNameForModel } from 'js-tiktoken' +import { + Tiktoken, + TiktokenBPE, + TiktokenEncoding, + TiktokenModel, + getEncodingNameForModel +} from 'js-tiktoken/lite' +import ky from 'ky' +import pMemoize from 'p-memoize' -export function getTokenizerForModel(model: string) { - const encodingName = getEncodingNameForModel(model as any) - return getEncoding(encodingName) +export interface Tokenizer { + encode( + text: string, + options?: { + allowedSpecial?: Array | 'all' + disallowedSpecial?: Array | 'all' + } + ): number[] + + decode(tokens: number[]): string +} + +export class TiktokenTokenizer implements Tokenizer { + protected _tiktoken: Tiktoken + + constructor(tiktoken: Tiktoken) { + this._tiktoken = tiktoken + } + + encode( + text: string, + options?: { + allowedSpecial?: Array | 'all' + disallowedSpecial?: Array | 'all' + } + ): number[] { + return this._tiktoken.encode( + text, + options?.allowedSpecial, + options?.disallowedSpecial + ) + } + + decode(tokens: number[]): string { + return this._tiktoken.decode(tokens) + } +} + +export const getTiktokenBPE = pMemoize(getTiktokenBPEImpl) + +async function getTiktokenBPEImpl( + encoding: TiktokenEncoding, + { + signal, + timeoutMs = 30000 + }: { + signal?: AbortSignal + timeoutMs?: number + } = {} +) { + return ky(`https://tiktoken.pages.dev/js/${encoding}.json`, { + signal, + timeout: timeoutMs + }).json() +} + +export async function getTokenizerForEncoding( + encoding: TiktokenEncoding, + options?: { + signal?: AbortSignal + extendedSpecialTokens?: Record + timeoutMs?: number + } +) { + const tiktokenBPE = await getTiktokenBPE(encoding, options) + const tiktoken = new Tiktoken(tiktokenBPE, options?.extendedSpecialTokens) + return new TiktokenTokenizer(tiktoken) +} + +export async function getTokenizerForModel( + model: string, + options?: { + signal?: AbortSignal + extendedSpecialTokens?: Record + timeoutMs?: number + } +) { + const modelName = getModelNameForTiktoken(model) + const encoding = getEncodingNameForModel(modelName) + return getTokenizerForEncoding(encoding, options) +} + +export function getModelNameForTiktoken(modelName: string): TiktokenModel { + if (modelName.startsWith('gpt-3.5-turbo-')) { + return 'gpt-3.5-turbo' + } + + if (modelName.startsWith('gpt-4-32k-')) { + return 'gpt-4-32k' + } + + if (modelName.startsWith('gpt-4-')) { + return 'gpt-4' + } + + return modelName as TiktokenModel +} + +export function getContextSizeForEmbedding(modelName?: string): number { + switch (modelName) { + case 'text-embedding-ada-002': + return 8191 + default: + return 2046 + } +} + +export function getContextSizeForModel(model: string): number { + const modelName = getModelNameForTiktoken(model) + + switch (modelName) { + case 'gpt-3.5-turbo': + return 4096 + + case 'gpt-4-32k': + return 32768 + + case 'gpt-4': + return 8192 + + case 'text-davinci-003': + return 4097 + + case 'text-curie-001': + return 2048 + + case 'text-babbage-001': + return 2048 + + case 'text-ada-001': + return 2048 + + case 'code-davinci-002': + return 8000 + + case 'code-cushman-001': + return 2048 + + default: + return 4097 + } +} + +export const calculateMaxTokens = async ({ + prompt, + modelName +}: { + prompt: string + modelName: string +}) => { + // fallback to approximate calculation if tiktoken is not available + let numTokens = Math.ceil(prompt.length / 4) + + try { + const tokenizer = await getTokenizerForModel(modelName) + numTokens = tokenizer.encode(prompt).length + } catch (err: any) { + console.warn( + `calculateMaxTokens error for model "${modelName}", falling back to approximate count`, + err.toString() + ) + } + + const maxTokens = getContextSizeForModel(modelName) + return maxTokens - numTokens } diff --git a/legacy/src/types.ts b/legacy/src/types.ts index 310cfb1a..7c8dde90 100644 --- a/legacy/src/types.ts +++ b/legacy/src/types.ts @@ -75,6 +75,7 @@ export type ChatMessageRole = z.infer export interface ChatMessage { role: ChatMessageRole content: string + name?: string } export interface ChatModelOptions<