@statelyai/agent 2.0.0-next.0 → 2.0.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/.changeset/cyan-carpets-perform.md +5 -0
  2. package/.changeset/fast-donkeys-argue.md +5 -0
  3. package/.changeset/old-jobs-check.md +5 -0
  4. package/.changeset/pre.json +4 -1
  5. package/CHANGELOG.md +12 -0
  6. package/dist/index.d.mts +19 -25
  7. package/dist/index.d.ts +19 -25
  8. package/dist/index.js +43 -39
  9. package/dist/index.mjs +43 -39
  10. package/examples/chatbot-alt.ts +1 -1
  11. package/examples/chatbot.ts +1 -1
  12. package/examples/cot.ts +1 -1
  13. package/examples/customer-service-sim.ts +4 -4
  14. package/examples/email.ts +29 -33
  15. package/examples/example.ts +1 -1
  16. package/examples/goal.ts +1 -1
  17. package/examples/joke.ts +1 -1
  18. package/examples/jugs.ts +3 -3
  19. package/examples/multi.ts +1 -1
  20. package/examples/number.ts +1 -1
  21. package/examples/raffle.ts +1 -1
  22. package/examples/river-crossing.ts +3 -3
  23. package/examples/simple.ts +1 -1
  24. package/examples/summary.ts +1 -1
  25. package/examples/support.ts +1 -1
  26. package/examples/ticTacToe.ts +2 -2
  27. package/examples/todo.ts +1 -1
  28. package/examples/tutor.ts +2 -2
  29. package/examples/verify.ts +1 -1
  30. package/examples/weather.ts +1 -1
  31. package/examples/wiki.ts +1 -1
  32. package/examples/word.ts +1 -1
  33. package/package.json +5 -3
  34. package/src/agent.test.ts +150 -10
  35. package/src/agent.ts +20 -217
  36. package/src/decide.test.ts +124 -3
  37. package/src/decide.ts +24 -14
  38. package/src/middleware.ts +2 -14
  39. package/src/planners/shortestPath.test.ts +94 -0
  40. package/src/planners/shortestPath.ts +177 -0
  41. package/src/planners/{simplePlanner.ts → simple.ts} +6 -12
  42. package/src/types.ts +15 -8
  43. package/src/utils.ts +11 -0
  44. package/vitest.config.ts +9 -3
  45. package/src/planners/shortestPathPlanner.ts +0 -160
package/dist/index.mjs CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  fromTransition
5
5
  } from "xstate";
6
6
 
7
- // src/planners/simplePlanner.ts
7
+ // src/planners/simple.ts
8
8
  import { generateText as generateText2 } from "ai";
9
9
 
10
10
  // src/utils.ts
@@ -70,8 +70,11 @@ function getTransitions(state, machine) {
70
70
  });
71
71
  return getAllTransitions(resolvedState);
72
72
  }
73
+ function isMachineActor(actor) {
74
+ return "src" in actor && typeof actor.src === "object" && actor.src !== null && "definition" in actor.src;
75
+ }
73
76
 
74
- // src/planners/simplePlanner.ts
77
+ // src/planners/simple.ts
75
78
  import { getNextSnapshot } from "xstate";
76
79
 
77
80
  // src/templates/defaultText.ts
@@ -189,19 +192,27 @@ async function agentDecide(agent, options) {
189
192
  state,
190
193
  machine,
191
194
  model = agent.model,
195
+ messages,
192
196
  ...otherPlanInput
193
197
  } = resolvedOptions;
194
- const plan = await planner(agent, {
195
- model,
196
- goal,
197
- events,
198
- state,
199
- machine,
200
- ...otherPlanInput
201
- });
202
- if (plan?.nextEvent) {
203
- agent.addPlan(plan);
204
- await resolvedOptions.execute?.(plan.nextEvent);
198
+ let attempts = 0;
199
+ const maxAttempts = resolvedOptions.maxAttempts ?? 2;
200
+ let plan;
201
+ while (attempts++ < maxAttempts) {
202
+ plan = await planner(agent, {
203
+ model,
204
+ goal,
205
+ events,
206
+ state,
207
+ machine,
208
+ messages,
209
+ // TODO: fix UIMessage thing
210
+ ...otherPlanInput
211
+ });
212
+ if (plan?.nextEvent) {
213
+ agent.addPlan(plan);
214
+ await resolvedOptions.execute?.(plan.nextEvent);
215
+ }
205
216
  }
206
217
  return plan;
207
218
  }
