From bf25ff6104d9584bb533b0ec320ea385183830d2 Mon Sep 17 00:00:00 2001 From: Alex Yang <himself65@outlook.com> Date: Mon, 10 Jun 2024 14:08:47 -0700 Subject: [PATCH] fix: polyfill for cloudflare worker (#919) --- .changeset/curly-singers-help.md | 7 + .../cloudflare-worker-agent/package.json | 6 +- .../cloudflare-worker-agent/src/index.ts | 2 + .../embeddings/CloudflareWorkerEmbedding.ts | 14 ++ .../internal/settings/image-embed-model.ts | 8 ++ packages/core/src/storage/StorageContext.ts | 6 +- pnpm-lock.yaml | 130 +++++++++++------- 7 files changed, 114 insertions(+), 59 deletions(-) create mode 100644 .changeset/curly-singers-help.md create mode 100644 packages/core/src/embeddings/CloudflareWorkerEmbedding.ts create mode 100644 packages/core/src/internal/settings/image-embed-model.ts diff --git a/.changeset/curly-singers-help.md b/.changeset/curly-singers-help.md new file mode 100644 index 000000000..cfa3b14cd --- /dev/null +++ b/.changeset/curly-singers-help.md @@ -0,0 +1,7 @@ +--- +"llamaindex": patch +"@llamaindex/core-e2e": patch +"@llamaindex/cloudflare-worker-agent-test": patch +--- + +fix: polyfill for cloudflare worker diff --git a/packages/core/e2e/examples/cloudflare-worker-agent/package.json b/packages/core/e2e/examples/cloudflare-worker-agent/package.json index b47a0ae98..63b131bd2 100644 --- a/packages/core/e2e/examples/cloudflare-worker-agent/package.json +++ b/packages/core/e2e/examples/cloudflare-worker-agent/package.json @@ -12,13 +12,13 @@ "cf-typegen": "wrangler types" }, "devDependencies": { - "@cloudflare/vitest-pool-workers": "^0.2.6", - "@cloudflare/workers-types": "^4.20240502.0", + "@cloudflare/vitest-pool-workers": "^0.4.3", + "@cloudflare/workers-types": "^4.20240605.0", "@vitest/runner": "1.3.0", "@vitest/snapshot": "1.3.0", "typescript": "^5.4.5", "vitest": "1.3.0", - "wrangler": "^3.53.1" + "wrangler": "^3.60.1" }, "dependencies": { "llamaindex": "workspace:*" diff --git a/packages/core/e2e/examples/cloudflare-worker-agent/src/index.ts b/packages/core/e2e/examples/cloudflare-worker-agent/src/index.ts index bbe3cf1a7..eeb45a3fa 100644 --- a/packages/core/e2e/examples/cloudflare-worker-agent/src/index.ts +++ b/packages/core/e2e/examples/cloudflare-worker-agent/src/index.ts @@ -10,10 +10,12 @@ export default { const agent = new OpenAIAgent({ tools: [], }); + console.log(1); const responseStream = await agent.chat({ stream: true, message: "Hello? What is the weather today?", }); + console.log(2); const textEncoder = new TextEncoder(); const response = responseStream.pipeThrough<Uint8Array>( // @ts-expect-error: see https://github.com/cloudflare/workerd/issues/2067 diff --git a/packages/core/src/embeddings/CloudflareWorkerEmbedding.ts b/packages/core/src/embeddings/CloudflareWorkerEmbedding.ts new file mode 100644 index 000000000..ed21dc5a5 --- /dev/null +++ b/packages/core/src/embeddings/CloudflareWorkerEmbedding.ts @@ -0,0 +1,14 @@ +import type { ImageType } from "../Node.js"; +import { MultiModalEmbedding } from "./MultiModalEmbedding.js"; + +/** + * Cloudflare worker doesn't support image embeddings for now + */ +export class CloudflareWorkerMultiModalEmbedding extends MultiModalEmbedding { + getImageEmbedding(images: ImageType): Promise<number[]> { + throw new Error("Method not implemented."); + } + getTextEmbedding(text: string): Promise<number[]> { + throw new Error("Method not implemented."); + } +} diff --git a/packages/core/src/internal/settings/image-embed-model.ts b/packages/core/src/internal/settings/image-embed-model.ts new file mode 100644 index 000000000..a82440557 --- /dev/null +++ b/packages/core/src/internal/settings/image-embed-model.ts @@ -0,0 +1,8 @@ +export async function getImageEmbedModel() { + if (globalThis.navigator?.userAgent === "Cloudflare-Workers") { + return (await import("../../embeddings/CloudflareWorkerEmbedding.js")) + .CloudflareWorkerMultiModalEmbedding; + } else { + return (await import("../../embeddings/ClipEmbedding.js")).ClipEmbedding; + } +} diff --git a/packages/core/src/storage/StorageContext.ts b/packages/core/src/storage/StorageContext.ts index a34cf04c6..64dfaae3d 100644 --- a/packages/core/src/storage/StorageContext.ts +++ b/packages/core/src/storage/StorageContext.ts @@ -1,6 +1,6 @@ import { path } from "@llamaindex/env"; import { ModalityType, ObjectType } from "../Node.js"; -import { ClipEmbedding } from "../embeddings/ClipEmbedding.js"; +import { getImageEmbedModel } from "../internal/settings/image-embed-model.js"; import { DEFAULT_IMAGE_VECTOR_NAMESPACE, DEFAULT_NAMESPACE, @@ -44,7 +44,7 @@ export async function storageContextFromDefaults({ } if (storeImages && !(ModalityType.IMAGE in vectorStores)) { vectorStores[ModalityType.IMAGE] = new SimpleVectorStore({ - embedModel: new ClipEmbedding(), + embedModel: new (await getImageEmbedModel())(), }); } } else { @@ -60,7 +60,7 @@ export async function storageContextFromDefaults({ if (storeImages && !(ObjectType.IMAGE in vectorStores)) { vectorStores[ModalityType.IMAGE] = await SimpleVectorStore.fromPersistDir( path.join(persistDir, DEFAULT_IMAGE_VECTOR_NAMESPACE), - new ClipEmbedding(), + new (await getImageEmbedModel())(), ); } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7a8d8460a..8246eef38 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -521,11 +521,11 @@ importers: version: link:../../.. devDependencies: '@cloudflare/vitest-pool-workers': - specifier: ^0.2.6 - version: 0.2.8(@cloudflare/workers-types@4.20240502.0)(@vitest/runner@1.3.0)(@vitest/snapshot@1.3.0)(vitest@1.3.0(@types/node@20.14.1)(terser@5.31.0)) + specifier: ^0.4.3 + version: 0.4.3(@cloudflare/workers-types@4.20240605.0)(@vitest/runner@1.3.0)(@vitest/snapshot@1.3.0)(vitest@1.3.0(@types/node@20.14.1)(terser@5.31.0)) '@cloudflare/workers-types': - specifier: ^4.20240502.0 - version: 4.20240502.0 + specifier: ^4.20240605.0 + version: 4.20240605.0 '@vitest/runner': specifier: 1.3.0 version: 1.3.0 @@ -539,8 +539,8 @@ importers: specifier: 1.3.0 version: 1.3.0(@types/node@20.14.1)(terser@5.31.0) wrangler: - specifier: ^3.53.1 - version: 3.55.0(@cloudflare/workers-types@4.20240502.0) + specifier: ^3.60.1 + version: 3.60.1(@cloudflare/workers-types@4.20240605.0) packages/core/e2e/examples/nextjs-agent: dependencies: @@ -1720,45 +1720,45 @@ packages: resolution: {integrity: sha512-EeEjMobfuJrwoctj7FA1y1KEbM0+Q1xSjobIEyie9k4haVEBB7vkDvsasw1pM3rO39mL2akxIAzLMUAtrMHZhA==} engines: {node: '>=16.13'} - '@cloudflare/vitest-pool-workers@0.2.8': - resolution: {integrity: sha512-kRkXf1AOuYU7rfZIYzcAn6581wbbWCHPHhyTAG135TQmC7milihPN+FgH8IRPj5RhDacCTgMI+B5kGre8jXXHg==} + '@cloudflare/vitest-pool-workers@0.4.3': + resolution: {integrity: sha512-znEWNOrr6iY4dRxwmbyeBE3SFOrFlmgAfuW6CfZIaIQkrP8ArkVAu4/TXLoynYwdujVOyN+S8oo4aeLItgciUA==} peerDependencies: - '@vitest/runner': 1.3.0 - '@vitest/snapshot': 1.3.0 - vitest: 1.3.0 + '@vitest/runner': 1.3.x - 1.5.x + '@vitest/snapshot': 1.3.x - 1.5.x + vitest: 1.3.x - 1.5.x - '@cloudflare/workerd-darwin-64@1.20240419.0': - resolution: {integrity: sha512-PGVe9sYWULHfvGhN0IZh8MsskNG/ufnBSqPbgFCxJHCTrVXLPuC35EoVaforyqjKRwj3U35XMyGo9KHcGnTeHQ==} + '@cloudflare/workerd-darwin-64@1.20240605.0': + resolution: {integrity: sha512-6V4Uze6jEM1mPBdPO6AevPwAOG2s+auEG1vPzZilwbrpn3BbYklEpQqcAZj05uUXaM6rnffnXerW8X8Fc8l4qQ==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20240419.0': - resolution: {integrity: sha512-z4etQSPiD5Gcjs962LiC7ZdmXnN6SGof5KrYoFiSI9X9kUvpuGH/lnjVVPd+NnVNeDU2kzmcAIgyZjkjTaqVXQ==} + '@cloudflare/workerd-darwin-arm64@1.20240605.0': + resolution: {integrity: sha512-ZNxjVSeMYUhTfVlrMsVjpN5eHA2kq3+S7ZMsGu5l44ZqFrDygsFDoc9C4anJVUEIHGFUB9LMu4ZTdS5S80hvPQ==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20240419.0': - resolution: {integrity: sha512-lBwhg0j3sYTFMsEb4bOClbVje8nqrYOu0H3feQlX+Eks94JIhWPkf8ywK4at/BUc1comPMhCgzDHwc2OMPUGgg==} + '@cloudflare/workerd-linux-64@1.20240605.0': + resolution: {integrity: sha512-zqOWDrYEudW5JCcU8lxCFQ96UHJJHrM+uvGaRS4u5nJaEgMr2z7u9I2286+l1R3JWvJdqj9ehGuHQvZkaTADxw==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20240419.0': - resolution: {integrity: sha512-ZMY6wwWkxL+WPq8ydOp/irSYjAnMhBz1OC1+4z+OANtDs2beaZODmq7LEB3hb5WUAaTPY7DIjZh3DfDfty0nYg==} + '@cloudflare/workerd-linux-arm64@1.20240605.0': + resolution: {integrity: sha512-qFTVNem7bMsU9P1dXUi+kb8EdU5aag1I9RQq6ZLS/zfiJ0a/UasihwQG8lrzT7k9x80VnpyCekNmd625qsVZjQ==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20240419.0': - resolution: {integrity: sha512-YJjgaJN2yGTkV7Cr4K3i8N4dUwVQTclT3Pr3NpRZCcLjTszwlE53++XXDnHMKGXBbSguIizaVbmcU2EtmIXyeQ==} + '@cloudflare/workerd-windows-64@1.20240605.0': + resolution: {integrity: sha512-s0U7d52ALQtb0enbHJ/AXmy+pyBQVoTIaAdAApy/PWrMiAnb8iJhf7A35pRTYfty5SUf7EX9BAPcKmeh+t3N5g==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20240502.0': - resolution: {integrity: sha512-OB1jIyPOzyOcuZFHWhsQnkRLN6u8+jmU9X3T4KZlGgn3Ivw8pBiswhLOp+yFeChR3Y4/5+V0hPFRko5SReordg==} + '@cloudflare/workers-types@4.20240605.0': + resolution: {integrity: sha512-zJw4Q6CnkaQ5JZmHRkNiSs5GfiRgUIUL8BIHPQkd2XUHZkIBv9M9yc0LKEwMYGpCFC+oSOltet6c9RjP9uQ99g==} '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} @@ -5035,6 +5035,9 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + del@6.1.1: resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} engines: {node: '>=10'} @@ -7252,8 +7255,8 @@ packages: peerDependencies: webpack: ^5.0.0 - miniflare@3.20240419.1: - resolution: {integrity: sha512-Q9n0W07uUD/u0c/b03E4iogeXOAMjZnE3P7B5Yi8sPaZAx6TYWwjurGBja+Pg2yILN2iMaliEobfVyAKss33cA==} + miniflare@3.20240605.0: + resolution: {integrity: sha512-wE59RULU5zo6eYhL8j3wYdoOQ5istlkMruEr5pYvykL0LJecjKlFc8/cu4WJ5JdkdhutE1320Awi7WEICcolEw==} engines: {node: '>=16.13'} hasBin: true @@ -7444,6 +7447,9 @@ packages: resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} engines: {node: '>=18'} + node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -9743,6 +9749,9 @@ packages: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} + unenv-nightly@1.10.0-1717606461.a117952: + resolution: {integrity: sha512-u3TfBX02WzbHTpaEfWEKwDijDSFAHcgXkayUZ+MVDrjhLFvgAJzFGTSTmwlEhwWi2exyRQey23ah9wELMM6etg==} + unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -10195,17 +10204,17 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - workerd@1.20240419.0: - resolution: {integrity: sha512-9yV98KpkQgG+bdEsKEW8i1AYZgxns6NVSfdOVEB2Ue1pTMtIEYfUyqUE+O2amisRrfaC3Pw4EvjtTmVaoetfeg==} + workerd@1.20240605.0: + resolution: {integrity: sha512-2yhzgaprAOFm7H988xlRFmU4rOLXhSsq24wh6ayucMB3ORfe/nYJ2ysFn1mzjB+UxEJVt5PhixgHkZLv1S8UPQ==} engines: {node: '>=16'} hasBin: true - wrangler@3.55.0: - resolution: {integrity: sha512-VhtCioKxOdVqkHa8jQ6C6bX3by2Ko0uM0DKzrA+6lBZvfDUlGDWSOPiG+1fOHBHj2JTVBntxWCztXP6L+Udr8w==} + wrangler@3.60.1: + resolution: {integrity: sha512-pVrqzgpRwFk/8bp/afsnuw6ttOJ0Y8XFDfLjVMnVeDGZJpQ5eHV3hf8fImavn2BeH6DLHucKnJHwISnzDciqRQ==} engines: {node: '>=16.17.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20240419.0 + '@cloudflare/workers-types': ^4.20240605.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -12057,7 +12066,7 @@ snapshots: dependencies: mime: 3.0.0 - '@cloudflare/vitest-pool-workers@0.2.8(@cloudflare/workers-types@4.20240502.0)(@vitest/runner@1.3.0)(@vitest/snapshot@1.3.0)(vitest@1.3.0(@types/node@20.14.1)(terser@5.31.0))': + '@cloudflare/vitest-pool-workers@0.4.3(@cloudflare/workers-types@4.20240605.0)(@vitest/runner@1.3.0)(@vitest/snapshot@1.3.0)(vitest@1.3.0(@types/node@20.14.1)(terser@5.31.0))': dependencies: '@vitest/runner': 1.3.0 '@vitest/snapshot': 1.3.0 @@ -12065,9 +12074,10 @@ snapshots: cjs-module-lexer: 1.3.1 devalue: 4.3.3 esbuild: 0.17.19 - miniflare: 3.20240419.1 + miniflare: 3.20240605.0 + semver: 7.6.2 vitest: 1.3.0(@types/node@20.14.1)(terser@5.31.0) - wrangler: 3.55.0(@cloudflare/workers-types@4.20240502.0) + wrangler: 3.60.1(@cloudflare/workers-types@4.20240605.0) zod: 3.23.8 transitivePeerDependencies: - '@cloudflare/workers-types' @@ -12075,22 +12085,22 @@ snapshots: - supports-color - utf-8-validate - '@cloudflare/workerd-darwin-64@1.20240419.0': + '@cloudflare/workerd-darwin-64@1.20240605.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20240419.0': + '@cloudflare/workerd-darwin-arm64@1.20240605.0': optional: true - '@cloudflare/workerd-linux-64@1.20240419.0': + '@cloudflare/workerd-linux-64@1.20240605.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20240419.0': + '@cloudflare/workerd-linux-arm64@1.20240605.0': optional: true - '@cloudflare/workerd-windows-64@1.20240419.0': + '@cloudflare/workerd-windows-64@1.20240605.0': optional: true - '@cloudflare/workers-types@4.20240502.0': {} + '@cloudflare/workers-types@4.20240605.0': {} '@colors/colors@1.5.0': optional: true @@ -15398,8 +15408,8 @@ snapshots: capnp-ts@0.7.0: dependencies: - debug: 4.3.4 - tslib: 2.6.2 + debug: 4.3.5 + tslib: 2.6.3 transitivePeerDependencies: - supports-color @@ -15472,7 +15482,7 @@ snapshots: chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -16013,6 +16023,8 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + defu@6.1.4: {} + del@6.1.1: dependencies: globby: 11.1.0 @@ -18886,7 +18898,7 @@ snapshots: tapable: 2.2.1 webpack: 5.91.0 - miniflare@3.20240419.1: + miniflare@3.20240605.0: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.11.3 @@ -18896,7 +18908,7 @@ snapshots: glob-to-regexp: 0.4.1 stoppable: 1.1.0 undici: 5.28.4 - workerd: 1.20240419.0 + workerd: 1.20240605.0 ws: 8.17.0 youch: 3.3.3 zod: 3.23.8 @@ -19108,6 +19120,8 @@ snapshots: emojilib: 2.4.0 skin-tone: 2.0.0 + node-fetch-native@1.6.4: {} + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 @@ -21735,6 +21749,15 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 + unenv-nightly@1.10.0-1717606461.a117952: + dependencies: + consola: 3.2.3 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.4 + pathe: 1.1.2 + ufo: 1.5.3 + unicode-canonical-property-names-ecmascript@2.0.0: {} unicode-emoji-modifier-base@1.0.0: {} @@ -22432,15 +22455,15 @@ snapshots: word-wrap@1.2.5: {} - workerd@1.20240419.0: + workerd@1.20240605.0: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20240419.0 - '@cloudflare/workerd-darwin-arm64': 1.20240419.0 - '@cloudflare/workerd-linux-64': 1.20240419.0 - '@cloudflare/workerd-linux-arm64': 1.20240419.0 - '@cloudflare/workerd-windows-64': 1.20240419.0 + '@cloudflare/workerd-darwin-64': 1.20240605.0 + '@cloudflare/workerd-darwin-arm64': 1.20240605.0 + '@cloudflare/workerd-linux-64': 1.20240605.0 + '@cloudflare/workerd-linux-arm64': 1.20240605.0 + '@cloudflare/workerd-windows-64': 1.20240605.0 - wrangler@3.55.0(@cloudflare/workers-types@4.20240502.0): + wrangler@3.60.1(@cloudflare/workers-types@4.20240605.0): dependencies: '@cloudflare/kv-asset-handler': 0.3.2 '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) @@ -22448,16 +22471,17 @@ snapshots: blake3-wasm: 2.1.5 chokidar: 3.6.0 esbuild: 0.17.19 - miniflare: 3.20240419.1 + miniflare: 3.20240605.0 nanoid: 3.3.7 path-to-regexp: 6.2.2 resolve: 1.22.8 resolve.exports: 2.0.2 selfsigned: 2.4.1 source-map: 0.6.1 + unenv: unenv-nightly@1.10.0-1717606461.a117952 xxhash-wasm: 1.0.2 optionalDependencies: - '@cloudflare/workers-types': 4.20240502.0 + '@cloudflare/workers-types': 4.20240605.0 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil -- GitLab