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
@@ -0,0 +1,278 @@
1
+ import { Calculator } from './Calculator';
2
+
3
+ describe('Calculator', () => {
4
+ let calculator: Calculator;
5
+
6
+ beforeEach(() => {
7
+ calculator = new Calculator();
8
+ });
9
+
10
+ describe('basic properties', () => {
11
+ it('should have correct name', () => {
12
+ expect(calculator.name).toBe('calculator');
13
+ });
14
+
15
+ it('should have correct description', () => {
16
+ expect(calculator.description).toBe(
17
+ 'Useful for getting the result of a math expression. The input to this tool should be a valid mathematical expression that could be executed by a simple calculator.'
18
+ );
19
+ });
20
+
21
+ it('should have correct lc_name', () => {
22
+ expect(Calculator.lc_name()).toBe('Calculator');
23
+ });
24
+
25
+ it('should have correct lc_namespace', () => {
26
+ const namespace = calculator.lc_namespace;
27
+ expect(namespace).toContain('calculator');
28
+ });
29
+ });
30
+
31
+ describe('basic arithmetic operations', () => {
32
+ it('should add two numbers', async () => {
33
+ const result = await calculator._call('2 + 3');
34
+ expect(result).toBe('5');
35
+ });
36
+
37
+ it('should subtract two numbers', async () => {
38
+ const result = await calculator._call('10 - 4');
39
+ expect(result).toBe('6');
40
+ });
41
+
42
+ it('should multiply two numbers', async () => {
43
+ const result = await calculator._call('6 * 7');
44
+ expect(result).toBe('42');
45
+ });
46
+
47
+ it('should divide two numbers', async () => {
48
+ const result = await calculator._call('15 / 3');
49
+ expect(result).toBe('5');
50
+ });
51
+
52
+ it('should handle modulo operation', async () => {
53
+ const result = await calculator._call('17 % 5');
54
+ expect(result).toBe('2');
55
+ });
56
+
57
+ it('should handle exponentiation', async () => {
58
+ const result = await calculator._call('2 ^ 3');
59
+ expect(result).toBe('8');
60
+ });
61
+ });
62
+
63
+ describe('complex expressions', () => {
64
+ it('should handle order of operations', async () => {
65
+ const result = await calculator._call('2 + 3 * 4');
66
+ expect(result).toBe('14');
67
+ });
68
+
69
+ it('should handle parentheses', async () => {
70
+ const result = await calculator._call('(2 + 3) * 4');
71
+ expect(result).toBe('20');
72
+ });
73
+
74
+ it('should handle nested parentheses', async () => {
75
+ const result = await calculator._call('((2 + 3) * 4) / 5');
76
+ expect(result).toBe('4');
77
+ });
78
+
79
+ it('should handle multiple operations', async () => {
80
+ const result = await calculator._call('(10 + 5) * 2 - 8 / 4');
81
+ expect(result).toBe('28');
82
+ });
83
+ });
84
+
85
+ describe('decimal numbers', () => {
86
+ it('should handle decimal addition', async () => {
87
+ const result = await calculator._call('2.5 + 3.7');
88
+ expect(result).toBe('6.2');
89
+ });
90
+
91
+ it('should handle decimal multiplication', async () => {
92
+ const result = await calculator._call('2.5 * 4');
93
+ expect(result).toBe('10');
94
+ });
95
+
96
+ it('should handle decimal division', async () => {
97
+ const result = await calculator._call('7.5 / 2.5');
98
+ expect(result).toBe('3');
99
+ });
100
+ });
101
+
102
+ describe('negative numbers', () => {
103
+ it('should handle negative numbers in addition', async () => {
104
+ const result = await calculator._call('-5 + 3');
105
+ expect(result).toBe('-2');
106
+ });
107
+
108
+ it('should handle negative numbers in subtraction', async () => {
109
+ const result = await calculator._call('10 - (-5)');
110
+ expect(result).toBe('15');
111
+ });
112
+
113
+ it('should handle negative numbers in multiplication', async () => {
114
+ const result = await calculator._call('-4 * -3');
115
+ expect(result).toBe('12');
116
+ });
117
+
118
+ it('should handle negative numbers in division', async () => {
119
+ const result = await calculator._call('-12 / 4');
120
+ expect(result).toBe('-3');
121
+ });
122
+ });
123
+
124
+ describe('mathematical functions', () => {
125
+ it('should handle square root', async () => {
126
+ const result = await calculator._call('sqrt(16)');
127
+ expect(result).toBe('4');
128
+ });
129
+
130
+ it('should handle absolute value', async () => {
131
+ const result = await calculator._call('abs(-42)');
132
+ expect(result).toBe('42');
133
+ });
134
+
135
+ it('should handle sine function', async () => {
136
+ const result = await calculator._call('sin(0)');
137
+ expect(result).toBe('0');
138
+ });
139
+
140
+ it('should handle cosine function', async () => {
141
+ const result = await calculator._call('cos(0)');
142
+ expect(result).toBe('1');
143
+ });
144
+
145
+ it('should handle logarithm', async () => {
146
+ const result = await calculator._call('log(10)');
147
+ expect(parseFloat(result)).toBeCloseTo(2.302585, 5);
148
+ });
149
+
150
+ it('should handle exponential', async () => {
151
+ const result = await calculator._call('exp(0)');
152
+ expect(result).toBe('1');
153
+ });
154
+
155
+ it('should handle floor function', async () => {
156
+ const result = await calculator._call('floor(4.7)');
157
+ expect(result).toBe('4');
158
+ });
159
+
160
+ it('should handle ceil function', async () => {
161
+ const result = await calculator._call('ceil(4.3)');
162
+ expect(result).toBe('5');
163
+ });
164
+
165
+ it('should handle round function', async () => {
166
+ const result = await calculator._call('round(4.5)');
167
+ expect(result).toBe('5');
168
+ });
169
+ });
170
+
171
+ describe('constants', () => {
172
+ it('should handle pi constant', async () => {
173
+ const result = await calculator._call('pi');
174
+ expect(parseFloat(result)).toBeCloseTo(3.14159, 5);
175
+ });
176
+
177
+ it('should handle e constant', async () => {
178
+ const result = await calculator._call('e');
179
+ expect(parseFloat(result)).toBeCloseTo(2.71828, 5);
180
+ });
181
+
182
+ it('should use pi in calculations', async () => {
183
+ const result = await calculator._call('2 * pi');
184
+ expect(parseFloat(result)).toBeCloseTo(6.28318, 4);
185
+ });
186
+ });
187
+
188
+ describe('error handling', () => {
189
+ it('should return error message for invalid expression', async () => {
190
+ const result = await calculator._call('invalid expression');
191
+ expect(result).toBe('I don\'t know how to do that.');
192
+ });
193
+
194
+ it('should handle division by zero', async () => {
195
+ const result = await calculator._call('5 / 0');
196
+ expect(result).toBe('Infinity');
197
+ });
198
+
199
+ it('should return error message for incomplete expression', async () => {
200
+ const result = await calculator._call('5 +');
201
+ expect(result).toBe('I don\'t know how to do that.');
202
+ });
203
+
204
+ it('should return error message for mismatched parentheses', async () => {
205
+ const result = await calculator._call('(5 + 3');
206
+ expect(result).toBe('I don\'t know how to do that.');
207
+ });
208
+
209
+ it('should return error message for empty input', async () => {
210
+ const result = await calculator._call('');
211
+ expect(result).toBe('I don\'t know how to do that.');
212
+ });
213
+
214
+ it('should return error message for only whitespace', async () => {
215
+ const result = await calculator._call(' ');
216
+ expect(result).toBe('I don\'t know how to do that.');
217
+ });
218
+
219
+ it('should return error message for undefined variable', async () => {
220
+ const result = await calculator._call('x + 5');
221
+ expect(result).toBe('I don\'t know how to do that.');
222
+ });
223
+ });
224
+
225
+ describe('edge cases', () => {
226
+ it('should handle very large numbers', async () => {
227
+ const result = await calculator._call('999999999 * 999999999');
228
+ expect(parseFloat(result)).toBeCloseTo(999999998000000000, -10);
229
+ });
230
+
231
+ it('should handle very small decimal numbers', async () => {
232
+ const result = await calculator._call('0.0001 + 0.0002');
233
+ expect(parseFloat(result)).toBeCloseTo(0.0003, 10);
234
+ });
235
+
236
+ it('should handle expressions with spaces', async () => {
237
+ const result = await calculator._call(' 5 + 3 ');
238
+ expect(result).toBe('8');
239
+ });
240
+
241
+ it('should handle zero in calculations', async () => {
242
+ const result = await calculator._call('0 + 0');
243
+ expect(result).toBe('0');
244
+ });
245
+
246
+ it('should handle power of zero', async () => {
247
+ const result = await calculator._call('5 ^ 0');
248
+ expect(result).toBe('1');
249
+ });
250
+
251
+ it('should handle zero to the power', async () => {
252
+ const result = await calculator._call('0 ^ 5');
253
+ expect(result).toBe('0');
254
+ });
255
+ });
256
+
257
+ describe('complex real-world calculations', () => {
258
+ it('should calculate area of circle', async () => {
259
+ const result = await calculator._call('pi * 5^2');
260
+ expect(parseFloat(result)).toBeCloseTo(78.53981, 4);
261
+ });
262
+
263
+ it('should calculate compound interest formula component', async () => {
264
+ const result = await calculator._call('(1 + 0.05/12)^(12*5)');
265
+ expect(parseFloat(result)).toBeCloseTo(1.28336, 4);
266
+ });
267
+
268
+ it('should calculate percentage', async () => {
269
+ const result = await calculator._call('(25 / 200) * 100');
270
+ expect(result).toBe('12.5');
271
+ });
272
+
273
+ it('should calculate average', async () => {
274
+ const result = await calculator._call('(10 + 20 + 30 + 40 + 50) / 5');
275
+ expect(result).toBe('30');
276
+ });
277
+ });
278
+ });
@@ -0,0 +1,25 @@
1
+ import { Tool } from '@langchain/core/tools';
2
+ import * as math from 'mathjs';
3
+
4
+ export class Calculator extends Tool {
5
+ static lc_name(): string {
6
+ return 'Calculator';
7
+ }
8
+
9
+ get lc_namespace(): string[] {
10
+ return [...super.lc_namespace, 'calculator'];
11
+ }
12
+
13
+ name = 'calculator';
14
+
15
+ async _call(input: string): Promise<string> {
16
+ try {
17
+ return math.evaluate(input).toString();
18
+ } catch {
19
+ return 'I don\'t know how to do that.';
20
+ }
21
+ }
22
+
23
+ description =
24
+ 'Useful for getting the result of a math expression. The input to this tool should be a valid mathematical expression that could be executed by a simple calculator.';
25
+ }