illuma-agents 1.0.2 → 1.0.4

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 (225) hide show
  1. package/LICENSE +25 -21
  2. package/dist/cjs/agents/AgentContext.cjs +222 -0
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -0
  4. package/dist/cjs/common/enum.cjs +5 -4
  5. package/dist/cjs/common/enum.cjs.map +1 -1
  6. package/dist/cjs/events.cjs +7 -5
  7. package/dist/cjs/events.cjs.map +1 -1
  8. package/dist/cjs/graphs/Graph.cjs +328 -207
  9. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  10. package/dist/cjs/graphs/MultiAgentGraph.cjs +507 -0
  11. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -0
  12. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  13. package/dist/cjs/llm/google/index.cjs.map +1 -1
  14. package/dist/cjs/llm/ollama/index.cjs.map +1 -1
  15. package/dist/cjs/llm/openai/index.cjs +35 -0
  16. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  17. package/dist/cjs/llm/openai/utils/index.cjs +3 -1
  18. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  19. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  20. package/dist/cjs/llm/providers.cjs +0 -2
  21. package/dist/cjs/llm/providers.cjs.map +1 -1
  22. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  23. package/dist/cjs/main.cjs +12 -1
  24. package/dist/cjs/main.cjs.map +1 -1
  25. package/dist/cjs/messages/cache.cjs +123 -0
  26. package/dist/cjs/messages/cache.cjs.map +1 -0
  27. package/dist/cjs/messages/content.cjs +53 -0
  28. package/dist/cjs/messages/content.cjs.map +1 -0
  29. package/dist/cjs/messages/format.cjs +17 -29
  30. package/dist/cjs/messages/format.cjs.map +1 -1
  31. package/dist/cjs/run.cjs +119 -74
  32. package/dist/cjs/run.cjs.map +1 -1
  33. package/dist/cjs/stream.cjs +77 -73
  34. package/dist/cjs/stream.cjs.map +1 -1
  35. package/dist/cjs/tools/Calculator.cjs +45 -0
  36. package/dist/cjs/tools/Calculator.cjs.map +1 -0
  37. package/dist/cjs/tools/CodeExecutor.cjs +22 -22
  38. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  39. package/dist/cjs/tools/ToolNode.cjs +5 -3
  40. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  41. package/dist/cjs/tools/handlers.cjs +20 -20
  42. package/dist/cjs/tools/handlers.cjs.map +1 -1
  43. package/dist/cjs/utils/events.cjs +31 -0
  44. package/dist/cjs/utils/events.cjs.map +1 -0
  45. package/dist/cjs/utils/handlers.cjs +70 -0
  46. package/dist/cjs/utils/handlers.cjs.map +1 -0
  47. package/dist/cjs/utils/tokens.cjs +54 -7
  48. package/dist/cjs/utils/tokens.cjs.map +1 -1
  49. package/dist/esm/agents/AgentContext.mjs +220 -0
  50. package/dist/esm/agents/AgentContext.mjs.map +1 -0
  51. package/dist/esm/common/enum.mjs +5 -4
  52. package/dist/esm/common/enum.mjs.map +1 -1
  53. package/dist/esm/events.mjs +7 -5
  54. package/dist/esm/events.mjs.map +1 -1
  55. package/dist/esm/graphs/Graph.mjs +330 -209
  56. package/dist/esm/graphs/Graph.mjs.map +1 -1
  57. package/dist/esm/graphs/MultiAgentGraph.mjs +505 -0
  58. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -0
  59. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  60. package/dist/esm/llm/google/index.mjs.map +1 -1
  61. package/dist/esm/llm/ollama/index.mjs.map +1 -1
  62. package/dist/esm/llm/openai/index.mjs +35 -0
  63. package/dist/esm/llm/openai/index.mjs.map +1 -1
  64. package/dist/esm/llm/openai/utils/index.mjs +3 -1
  65. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  66. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  67. package/dist/esm/llm/providers.mjs +0 -2
  68. package/dist/esm/llm/providers.mjs.map +1 -1
  69. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  70. package/dist/esm/main.mjs +7 -2
  71. package/dist/esm/main.mjs.map +1 -1
  72. package/dist/esm/messages/cache.mjs +120 -0
  73. package/dist/esm/messages/cache.mjs.map +1 -0
  74. package/dist/esm/messages/content.mjs +51 -0
  75. package/dist/esm/messages/content.mjs.map +1 -0
  76. package/dist/esm/messages/format.mjs +18 -29
  77. package/dist/esm/messages/format.mjs.map +1 -1
  78. package/dist/esm/run.mjs +119 -74
  79. package/dist/esm/run.mjs.map +1 -1
  80. package/dist/esm/stream.mjs +77 -73
  81. package/dist/esm/stream.mjs.map +1 -1
  82. package/dist/esm/tools/Calculator.mjs +24 -0
  83. package/dist/esm/tools/Calculator.mjs.map +1 -0
  84. package/dist/esm/tools/CodeExecutor.mjs +22 -22
  85. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  86. package/dist/esm/tools/ToolNode.mjs +5 -3
  87. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  88. package/dist/esm/tools/handlers.mjs +20 -20
  89. package/dist/esm/tools/handlers.mjs.map +1 -1
  90. package/dist/esm/utils/events.mjs +29 -0
  91. package/dist/esm/utils/events.mjs.map +1 -0
  92. package/dist/esm/utils/handlers.mjs +68 -0
  93. package/dist/esm/utils/handlers.mjs.map +1 -0
  94. package/dist/esm/utils/tokens.mjs +54 -8
  95. package/dist/esm/utils/tokens.mjs.map +1 -1
  96. package/dist/types/agents/AgentContext.d.ts +94 -0
  97. package/dist/types/common/enum.d.ts +7 -5
  98. package/dist/types/events.d.ts +3 -3
  99. package/dist/types/graphs/Graph.d.ts +60 -66
  100. package/dist/types/graphs/MultiAgentGraph.d.ts +47 -0
  101. package/dist/types/graphs/index.d.ts +1 -0
  102. package/dist/types/index.d.ts +1 -0
  103. package/dist/types/llm/openai/index.d.ts +10 -0
  104. package/dist/types/messages/cache.d.ts +20 -0
  105. package/dist/types/messages/content.d.ts +7 -0
  106. package/dist/types/messages/format.d.ts +1 -7
  107. package/dist/types/messages/index.d.ts +2 -0
  108. package/dist/types/messages/reducer.d.ts +9 -0
  109. package/dist/types/run.d.ts +16 -10
  110. package/dist/types/stream.d.ts +4 -3
  111. package/dist/types/tools/Calculator.d.ts +8 -0
  112. package/dist/types/tools/ToolNode.d.ts +1 -1
  113. package/dist/types/tools/handlers.d.ts +9 -7
  114. package/dist/types/tools/search/tool.d.ts +4 -4
  115. package/dist/types/types/graph.d.ts +124 -11
  116. package/dist/types/types/llm.d.ts +13 -9
  117. package/dist/types/types/messages.d.ts +4 -0
  118. package/dist/types/types/run.d.ts +46 -8
  119. package/dist/types/types/stream.d.ts +3 -2
  120. package/dist/types/utils/events.d.ts +6 -0
  121. package/dist/types/utils/handlers.d.ts +34 -0
  122. package/dist/types/utils/index.d.ts +1 -0
  123. package/dist/types/utils/tokens.d.ts +24 -0
  124. package/package.json +162 -145
  125. package/src/agents/AgentContext.ts +323 -0
  126. package/src/common/enum.ts +177 -176
  127. package/src/events.ts +197 -191
  128. package/src/graphs/Graph.ts +1058 -846
  129. package/src/graphs/MultiAgentGraph.ts +598 -0
  130. package/src/graphs/index.ts +2 -1
  131. package/src/index.ts +25 -24
  132. package/src/llm/anthropic/index.ts +413 -413
  133. package/src/llm/google/index.ts +222 -222
  134. package/src/llm/google/utils/zod_to_genai_parameters.ts +86 -88
  135. package/src/llm/ollama/index.ts +92 -92
  136. package/src/llm/openai/index.ts +894 -853
  137. package/src/llm/openai/utils/index.ts +920 -918
  138. package/src/llm/openrouter/index.ts +60 -60
  139. package/src/llm/providers.ts +55 -57
  140. package/src/llm/vertexai/index.ts +360 -360
  141. package/src/messages/cache.test.ts +461 -0
  142. package/src/messages/cache.ts +151 -0
  143. package/src/messages/content.test.ts +362 -0
  144. package/src/messages/content.ts +63 -0
  145. package/src/messages/format.ts +611 -625
  146. package/src/messages/formatAgentMessages.test.ts +1144 -917
  147. package/src/messages/index.ts +6 -4
  148. package/src/messages/reducer.ts +80 -0
  149. package/src/run.ts +447 -381
  150. package/src/scripts/abort.ts +157 -138
  151. package/src/scripts/ant_web_search.ts +158 -158
  152. package/src/scripts/cli.ts +172 -167
  153. package/src/scripts/cli2.ts +133 -125
  154. package/src/scripts/cli3.ts +184 -178
  155. package/src/scripts/cli4.ts +191 -184
  156. package/src/scripts/cli5.ts +191 -184
  157. package/src/scripts/code_exec.ts +213 -214
  158. package/src/scripts/code_exec_simple.ts +147 -129
  159. package/src/scripts/content.ts +138 -120
  160. package/src/scripts/handoff-test.ts +135 -0
  161. package/src/scripts/multi-agent-chain.ts +278 -0
  162. package/src/scripts/multi-agent-conditional.ts +220 -0
  163. package/src/scripts/multi-agent-document-review-chain.ts +197 -0
  164. package/src/scripts/multi-agent-hybrid-flow.ts +310 -0
  165. package/src/scripts/multi-agent-parallel.ts +343 -0
  166. package/src/scripts/multi-agent-sequence.ts +212 -0
  167. package/src/scripts/multi-agent-supervisor.ts +364 -0
  168. package/src/scripts/multi-agent-test.ts +186 -0
  169. package/src/scripts/search.ts +146 -150
  170. package/src/scripts/simple.ts +225 -225
  171. package/src/scripts/stream.ts +140 -122
  172. package/src/scripts/test-custom-prompt-key.ts +145 -0
  173. package/src/scripts/test-handoff-input.ts +170 -0
  174. package/src/scripts/test-multi-agent-list-handoff.ts +261 -0
  175. package/src/scripts/test-tools-before-handoff.ts +222 -0
  176. package/src/scripts/tools.ts +153 -155
  177. package/src/specs/agent-handoffs.test.ts +889 -0
  178. package/src/specs/anthropic.simple.test.ts +320 -317
  179. package/src/specs/azure.simple.test.ts +325 -316
  180. package/src/specs/openai.simple.test.ts +311 -316
  181. package/src/specs/openrouter.simple.test.ts +107 -0
  182. package/src/specs/prune.test.ts +758 -763
  183. package/src/specs/reasoning.test.ts +201 -165
  184. package/src/specs/thinking-prune.test.ts +769 -703
  185. package/src/specs/token-memoization.test.ts +39 -0
  186. package/src/stream.ts +664 -651
  187. package/src/tools/Calculator.test.ts +278 -0
  188. package/src/tools/Calculator.ts +25 -0
  189. package/src/tools/CodeExecutor.ts +220 -220
  190. package/src/tools/ToolNode.ts +170 -170
  191. package/src/tools/handlers.ts +341 -336
  192. package/src/types/graph.ts +372 -185
  193. package/src/types/llm.ts +141 -140
  194. package/src/types/messages.ts +4 -0
  195. package/src/types/run.ts +128 -89
  196. package/src/types/stream.ts +401 -400
  197. package/src/utils/events.ts +32 -0
  198. package/src/utils/handlers.ts +107 -0
  199. package/src/utils/index.ts +6 -5
  200. package/src/utils/llmConfig.ts +183 -183
  201. package/src/utils/tokens.ts +129 -70
  202. package/dist/types/scripts/abort.d.ts +0 -1
  203. package/dist/types/scripts/ant_web_search.d.ts +0 -1
  204. package/dist/types/scripts/args.d.ts +0 -7
  205. package/dist/types/scripts/caching.d.ts +0 -1
  206. package/dist/types/scripts/cli.d.ts +0 -1
  207. package/dist/types/scripts/cli2.d.ts +0 -1
  208. package/dist/types/scripts/cli3.d.ts +0 -1
  209. package/dist/types/scripts/cli4.d.ts +0 -1
  210. package/dist/types/scripts/cli5.d.ts +0 -1
  211. package/dist/types/scripts/code_exec.d.ts +0 -1
  212. package/dist/types/scripts/code_exec_files.d.ts +0 -1
  213. package/dist/types/scripts/code_exec_simple.d.ts +0 -1
  214. package/dist/types/scripts/content.d.ts +0 -1
  215. package/dist/types/scripts/empty_input.d.ts +0 -1
  216. package/dist/types/scripts/image.d.ts +0 -1
  217. package/dist/types/scripts/memory.d.ts +0 -1
  218. package/dist/types/scripts/search.d.ts +0 -1
  219. package/dist/types/scripts/simple.d.ts +0 -1
  220. package/dist/types/scripts/stream.d.ts +0 -1
  221. package/dist/types/scripts/thinking.d.ts +0 -1
  222. package/dist/types/scripts/tools.d.ts +0 -1
  223. package/dist/types/specs/spec.utils.d.ts +0 -1
  224. package/dist/types/tools/example.d.ts +0 -78
  225. package/src/tools/example.ts +0 -129