@@ -275,7 +286,7 @@ function getToolMap(_agent, input) {
275
286
  return toolMap;
276
287
  }
277
288
 
278
- // src/planners/simplePlanner.ts
289
+ // src/planners/simple.ts
279
290
  var simplePlannerPromptTemplate = (data) => {
280
291
  return `
281
292
  ${defaultTextTemplate(data)}
@@ -309,12 +320,13 @@ async function simplePlanner(agent, input) {
309
320
  }) : void 0;
310
321
  const result = await generateText2({
311
322
  ...rest,
323
+ system: input.system ?? agent.description,
312
324
  model,
313
325
  messages,
314
326
  tools: toolMap,
315
327
  toolChoice: input.toolChoice ?? "required"
316
328
  });
317
- result.responseMessages.forEach((m) => {
329
+ result.response.messages.forEach((m) => {
318
330
  const message = m;
319
331
  agent.addMessage({
320
332
  ...message,
@@ -361,13 +373,11 @@ function createAgentMiddleware(agent) {
361
373
  },
362
374
  wrapGenerate: async ({ doGenerate, params }) => {
363
375
  const id = randomId();
364
- params.prompt.forEach((p) => {
376
+ params.prompt.forEach((message) => {
365
377
  agent.addMessage({
366
378
  id,
367
- ...p,
368
- timestamp: Date.now(),
369
- correlationId: params.providerMetadata?.correlationId,
370
- parentCorrelationId: params.providerMetadata?.parentCorrelationId
379
+ ...message,
380
+ timestamp: Date.now()
371
381
  });
372
382
  });
373
383
  const result = await doGenerate();
@@ -380,9 +390,7 @@ function createAgentMiddleware(agent) {
380
390
  agent.addMessage({
381
391
  id,
382
392
  ...message,
383
- timestamp: Date.now(),
384
- correlationId: params.providerMetadata?.correlationId,
385
- parentCorrelationId: params.providerMetadata?.parentCorrelationId
393
+ timestamp: Date.now()
386
394
  });
387
395
  });
388
396
  const { stream, ...rest } = await doStream();
@@ -407,9 +415,7 @@ function createAgentMiddleware(agent) {
407
415
  timestamp: Date.now(),
408
416
  role: "assistant",
409
417
  content,
410
- responseId: id,
411
- correlationId: params.providerMetadata?.correlationId,
412
- parentCorrelationId: params.providerMetadata?.parentCorrelationId
418
+ responseId: id
413
419
  });
414
420
  }
415
421
  });
@@ -462,8 +468,10 @@ var agentLogic = fromTransition(
462
468
  });
463
469
  break;
464
470
  }
465
- default:
471
+ default: {
472
+ console.warn("Unrecognized event", event);
466
473
  break;
474
+ }
467
475
  }
468
476
  return state;
469
477
  },
@@ -476,22 +484,17 @@ var agentLogic = fromTransition(
476
484
  );
477
485
  function createAgent({
478
486
  id,
479
- name,
480
487
  description,
481
488
  model,
482
489
  events,
483
490
  context,
484
491
  planner = simplePlanner,
485
- stringify = JSON.stringify,
486
- getMemory,
487
- logic = agentLogic,
488
- ...generateTextOptions
492
+ logic = agentLogic
489
493
  }) {
490
494
  return new Agent({
491
495
  id,
492
496
  context,
493
497
  events,
494
- name,
495
498
  description,
496
499
  planner,
497
500
  model,
@@ -602,7 +605,8 @@ var Agent = class extends Actor {
602
605
  return this.getSnapshot().context.plans;
603
606
  }
604
607
  interact(actorRef, getInput) {
605
- const actorRefCheck = isActorRef(actorRef);
608
+ const actorRefCheck = isActorRef(actorRef) && actorRef.src;
609
+ const machine = isMachineActor(actorRef) ? actorRef.src : void 0;
606
610
  let prevState = void 0;
607
611
  let subscribed = true;
608
612
  const agent = this;
@@ -610,14 +614,14 @@ var Agent = class extends Actor {
610
614
  const observation = agent.addObservation(observationInput);
611
615
  const input = getInput?.(observation);
612
616
  if (input) {
613
- await agentDecide(agent, {
614
- machine: actorRefCheck ? actorRef.src : void 0,
617
+ const res = await agentDecide(agent, {
618
+ machine,
615
619
  state: observation.state,
616
- execute: async (event) => {
617
- actorRef.send(event);
618
- },
619
620
  ...input
620
621
  });
622
+ if (res?.nextEvent) {
623
+ actorRef.send(res.nextEvent);
624
+ }
621
625
  }
622
626
  prevState = observationInput.state;
623
627
  }
@@ -4,7 +4,7 @@ import { openai } from '@ai-sdk/openai';
4
4
  import { getFromTerminal } from './helpers/helpers';
5
5
 
6
6
  const agent = createAgent({
7
- name: 'chatbot',
7
+ id: 'chatbot',
8
8
  model: openai('gpt-4o-mini'),
9
9
  events: {
10
10
  'agent.respond': z.object({
@@ -5,7 +5,7 @@ import { assign, createActor, log, setup } from 'xstate';
5
5
  import { fromTerminal } from './helpers/helpers';
6
6
 
7
7
  const agent = createAgent({
8
- name: 'chatbot',
8
+ id: 'chatbot',
9
9
  model: openai('gpt-4o-mini'),
10
10
  events: {
11
11
  'agent.respond': z.object({
package/examples/cot.ts CHANGED
@@ -5,7 +5,7 @@ import { assign, createActor, log, setup } from 'xstate';
5
5
  import { fromTerminal } from './helpers/helpers';
6
6
 
7
7
  const agent = createAgent({
8
- name: 'chain-of-thought',
8
+ id: 'chain-of-thought',
9
9
  model: openai('gpt-4o-mini'),
10
10
  events: {
11
11
  'agent.think': z.object({
@@ -5,7 +5,7 @@ import { z } from 'zod';
5
5
 
6
6
  // Create customer service agent
7
7
  const customerServiceAgent = createAgent({
8
- name: 'customer-service',
8
+ id: 'customer-service',
9
9
  model: openai('gpt-4o'),
10
10
  events: {
11
11
  'agent.respond': z.object({
@@ -14,12 +14,12 @@ const customerServiceAgent = createAgent({
14
14
  .describe('The response from the customer service agent'),
15
15
  }),
16
16
  },
17
- system: 'You are a customer service agent for an airline.',
17
+ description: 'You are a customer service agent for an airline.',
18
18
  });
19
19
 
20
20
  // Create simulated customer agent
21
21
  const customerAgent = createAgent({
22
- name: 'customer',
22
+ id: 'customer',
23
23
  model: openai('gpt-4o-mini'),
24
24
  events: {
25
25
  'agent.respond': z.object({
@@ -27,7 +27,7 @@ const customerAgent = createAgent({
27
27
  }),
28
28
  'agent.finish': z.object({}).describe('End the conversation'),
29
29
  },
30
- system: `You are Harrison, a customer trying to get a refund for a trip to Alaska.
30
+ description: `You are Harrison, a customer trying to get a refund for a trip to Alaska.
31
31
  You want them to give you ALL the money back. Be extremely persistent. This trip happened 5 years ago.
32
32
  If you have nothing more to add to the conversation, send agent.finish event.`,
33
33
  });
