diff --git a/legacy/package.json b/legacy/package.json index a25ace0f..423b15f3 100644 --- a/legacy/package.json +++ b/legacy/package.json @@ -37,11 +37,12 @@ "dependencies": { "@dqbd/tiktoken": "^1.0.7", "dotenv-safe": "^8.2.0", + "handlebars": "^4.7.7", "jsonrepair": "^3.1.0", "ky": "^0.33.3", - "mustache": "^4.2.0", "openai-fetch": "^1.3.0", "p-map": "^6.0.0", + "quick-lru": "^6.1.1", "ts-dedent": "^2.2.0", "type-fest": "^3.11.0", "zod": "^3.21.4", @@ -50,7 +51,6 @@ }, "devDependencies": { "@trivago/prettier-plugin-sort-imports": "^4.1.1", - "@types/mustache": "^4.2.2", "@types/node": "^20.2.5", "ava": "^5.3.0", "del-cli": "^5.0.0", diff --git a/legacy/pnpm-lock.yaml b/legacy/pnpm-lock.yaml index b737b9f5..8b172185 100644 --- a/legacy/pnpm-lock.yaml +++ b/legacy/pnpm-lock.yaml @@ -7,21 +7,24 @@ dependencies: dotenv-safe: specifier: ^8.2.0 version: 8.2.0 + handlebars: + specifier: ^4.7.7 + version: 4.7.7 jsonrepair: specifier: ^3.1.0 version: 3.1.0 ky: specifier: ^0.33.3 version: 0.33.3 - mustache: - specifier: ^4.2.0 - version: 4.2.0 openai-fetch: specifier: ^1.3.0 version: 1.3.0 p-map: specifier: ^6.0.0 version: 6.0.0 + quick-lru: + specifier: ^6.1.1 + version: 6.1.1 ts-dedent: specifier: ^2.2.0 version: 2.2.0 @@ -42,9 +45,6 @@ devDependencies: '@trivago/prettier-plugin-sort-imports': specifier: ^4.1.1 version: 4.1.1(prettier@2.8.8) - '@types/mustache': - specifier: ^4.2.2 - version: 4.2.2 '@types/node': specifier: ^20.2.5 version: 20.2.5 @@ -494,10 +494,6 @@ packages: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/mustache@4.2.2: - resolution: {integrity: sha512-MUSpfpW0yZbTgjekDbH0shMYBUD+X/uJJJMm9LXN1d5yjl5lCY1vN/eWKD6D1tOtjA6206K0zcIPnUaFMurdNA==} - dev: true - /@types/node@20.2.5: resolution: {integrity: sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==} dev: true @@ -1404,6 +1400,19 @@ packages: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true + /handlebars@4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: false + /hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} @@ -1981,6 +1990,10 @@ packages: kind-of: 6.0.3 dev: true + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true @@ -1989,11 +2002,6 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /mustache@4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} - hasBin: true - dev: false - /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: @@ -2002,6 +2010,10 @@ packages: thenify-all: 1.6.0 dev: true + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: false + /nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true @@ -2334,6 +2346,11 @@ packages: engines: {node: '>=10'} dev: true + /quick-lru@6.1.1: + resolution: {integrity: sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==} + engines: {node: '>=12'} + dev: false + /read-pkg-up@8.0.0: resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==} engines: {node: '>=12'} @@ -2580,7 +2597,6 @@ packages: /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - dev: true /source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} @@ -2899,6 +2915,14 @@ packages: engines: {node: '>=12.20'} hasBin: true + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: false + optional: true + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -2969,6 +2993,10 @@ packages: isexe: 2.0.0 dev: true + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: false + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} diff --git a/legacy/src/llm.ts b/legacy/src/llm.ts index 25837b68..bc07719a 100644 --- a/legacy/src/llm.ts +++ b/legacy/src/llm.ts @@ -1,11 +1,11 @@ import { jsonrepair } from 'jsonrepair' -import Mustache from 'mustache' import { dedent } from 'ts-dedent' import { ZodRawShape, ZodTypeAny, z } from 'zod' import { printNode, zodToTs } from 'zod-to-ts' import * as types from './types' import { BaseTaskCallBuilder } from './task' +import { getCompiledTemplate } from './template' import { extractJSONArrayFromString, extractJSONObjectFromString @@ -105,7 +105,7 @@ export abstract class BaseChatModelBuilder< return { ...message, content: message.content - ? Mustache.render(dedent(message.content), input).trim() + ? getCompiledTemplate(dedent(message.content))(input).trim() : '' } }) diff --git a/legacy/src/template.ts b/legacy/src/template.ts new file mode 100644 index 00000000..d12a6b31 --- /dev/null +++ b/legacy/src/template.ts @@ -0,0 +1,19 @@ +import Handlebars from 'handlebars' +import QuickLRU from 'quick-lru' + +const lru = new QuickLRU({ maxSize: 1000 }) + +export function getCompiledTemplate(template: string) { + let compiledTemplate = lru.get(template) as HandlebarsTemplateDelegate + + if (compiledTemplate) { + return compiledTemplate + } + + compiledTemplate = Handlebars.compile(template, { + noEscape: true + }) + + lru.set(template, compiledTemplate) + return compiledTemplate +}