diff --git a/.changeset/short-plants-sip.md b/.changeset/short-plants-sip.md new file mode 100644 index 0000000000000000000000000000000000000000..91d2a1f03c8b19442c3cd8c871946704d1dd28f7 --- /dev/null +++ b/.changeset/short-plants-sip.md @@ -0,0 +1,6 @@ +--- +"@llamaindex/core": patch +"llamaindex": patch +--- + +fix: DataCloneError when using FunctionTool diff --git a/packages/core/src/global/settings/callback-manager.ts b/packages/core/src/global/settings/callback-manager.ts index 53c87db66030e58ca7321d90c35abb18931d9943..e8f6750f7b9f0100586c2f66e2b85ad8917f1935 100644 --- a/packages/core/src/global/settings/callback-manager.ts +++ b/packages/core/src/global/settings/callback-manager.ts @@ -105,9 +105,7 @@ export class CallbackManager { } queueMicrotask(() => { cbs.forEach((handler) => - handler( - LlamaIndexCustomEvent.fromEvent(event, structuredClone(detail)), - ), + handler(LlamaIndexCustomEvent.fromEvent(event, { ...detail })), ); }); } diff --git a/packages/core/tests/event-system.test.ts b/packages/core/tests/event-system.test.ts index 657391219e912bbbd099ffbf7de78676414fa1b8..b24f32d95f1b95e7bcc5e925e11fc79413bca9ef 100644 --- a/packages/core/tests/event-system.test.ts +++ b/packages/core/tests/event-system.test.ts @@ -6,6 +6,9 @@ declare module "@llamaindex/core/global" { test: { value: number; }; + functionTest: { + fn: ({ x }: { x: number }) => string; + }; } } @@ -42,6 +45,25 @@ describe("event system", () => { expect(callback).toHaveBeenCalledTimes(1); }); + test("dispatch function tool event", async () => { + const testFunction = ({ x }: { x: number }) => `${x * 2}`; + let callback; + Settings.callbackManager.on( + "functionTest", + (callback = vi.fn((event) => { + const data = event.detail; + expect(data.fn).toBe(testFunction); + })), + ); + + Settings.callbackManager.dispatchEvent("functionTest", { + fn: testFunction, + }); + expect(callback).toHaveBeenCalledTimes(0); + await new Promise((resolve) => process.nextTick(resolve)); + expect(callback).toHaveBeenCalledTimes(1); + }); + // rollup doesn't support decorators for now // test('wrap event caller', async () => { // class A {