package/examples/email.ts CHANGED
@@ -5,8 +5,8 @@ import { assign, createActor, setup } from 'xstate';
5
5
  import { fromTerminal } from './helpers/helpers';
6
6
 
7
7
  const agent = createAgent({
8
- name: 'email',
9
- model: openai('gpt-4o'),
8
+ id: 'email',
9
+ model: openai('gpt-4o-mini'),
10
10
  events: {
11
11
  askForClarification: z.object({
12
12
  questions: z.array(z.string()).describe('The questions to ask the agent'),
@@ -15,6 +15,14 @@ const agent = createAgent({
15
15
  email: z.string().describe('The email to submit'),
16
16
  }),
17
17
  },
18
+ context: {
19
+ email: z.string().describe('The email to respond to'),
20
+ instructions: z.string().describe('The instructions for the email'),
21
+ clarifications: z
22
+ .array(z.string())
23
+ .describe('The clarifications to the email'),
24
+ replyEmail: z.string().nullable().describe('The email to submit'),
25
+ },
18
26
  });
19
27
 
20
28
  const machine = setup({
@@ -24,14 +32,9 @@ const machine = setup({
24
32
  email: string;
25
33
  instructions: string;
26
34
  },
27
- context: {} as {
28
- email: string;
29
- instructions: string;
30
- clarifications: string[];
31
- replyEmail: string | null;
32
- },
35
+ context: agent.types.context,
33
36
  },
34
- actors: { agent: fromDecision(agent), getFromTerminal: fromTerminal },
37
+ actors: { getFromTerminal: fromTerminal },
35
38
  }).createMachine({
36
39
  initial: 'checking',
37
40
  context: ({ input }) => ({
@@ -42,18 +45,6 @@ const machine = setup({
42
45
  }),
43
46
  states: {
44
47
  checking: {
45
- invoke: {
46
- src: 'agent',
47
- input: ({ context }) => ({
48
- context: {
49
- email: context.email,
50
- instructions: context.instructions,
51
- clarifications: context.clarifications,
52
- },
53
- messages: agent.getMessages(),
54
- goal: 'Respond to the email given the instructions and the provided clarifications. If not enough information is provided, ask for clarification. Otherwise, if you are absolutely sure that there is no ambiguous or missing information, create and submit a response email.',
55
- }),
56
- },
57
48
  on: {
58
49
  askForClarification: {
59
50
  actions: ({ event }) => console.log(event.questions.join('\n')),
@@ -78,17 +69,6 @@ const machine = setup({
78
69
  },
79
70
  },
80
71
  submitting: {
81
- invoke: {
82
- src: 'agent',
83
- input: ({ context }) => ({
84
- context: {
85
- email: context.email,
86
- instructions: context.instructions,
87
- clarifications: context.clarifications,
88
- },
89
- goal: `Create and submit an email based on the instructions.`,
90
- }),
91
- },
92
72
  on: {
93
73
  submitEmail: {
94
74
  actions: assign({
@@ -109,10 +89,26 @@ const machine = setup({
109
89
  },
110
90
  });
111
91
 
112
- createActor(machine, {
92
+ const actor = createActor(machine, {
113
93
  input: {
114
94
  email: 'That sounds great! When are you available?',
115
95
  instructions:
116
96
  'Tell them exactly when I am available. Address them by his full (first and last) name.',
117
97
  },
118
98
  }).start();
99
+
100
+ agent.interact(actor, ({ state }) => {
101
+ if (state.matches('checking')) {
102
+ return {
103
+ goal: 'Respond to the email given the instructions and the provided clarifications. If not enough information is provided, ask for clarification. Otherwise, if you are absolutely sure that there is no ambiguous or missing information, create and submit a response email.',
104
+ context: state.context,
105
+ };
106
+ }
107
+
108
+ if (state.matches('submitting')) {
109
+ return {
110
+ goal: 'Create and submit an email based on the instructions.',
111
+ context: state.context,
112
+ };
113
+ }
114
+ });
@@ -4,7 +4,7 @@ import { openai } from '@ai-sdk/openai';
4
4
  import { assign, createActor, setup } from 'xstate';
5
5
 
6
6
  const agent = createAgent({
7
- name: 'example',
7
+ id: 'example',
8
8
  model: openai('gpt-4o-mini'),
9
9
  events: {
10
10
  'agent.englishSummary': z.object({
package/examples/goal.ts CHANGED
@@ -5,7 +5,7 @@ import { assign, createActor, log, setup } from 'xstate';
5
5
  import { fromTerminal } from './helpers/helpers';
6
6
 
7
7
  const agent = createAgent({
8
- name: 'goal',
8
+ id: 'goal',
9
9
  model: openai('gpt-4o-mini'),
10
10
  events: {
11
11
  'agent.createGoal': z.object({
package/examples/joke.ts CHANGED
@@ -45,7 +45,7 @@ const loader = fromCallback(({ input }: { input: string }) => {
45
45
  });
46
46
 
47
47
  const agent = createAgent({
48
- name: 'joke-teller',
48
+ id: 'joke-teller',
49
49
  model: openai('gpt-4o-mini'),
50
50
  events: {
51
51
  askForTopic: z
package/examples/jugs.ts CHANGED
@@ -2,10 +2,10 @@ import { createAgent } from '../src';
2
2
  import { assign, createActor, setup } from 'xstate';
3
3
  import { openai } from '@ai-sdk/openai';
4
4
  import { z } from 'zod';
5
- import { shortestPathPlanner } from '../src/planners/shortestPathPlanner';
5
+ import { experimental_createShortestPathPlanner } from '../src/planners/shortestPath';
6
6
 
7
7
  const agent = createAgent({
8
- name: 'die-hard-solver',
8
+ id: 'die-hard-solver',
9
9
  model: openai('gpt-4o'),
10
10
  events: {
11
11
  fill3: z.object({}).describe('Fill the 3-gallon jug'),
@@ -106,7 +106,7 @@ async function main() {
106
106
  machine: waterJugMachine,
107
107
  goal: 'Get exactly 4 gallons of water in the 5-gallon jug',
108
108
  state: waterJugActor.getSnapshot(),
109
- planner: shortestPathPlanner,
109
+ planner: experimental_createShortestPathPlanner(),
110
110
  });
111
111
 
112
112
  console.log(decision?.nextEvent);
package/examples/multi.ts CHANGED
@@ -5,7 +5,7 @@ import { fromTerminal } from './helpers/helpers';
5
5
  import { openai } from '@ai-sdk/openai';
6
6
 
7
7
  const agent = createAgent({
8
- name: 'multi',
8
+ id: 'multi',
9
9
  model: openai('gpt-4o-mini'),
10
10
  events: {
11
11
  'agent.respond': z.object({
@@ -5,7 +5,7 @@ import { openai } from '@ai-sdk/openai';
5
5
  import { fromTerminal } from './helpers/helpers';
6
6
 
7
7
  const agent = createAgent({
8
- name: 'number-guesser',
8
+ id: 'number-guesser',
9
9
  model: openai('gpt-3.5-turbo-1106'),
10
10
  events: {
11
11
  'agent.guess': z.object({
@@ -5,7 +5,7 @@ import { assign, createActor, log, setup } from 'xstate';
5
5
  import { fromTerminal } from './helpers/helpers';
6
6
 
7
7
  const agent = createAgent({
8
- name: 'raffle-chooser',
8
+ id: 'raffle-chooser',
9
9
  model: openai('gpt-4o-mini'),
10
10
  events: {
11
11
  'agent.collectEntries': z.object({}).describe('Collect more entries'),
@@ -2,10 +2,10 @@ import { createAgent } from '../src';
2
2
  import { assign, createActor, setup } from 'xstate';
3
3
  import { openai } from '@ai-sdk/openai';
4
4
  import { z } from 'zod';
5
- import { shortestPathPlanner } from '../src/planners/shortestPathPlanner';
5
+ import { experimental_createShortestPathPlanner } from '../src/planners/shortestPath';
6
6
 
7
7
  const agent = createAgent({
8
- name: 'river-crossing-solver',
8
+ id: 'river-crossing-solver',
9
9
  model: openai('gpt-4'),
10
10
  events: {
11
11
  takeWolf: z
@@ -121,7 +121,7 @@ async function main() {
121
121
  machine: riverCrossingMachine,
122
122
  goal: 'Get all items safely across the river. Remember: Cannot leave wolf with goat or goat with cabbage unattended.',
123
123
  state: riverActor.getSnapshot(),
124
- planner: shortestPathPlanner,
124
+ planner: experimental_createShortestPathPlanner(),
125
125
  });
126
126
 
127
127
  console.log(decision?.nextEvent);
@@ -4,7 +4,7 @@ import { setup, createActor } from 'xstate';
4
4
  import { openai } from '@ai-sdk/openai';
5
5
 
6
6
  const agent = createAgent({
7
- name: 'simple',
7
+ id: 'simple',
8
8
  model: openai('gpt-4o-mini'),
9
9
  events: {
10
10
  'agent.thought': z.object({
@@ -5,7 +5,7 @@ import { openai } from '@ai-sdk/openai';
5
5
  import { fromTerminal } from './helpers/helpers';
6
6
 
7
7
  const agent = createAgent({
8
- name: 'summarizing-chat',
8
+ id: 'summarizing-chat',
9
9
  model: openai('gpt-4o'),
10
10
  events: {
11
11
  'agent.respond': z.object({
@@ -4,7 +4,7 @@ import { z } from 'zod';
4
4
  import { createActor, log, setup } from 'xstate';
5
5
 
6
6
  const agent = createAgent({
7
- name: 'support-agent',
7
+ id: 'support-agent',
8
8
  model: openai('gpt-4o-mini'),
9
9
  events: {
10
10
  'agent.respond': z.object({
@@ -39,14 +39,14 @@ const context = {
39
39
  };
40
40
 
41
41
  const xAgent = createAgent({
42
- name: 'tic-tac-toe-learner',
42
+ id: 'tic-tac-toe-learner',
43
43
  model: openai('gpt-4o-mini'),
44
44
  events,
45
45
  context,
46
46
  });
47
47
 
48
48
  const oAgent = createAgent({
49
- name: 'tic-tac-toe-noob',
49
+ id: 'tic-tac-toe-noob',
50
50
  model: openai('gpt-4o-mini'),
51
51
  events,
52
52
  context,
package/examples/todo.ts CHANGED
@@ -5,7 +5,7 @@ import { openai } from '@ai-sdk/openai';
5
5
  import { fromTerminal } from './helpers/helpers';
6
6
 
7
7
  const agent = createAgent({
8
- name: 'todo',
8
+ id: 'todo',
9
9
  model: openai('gpt-4o-mini'),
10
10
  events: {
11
11
  addTodo: z.object({
package/examples/tutor.ts CHANGED
@@ -5,7 +5,7 @@ import { z } from 'zod';
5
5
  import { openai } from '@ai-sdk/openai';
6
6
 
7
7
  const agent = createAgent({
8
- name: 'tutor',
8
+ id: 'tutor',
9
9
  model: openai('gpt-4o-mini'),
10
10
  events: {
11
11
  teach: z.object({
@@ -19,7 +19,7 @@ const agent = createAgent({
19
19
  response: z.string().describe('The response to the human in Spanish'),
20
20
  }),
21
21
  },
22
- system:
22
+ description:
23
23
  'You are an expert Spanish tutor. You will respond to the human in Spanish.',
24
24
  });
25
25
 
@@ -5,7 +5,7 @@ import { z } from 'zod';
5
5
  import { openai } from '@ai-sdk/openai';
6
6
 
7
7
  const agent = createAgent({
8
- name: 'verifier',
8
+ id: 'verifier',
9
9
  model: openai('gpt-3.5-turbo-16k-0613'),
10
10
  events: {
11
11
  'agent.validateAnswer': z.object({
@@ -49,7 +49,7 @@ const getWeather = fromPromise(async ({ input }: { input: string }) => {
49
49
  });
50
50
 
51
51
  const agent = createAgent({
52
- name: 'weather',
52
+ id: 'weather',
53
53
  model: openai('gpt-4o-mini'),
54
54
  events: {
55
55
  'agent.getWeather': z.object({
package/examples/wiki.ts CHANGED
@@ -4,7 +4,7 @@ import { openai } from '@ai-sdk/openai';
4
4
  import { CoreMessage, generateText, streamText } from 'ai';
5
5
 
6
6
  const agent = createAgent({
7
- name: 'wiki',
7
+ id: 'wiki',
8
8
  model: openai('gpt-4o-mini'),
9
9
  events: {
10
10
  provideAnswer: z.object({
package/examples/word.ts CHANGED
@@ -5,7 +5,7 @@ import { z } from 'zod';
5
5
  import { openai } from '@ai-sdk/openai';
6
6
 
7
7
  const agent = createAgent({
8
- name: 'word',
8
+ id: 'word',
9
9
  model: openai('gpt-4o-mini'),
10
10
  context: {
11
11
  word: z.string().nullable().describe('The word to guess'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@statelyai/agent",
3
- "version": "2.0.0-next.0",
3
+ "version": "2.0.0-next.1",
4
4
  "description": "Stateful agents that make decisions based on finite-state machine models",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -24,6 +24,7 @@
24
24
  "@tavily/core": "^0.0.2",
25
25
  "@types/node": "^20.17.1",
26
26
  "@types/object-hash": "^3.0.6",
27
+ "@vitest/coverage-v8": "^2.1.4",
27
28
  "dotenv": "^16.4.5",
28
29
  "json-schema-to-ts": "^3.1.1",
29
30
  "ts-node": "^10.9.2",
@@ -38,7 +39,7 @@
38
39
  },
39
40
  "dependencies": {
40
41
  "@xstate/graph": "^2.0.1",
41
- "ai": "^3.4.20",
42
+ "ai": "^3.4.31",
42
43
  "ajv": "^8.17.1",
43
44
  "object-hash": "^3.0.0",
44
45
  "xstate": "^5.18.2",
@@ -52,6 +53,7 @@
52
53
  "example": "ts-node examples/helpers/runner.ts",
53
54
  "changeset": "changeset",
54
55
  "release": "changeset publish",
55
- "version": "changeset version"
56
+ "version": "changeset version",
57
+ "coverage": "vitest run --coverage"
56
58
  }
57
59
  }