tool-define.test.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { describe, test, expect } from "bun:test"
  2. import { Effect, Layer, ManagedRuntime } from "effect"
  3. import z from "zod"
  4. import { Agent } from "../../src/agent/agent"
  5. import { Tool } from "../../src/tool/tool"
  6. import { Truncate } from "../../src/tool/truncate"
  7. const runtime = ManagedRuntime.make(Layer.mergeAll(Truncate.defaultLayer, Agent.defaultLayer))
  8. const params = z.object({ input: z.string() })
  9. function makeTool(id: string, executeFn?: () => void) {
  10. return {
  11. description: "test tool",
  12. parameters: params,
  13. execute() {
  14. executeFn?.()
  15. return Effect.succeed({ title: "test", output: "ok", metadata: {} })
  16. },
  17. }
  18. }
  19. describe("Tool.define", () => {
  20. test("object-defined tool does not mutate the original init object", async () => {
  21. const original = makeTool("test")
  22. const originalExecute = original.execute
  23. const info = await runtime.runPromise(Tool.define("test-tool", Effect.succeed(original)))
  24. await Effect.runPromise(info.init())
  25. await Effect.runPromise(info.init())
  26. await Effect.runPromise(info.init())
  27. expect(original.execute).toBe(originalExecute)
  28. })
  29. test("effect-defined tool returns fresh objects and is unaffected", async () => {
  30. const info = await runtime.runPromise(
  31. Tool.define(
  32. "test-fn-tool",
  33. Effect.succeed(() => Effect.succeed(makeTool("test"))),
  34. ),
  35. )
  36. const first = await Effect.runPromise(info.init())
  37. const second = await Effect.runPromise(info.init())
  38. expect(first).not.toBe(second)
  39. })
  40. test("object-defined tool returns distinct objects per init() call", async () => {
  41. const info = await runtime.runPromise(Tool.define("test-copy", Effect.succeed(makeTool("test"))))
  42. const first = await Effect.runPromise(info.init())
  43. const second = await Effect.runPromise(info.init())
  44. expect(first).not.toBe(second)
  45. })
  46. })