@@ -1,214 +1,213 @@
1
- // src/scripts/cli.ts
2
- import { config } from 'dotenv';
3
- config();
4
- import { HumanMessage, AIMessage, BaseMessage } from '@langchain/core/messages';
5
- import { TavilySearchResults } from '@langchain/community/tools/tavily_search';
6
- import type { RunnableConfig } from '@langchain/core/runnables';
7
- import type * as t from '@/types';
8
- import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
9
- import {
10
- ToolEndHandler,
11
- ModelEndHandler,
12
- createMetadataAggregator,
13
- } from '@/events';
14
- import { getLLMConfig } from '@/utils/llmConfig';
15
- import { getArgs } from '@/scripts/args';
16
- import { GraphEvents } from '@/common';
17
- import { Run } from '@/run';
18
- import { createCodeExecutionTool } from '@/tools/CodeExecutor';
19
-
20
- const conversationHistory: BaseMessage[] = [];
21
-
22
- async function testCodeExecution(): Promise<void> {
23
- const { userName, location, provider, currentDate } = await getArgs();
24
- const { contentParts, aggregateContent } = createContentAggregator();
25
- const customHandlers = {
26
- [GraphEvents.TOOL_END]: new ToolEndHandler(),
27
- [GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
28
- [GraphEvents.CHAT_MODEL_STREAM]: new ChatModelStreamHandler(),
29
- [GraphEvents.ON_RUN_STEP_COMPLETED]: {
30
- handle: (
31
- event: GraphEvents.ON_RUN_STEP_COMPLETED,
32
- data: t.StreamEventData
33
- ): void => {
34
- console.log('====== ON_RUN_STEP_COMPLETED ======');
35
- console.dir(data, { depth: null });
36
- aggregateContent({
37
- event,
38
- data: data as unknown as { result: t.ToolEndEvent },
39
- });
40
- },
41
- },
42
- [GraphEvents.ON_RUN_STEP]: {
43
- handle: (
44
- event: GraphEvents.ON_RUN_STEP,
45
- data: t.StreamEventData
46
- ): void => {
47
- console.log('====== ON_RUN_STEP ======');
48
- console.dir(data, { depth: null });
49
- aggregateContent({ event, data: data as t.RunStep });
50
- },
51
- },
52
- [GraphEvents.ON_RUN_STEP_DELTA]: {
53
- handle: (
54
- event: GraphEvents.ON_RUN_STEP_DELTA,
55
- data: t.StreamEventData
56
- ): void => {
57
- console.log('====== ON_RUN_STEP_DELTA ======');
58
- console.dir(data, { depth: null });
59
- aggregateContent({ event, data: data as t.RunStepDeltaEvent });
60
- },
61
- },
62
- [GraphEvents.ON_MESSAGE_DELTA]: {
63
- handle: (
64
- event: GraphEvents.ON_MESSAGE_DELTA,
65
- data: t.StreamEventData
66
- ): void => {
67
- console.log('====== ON_MESSAGE_DELTA ======');
68
- console.dir(data, { depth: null });
69
- aggregateContent({ event, data: data as t.MessageDeltaEvent });
70
- },
71
- },
72
- [GraphEvents.TOOL_START]: {
73
- handle: (
74
- _event: string,
75
- data: t.StreamEventData,
76
- metadata?: Record<string, unknown>
77
- ): void => {
78
- console.log('====== TOOL_START ======');
79
- console.dir(data, { depth: null });
80
- },
81
- },
82
- };
83
-
84
- const llmConfig = getLLMConfig(provider);
85
-
86
- const run = await Run.create<t.IState>({
87
- runId: 'message-num-1',
88
- graphConfig: {
89
- type: 'standard',
90
- llmConfig,
91
- tools: [new TavilySearchResults(), createCodeExecutionTool()],
92
- instructions:
93
- 'You are a friendly AI assistant with coding capabilities. Always address the user by their name.',
94
- additional_instructions: `The user's name is ${userName} and they are located in ${location}.`,
95
- },
96
- returnContent: true,
97
- customHandlers,
98
- });
99
-
100
- const config: Partial<RunnableConfig> & {
101
- version: 'v1' | 'v2';
102
- run_id?: string;
103
- streamMode: string;
104
- } = {
105
- configurable: {
106
- provider,
107
- thread_id: 'conversation-num-1',
108
- },
109
- streamMode: 'values',
110
- version: 'v2' as const,
111
- // recursionLimit: 3,
112
- };
113
-
114
- console.log('Test 1: Sorting Algorithm Comparison');
115
-
116
- const userMessage1 = `
117
- Hi ${userName} here. I need a Python script that compares different sorting algorithms. Can you write a script that:
118
- 1. Implements three sorting algorithms: Bubble Sort, Insertion Sort, and Merge Sort
119
- 2. Generates three random lists of integers:
120
- - A small list (20 elements)
121
- - A medium list (100 elements)
122
- - A large list (1000 elements)
123
- 3. Applies each sorting algorithm to each list and measures the execution time
124
- 4. Prints a comparison table showing the time taken by each algorithm for each list size
125
- 5. Determines and announces the fastest algorithm for each list size
126
- Please write the script and then execute it to show the results.
127
- `;
128
-
129
- conversationHistory.push(new HumanMessage(userMessage1));
130
-
131
- let inputs = {
132
- messages: conversationHistory,
133
- };
134
- const finalContentParts1 = await run.processStream(inputs, config);
135
- const finalMessages1 = run.getRunMessages();
136
- if (finalMessages1) {
137
- conversationHistory.push(...finalMessages1);
138
- }
139
- console.log('\n\n====================\n\n');
140
- console.dir(contentParts, { depth: null });
141
-
142
- console.log('Test 2: Text File Analysis and Processing');
143
-
144
- const userMessage2 = `
145
- Great job on the sorting algorithms! Now, let's solve a popular LeetCode problem using the Merge Sort algorithm we implemented. The problem is "Merge Intervals". Here's what I need:
146
-
147
- 1. Implement a solution to the Merge Intervals problem:
148
- - Given an array of intervals where intervals[i] = [starti, endi], merge all overlapping intervals.
149
- - Return an array of the non-overlapping intervals that cover all the intervals in the input.
150
-
151
- 2. Use the Merge Sort algorithm as part of the solution to sort the intervals based on their start times.
152
-
153
- 3. Implement a function to generate a random list of intervals for testing.
154
-
155
- 4. Create test cases:
156
- - A small case with 5 intervals
157
- - A medium case with 20 intervals
158
- - A large case with 100 intervals
159
-
160
- 5. Apply your solution to each test case and print:
161
- - The original intervals
162
- - The merged intervals
163
- - The time taken to solve each case
164
-
165
- Please write the script and execute it to demonstrate the results for all three test cases.
166
- `;
167
-
168
- conversationHistory.push(new HumanMessage(userMessage2));
169
-
170
- inputs = {
171
- messages: conversationHistory,
172
- };
173
- const finalContentParts2 = await run.processStream(inputs, config);
174
- const finalMessages2 = run.getRunMessages();
175
- if (finalMessages2) {
176
- conversationHistory.push(...finalMessages2);
177
- }
178
- console.log('\n\n====================\n\n');
179
- console.dir(contentParts, { depth: null });
180
-
181
- const { handleLLMEnd, collected } = createMetadataAggregator();
182
- const titleResult = await run.generateTitle({
183
- provider,
184
- inputText: userMessage2,
185
- contentParts,
186
- chainOptions: {
187
- callbacks: [
188
- {
189
- handleLLMEnd,
190
- },
191
- ],
192
- },
193
- });
194
- console.log('Generated Title:', titleResult);
195
- console.log('Collected metadata:', collected);
196
- }
197
-
198
- process.on('unhandledRejection', (reason, promise) => {
199
- console.error('Unhandled Rejection at:', promise, 'reason:', reason);
200
- console.log('Conversation history:');
201
- console.dir(conversationHistory, { depth: null });
202
- process.exit(1);
203
- });
204
-
205
- process.on('uncaughtException', (err) => {
206
- console.error('Uncaught Exception:', err);
207
- });
208
-
209
- testCodeExecution().catch((err) => {
210
- console.error(err);
211
- console.log('Conversation history:');
212
- console.dir(conversationHistory, { depth: null });
213
- process.exit(1);
214
- });
1
+ // src/scripts/cli.ts
2
+ import { config } from 'dotenv';
3
+ config();
4
+ import { HumanMessage, AIMessage, BaseMessage } from '@langchain/core/messages';
5
+ import type { RunnableConfig } from '@langchain/core/runnables';
6
+ import type * as t from '@/types';
7
+ import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
8
+ import {
9
+ ToolEndHandler,
10
+ ModelEndHandler,
11
+ createMetadataAggregator,
12
+ } from '@/events';
13
+ import { getLLMConfig } from '@/utils/llmConfig';
14
+ import { getArgs } from '@/scripts/args';
15
+ import { GraphEvents } from '@/common';
16
+ import { Run } from '@/run';
17
+ import { createCodeExecutionTool } from '@/tools/CodeExecutor';
18
+
19
+ const conversationHistory: BaseMessage[] = [];
20
+
21
+ async function testCodeExecution(): Promise<void> {
22
+ const { userName, location, provider, currentDate } = await getArgs();
23
+ const { contentParts, aggregateContent } = createContentAggregator();
24
+ const customHandlers = {
25
+ [GraphEvents.TOOL_END]: new ToolEndHandler(),
26
+ [GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
27
+ [GraphEvents.CHAT_MODEL_STREAM]: new ChatModelStreamHandler(),
28
+ [GraphEvents.ON_RUN_STEP_COMPLETED]: {
29
+ handle: (
30
+ event: GraphEvents.ON_RUN_STEP_COMPLETED,
31
+ data: t.StreamEventData
32
+ ): void => {
33
+ console.log('====== ON_RUN_STEP_COMPLETED ======');
34
+ console.dir(data, { depth: null });
35
+ aggregateContent({
36
+ event,
37
+ data: data as unknown as { result: t.ToolEndEvent },
38
+ });
39
+ },
40
+ },
41
+ [GraphEvents.ON_RUN_STEP]: {
42
+ handle: (
43
+ event: GraphEvents.ON_RUN_STEP,
44
+ data: t.StreamEventData
45
+ ): void => {
46
+ console.log('====== ON_RUN_STEP ======');
47
+ console.dir(data, { depth: null });
48
+ aggregateContent({ event, data: data as t.RunStep });
49
+ },
50
+ },
51
+ [GraphEvents.ON_RUN_STEP_DELTA]: {
52
+ handle: (
53
+ event: GraphEvents.ON_RUN_STEP_DELTA,
54
+ data: t.StreamEventData
55
+ ): void => {
56
+ // console.log('====== ON_RUN_STEP_DELTA ======');
57
+ // console.dir(data, { depth: null });
58
+ aggregateContent({ event, data: data as t.RunStepDeltaEvent });
59
+ },
60
+ },
61
+ [GraphEvents.ON_MESSAGE_DELTA]: {
62
+ handle: (
63
+ event: GraphEvents.ON_MESSAGE_DELTA,
64
+ data: t.StreamEventData
65
+ ): void => {
66
+ // console.log('====== ON_MESSAGE_DELTA ======');
67
+ // console.dir(data, { depth: null });
68
+ aggregateContent({ event, data: data as t.MessageDeltaEvent });
69
+ },
70
+ },
71
+ [GraphEvents.TOOL_START]: {
72
+ handle: (
73
+ _event: string,
74
+ data: t.StreamEventData,
75
+ metadata?: Record<string, unknown>
76
+ ): void => {
77
+ console.log('====== TOOL_START ======');
78
+ console.dir(data, { depth: null });
79
+ },
80
+ },
81
+ };
82
+
83
+ const llmConfig = getLLMConfig(provider);
84
+
85
+ const run = await Run.create<t.IState>({
86
+ runId: 'message-num-1',
87
+ graphConfig: {
88
+ type: 'standard',
89
+ llmConfig,
90
+ tools: [createCodeExecutionTool()],
91
+ instructions:
92
+ 'You are a friendly AI assistant with coding capabilities. Always address the user by their name.',
93
+ additional_instructions: `The user's name is ${userName} and they are located in ${location}.`,
94
+ },
95
+ returnContent: true,
96
+ customHandlers,
97
+ });
98
+
99
+ const config: Partial<RunnableConfig> & {
100
+ version: 'v1' | 'v2';
101
+ run_id?: string;
102
+ streamMode: string;
103
+ } = {
104
+ configurable: {
105
+ provider,
106
+ thread_id: 'conversation-num-1',
107
+ },
108
+ streamMode: 'values',
109
+ version: 'v2' as const,
110
+ // recursionLimit: 3,
111
+ };
112
+
113
+ console.log('Test 1: Sorting Algorithm Comparison');
114
+
115
+ const userMessage1 = `
116
+ Hi ${userName} here. I need a Python script that compares different sorting algorithms. Can you write a script that:
117
+ 1. Implements three sorting algorithms: Bubble Sort, Insertion Sort, and Merge Sort
118
+ 2. Generates three random lists of integers:
119
+ - A small list (20 elements)
120
+ - A medium list (100 elements)
121
+ - A large list (1000 elements)
122
+ 3. Applies each sorting algorithm to each list and measures the execution time
123
+ 4. Prints a comparison table showing the time taken by each algorithm for each list size
124
+ 5. Determines and announces the fastest algorithm for each list size
125
+ Please write the script and then execute it to show the results.
126
+ `;
127
+
128
+ conversationHistory.push(new HumanMessage(userMessage1));
129
+
130
+ let inputs = {
131
+ messages: conversationHistory,
132
+ };
133
+ const finalContentParts1 = await run.processStream(inputs, config);
134
+ const finalMessages1 = run.getRunMessages();
135
+ if (finalMessages1) {
136
+ conversationHistory.push(...finalMessages1);
137
+ }
138
+ console.log('\n\n====================\n\n');
139
+ console.dir(contentParts, { depth: null });
140
+
141
+ console.log('Test 2: Text File Analysis and Processing');
142
+
143
+ const userMessage2 = `
144
+ Great job on the sorting algorithms! Now, let's solve a popular LeetCode problem using the Merge Sort algorithm we implemented. The problem is "Merge Intervals". Here's what I need:
145
+
146
+ 1. Implement a solution to the Merge Intervals problem:
147
+ - Given an array of intervals where intervals[i] = [starti, endi], merge all overlapping intervals.
148
+ - Return an array of the non-overlapping intervals that cover all the intervals in the input.
149
+
150
+ 2. Use the Merge Sort algorithm as part of the solution to sort the intervals based on their start times.
151
+
152
+ 3. Implement a function to generate a random list of intervals for testing.
153
+
154
+ 4. Create test cases:
155
+ - A small case with 5 intervals
156
+ - A medium case with 20 intervals
157
+ - A large case with 100 intervals
158
+
159
+ 5. Apply your solution to each test case and print:
160
+ - The original intervals
161
+ - The merged intervals
162
+ - The time taken to solve each case
163
+
164
+ Please write the script and execute it to demonstrate the results for all three test cases.
165
+ `;
166
+
167
+ conversationHistory.push(new HumanMessage(userMessage2));
168
+
169
+ inputs = {
170
+ messages: conversationHistory,
171
+ };
172
+ const finalContentParts2 = await run.processStream(inputs, config);
173
+ const finalMessages2 = run.getRunMessages();
174
+ if (finalMessages2) {
175
+ conversationHistory.push(...finalMessages2);
176
+ }
177
+ console.log('\n\n====================\n\n');
178
+ console.dir(finalContentParts2, { depth: null });
179
+
180
+ const { handleLLMEnd, collected } = createMetadataAggregator();
181
+ const titleResult = await run.generateTitle({
182
+ provider,
183
+ inputText: userMessage2,
184
+ contentParts,
185
+ chainOptions: {
186
+ callbacks: [
187
+ {
188
+ handleLLMEnd,
189
+ },
190
+ ],
191
+ },
192
+ });
193
+ console.log('Generated Title:', titleResult);
194
+ console.log('Collected metadata:', collected);
195
+ }
196
+
197
+ process.on('unhandledRejection', (reason, promise) => {
198
+ console.error('Unhandled Rejection at:', promise, 'reason:', reason);
199
+ console.log('Conversation history:');
200
+ console.dir(conversationHistory, { depth: null });
201
+ process.exit(1);
202
+ });
203
+
204
+ process.on('uncaughtException', (err) => {
205
+ console.error('Uncaught Exception:', err);
206
+ });
207
+
208
+ testCodeExecution().catch((err) => {
209
+ console.error(err);
210
+ console.log('Conversation history:');
211
+ console.dir(conversationHistory, { depth: null });
212
+ process.exit(1);
213
+ });