illuma-agents 1.0.2 → 1.0.3

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 +7 -6
  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 +7 -6
  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 +9 -7
  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
package/package.json CHANGED
@@ -1,145 +1,162 @@
1
- {
2
- "name": "illuma-agents",
3
- "version": "1.0.2",
4
- "main": "./dist/cjs/main.cjs",
5
- "module": "./dist/esm/main.mjs",
6
- "types": "./dist/types/index.d.ts",
7
- "exports": {
8
- ".": {
9
- "import": "./dist/esm/main.mjs",
10
- "require": "./dist/cjs/main.cjs",
11
- "types": "./dist/types/index.d.ts"
12
- }
13
- },
14
- "type": "module",
15
- "description": "Illuma AI Agents Library",
16
- "license": "MIT",
17
- "packageManager": "npm@10.5.2",
18
- "engines": {
19
- "node": ">=14.0.0"
20
- },
21
- "files": [
22
- "dist",
23
- "src",
24
- "LICENSE",
25
- "README.md"
26
- ],
27
- "scripts": {
28
- "prepare": "node husky-setup.js",
29
- "prepublishOnly": "npm run build",
30
- "build": "NODE_ENV=production rollup -c && tsc -p tsconfig.build.json",
31
- "build:dev": "rollup -c",
32
- "start": "node dist/esm/main.js",
33
- "clean": "node ./config/clean.js",
34
- "script": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/cli.ts",
35
- "bun:cli": "bun -r dotenv/config ./src/scripts/cli.ts --provider 'bedrock' --name 'Jo' --location 'New York, NY'",
36
- "start:cli": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/cli.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
37
- "content": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/content.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
38
- "stream": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/stream.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
39
- "code_exec": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/code_exec.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
40
- "image": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/image.ts --provider 'google' --name 'Jo' --location 'New York, NY'",
41
- "code_exec_files": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/code_exec_files.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
42
- "code_exec_simple": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/code_exec_simple.ts --provider 'google' --name 'Jo' --location 'New York, NY'",
43
- "simple": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/simple.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
44
- "caching": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/caching.ts --name 'Jo' --location 'New York, NY'",
45
- "thinking": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/thinking.ts --name 'Jo' --location 'New York, NY'",
46
- "memory": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/memory.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
47
- "tool-test": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/tools.ts --provider 'openrouter' --name 'Jo' --location 'New York, NY'",
48
- "search": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/search.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
49
- "ant_web_search": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/ant_web_search.ts --name 'Jo' --location 'New York, NY'",
50
- "abort": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/abort.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
51
- "start:cli2": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/cli2.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
52
- "script2": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/proto/example_test.ts",
53
- "script3": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/proto/example_test_anthropic.ts",
54
- "script4": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/cli4.ts --name 'Jo' --location 'New York, NY'",
55
- "script5": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/cli5.ts --name 'Jo' --location 'New York, NY'",
56
- "start:standard": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/standard.ts",
57
- "start:cg": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/collab.ts",
58
- "start:tasks": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/tasks.ts",
59
- "start:collab": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/main.ts",
60
- "start:collab5": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/collab_design_v5.ts",
61
- "start:dev": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/main.ts",
62
- "test": "jest",
63
- "test:memory": "NODE_OPTIONS='--expose-gc' npx jest src/specs/title.memory-leak.test.ts",
64
- "test:all": "npm test -- --testPathIgnorePatterns=title.memory-leak.test.ts && npm run test:memory",
65
- "reinstall": "npm run clean && npm ci && rm -rf ./dist && npm run build",
66
- "re": "bun run clean && bun install && rm -rf ./dist && turbo build",
67
- "lint": "eslint \"{,!(node_modules|venv)/**/}*.{js,jsx,ts,tsx}\" --fix",
68
- "format": "prettier --write ."
69
- },
70
- "overrides": {
71
- "@langchain/openai": "0.5.18",
72
- "@browserbasehq/stagehand": {
73
- "openai": "$openai"
74
- }
75
- },
76
- "dependencies": {
77
- "@langchain/anthropic": "^0.3.26",
78
- "@langchain/aws": "^0.1.12",
79
- "@langchain/community": "^0.3.47",
80
- "@langchain/core": "^0.3.62",
81
- "@langchain/deepseek": "^0.0.2",
82
- "@langchain/google-genai": "^0.2.13",
83
- "@langchain/google-vertexai": "^0.2.13",
84
- "@langchain/langgraph": "^0.3.4",
85
- "@langchain/mistralai": "^0.2.1",
86
- "@langchain/ollama": "^0.2.3",
87
- "@langchain/openai": "0.5.18",
88
- "@langchain/xai": "^0.0.3",
89
- "@langfuse/langchain": "^4.3.0",
90
- "@langfuse/otel": "^4.3.0",
91
- "@langfuse/tracing": "^4.3.0",
92
- "@opentelemetry/sdk-node": "^0.207.0",
93
- "cheerio": "^1.0.0",
94
- "dotenv": "^16.4.7",
95
- "https-proxy-agent": "^7.0.6",
96
- "nanoid": "^3.3.7",
97
- "openai": "^5.10.1"
98
- },
99
- "imports": {
100
- "@/*": "./src/*",
101
- "~/*": "./*"
102
- },
103
- "devDependencies": {
104
- "@anthropic-ai/vertex-sdk": "^0.12.0",
105
- "@eslint/compat": "^1.2.7",
106
- "@rollup/plugin-alias": "^5.1.0",
107
- "@rollup/plugin-commonjs": "^28.0.3",
108
- "@rollup/plugin-json": "^6.1.0",
109
- "@rollup/plugin-node-resolve": "^15.2.3",
110
- "@rollup/plugin-terser": "^0.4.4",
111
- "@rollup/plugin-typescript": "^12.1.2",
112
- "@swc/core": "^1.6.13",
113
- "@types/jest": "^29.5.14",
114
- "@types/node": "^20.14.11",
115
- "@types/yargs-parser": "^21.0.3",
116
- "@typescript-eslint/eslint-plugin": "^8.24.0",
117
- "@typescript-eslint/parser": "^8.24.0",
118
- "eslint": "^9.31.0",
119
- "eslint-import-resolver-typescript": "^3.7.0",
120
- "eslint-plugin-import": "^2.31.0",
121
- "husky": "^9.1.7",
122
- "jest": "^29.7.0",
123
- "lint-staged": "^15.2.7",
124
- "prettier": "^3.5.1",
125
- "rollup": "^4.34.6",
126
- "rollup-plugin-cleandir": "^2.0.0",
127
- "rollup-plugin-obfuscator": "^1.1.0",
128
- "ts-jest": "^29.3.1",
129
- "ts-node": "^10.9.2",
130
- "tsc-alias": "^1.8.10",
131
- "tsconfig-paths": "^4.2.0",
132
- "tslib": "^2.6.3",
133
- "typescript": "^5.5.3",
134
- "winston": "^3.17.0"
135
- },
136
- "lint-staged": {
137
- "*.{js,ts}": [
138
- "prettier --write",
139
- "eslint --fix"
140
- ],
141
- "*.{json,md}": [
142
- "prettier --write"
143
- ]
144
- }
145
- }
1
+ {
2
+ "name": "illuma-agents",
3
+ "version": "1.0.3",
4
+ "main": "./dist/cjs/main.cjs",
5
+ "module": "./dist/esm/main.mjs",
6
+ "types": "./dist/types/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/esm/main.mjs",
10
+ "require": "./dist/cjs/main.cjs",
11
+ "types": "./dist/types/index.d.ts"
12
+ }
13
+ },
14
+ "type": "module",
15
+ "description": "Illuma AI Agents Library",
16
+ "author": "Varun Muppidi",
17
+ "license": "MIT",
18
+ "packageManager": "npm@10.5.2",
19
+ "engines": {
20
+ "node": ">=14.0.0"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "src",
25
+ "LICENSE",
26
+ "README.md"
27
+ ],
28
+ "scripts": {
29
+ "prepare": "node husky-setup.js",
30
+ "prepublishOnly": "npm run build",
31
+ "build": "cross-env NODE_ENV=production rollup -c && tsc -p tsconfig.build.json",
32
+ "build:dev": "rollup -c",
33
+ "start": "node dist/esm/main.js",
34
+ "clean": "node ./config/clean.js",
35
+ "script": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/cli.ts",
36
+ "bun:cli": "bun -r dotenv/config ./src/scripts/cli.ts --provider 'bedrock' --name 'Jo' --location 'New York, NY'",
37
+ "start:cli": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/cli.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
38
+ "content": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/content.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
39
+ "stream": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/stream.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
40
+ "code_exec": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/code_exec.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
41
+ "image": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/image.ts --provider 'google' --name 'Jo' --location 'New York, NY'",
42
+ "code_exec_files": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/code_exec_files.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
43
+ "code_exec_simple": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/code_exec_simple.ts --provider 'google' --name 'Jo' --location 'New York, NY'",
44
+ "simple": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/simple.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
45
+ "caching": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/caching.ts --name 'Jo' --location 'New York, NY'",
46
+ "thinking": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/thinking.ts --name 'Jo' --location 'New York, NY'",
47
+ "memory": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/memory.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
48
+ "tool": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/tools.ts --provider 'bedrock' --name 'Jo' --location 'New York, NY'",
49
+ "search": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/search.ts --provider 'bedrock' --name 'Jo' --location 'New York, NY'",
50
+ "ant_web_search": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/ant_web_search.ts --name 'Jo' --location 'New York, NY'",
51
+ "abort": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/abort.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
52
+ "start:cli2": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/cli2.ts --provider 'anthropic' --name 'Jo' --location 'New York, NY'",
53
+ "multi-agent-test": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-test.ts",
54
+ "test-tools-before-handoff": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/test-tools-before-handoff.ts",
55
+ "multi-agent-parallel": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-parallel.ts",
56
+ "multi-agent-chain": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-chain.ts",
57
+ "multi-agent-sequence": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-sequence.ts",
58
+ "multi-agent-conditional": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-conditional.ts",
59
+ "multi-agent-supervisor": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-supervisor.ts",
60
+ "multi-agent-list-handoff": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/test-multi-agent-list-handoff.ts",
61
+ "multi-agent-hybrid-flow": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-hybrid-flow.ts",
62
+ "test-handoff-input": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/test-handoff-input.ts",
63
+ "test-custom-prompt-key": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/test-custom-prompt-key.ts",
64
+ "script2": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/proto/example_test.ts",
65
+ "script3": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/proto/example_test_anthropic.ts",
66
+ "script4": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/cli4.ts --name 'Jo' --location 'New York, NY'",
67
+ "script5": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/cli5.ts --name 'Jo' --location 'New York, NY'",
68
+ "start:standard": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/standard.ts",
69
+ "start:cg": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/collab.ts",
70
+ "start:tasks": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/tasks.ts",
71
+ "start:collab": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/main.ts",
72
+ "start:collab5": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/collab_design_v5.ts",
73
+ "start:dev": "node --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/main.ts",
74
+ "supervised": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/supervised.ts --provider anthropic --name Jo --location \"New York, NY\"",
75
+ "test": "jest",
76
+ "test:memory": "NODE_OPTIONS='--expose-gc' npx jest src/specs/title.memory-leak.test.ts",
77
+ "test:all": "npm test -- --testPathIgnorePatterns=title.memory-leak.test.ts && npm run test:memory",
78
+ "reinstall": "npm run clean && npm ci && rm -rf ./dist && npm run build",
79
+ "re": "bun run clean && bun install && rm -rf ./dist && turbo build",
80
+ "lint": "eslint \"{,!(node_modules|venv)/**/}*.{js,jsx,ts,tsx}\" --fix",
81
+ "format": "prettier --write ."
82
+ },
83
+ "overrides": {
84
+ "@langchain/openai": "0.5.18",
85
+ "@browserbasehq/stagehand": {
86
+ "openai": "$openai"
87
+ }
88
+ },
89
+ "dependencies": {
90
+ "@langchain/anthropic": "^0.3.26",
91
+ "@langchain/aws": "^0.1.15",
92
+ "@langchain/core": "^0.3.79",
93
+ "@langchain/deepseek": "^0.0.2",
94
+ "@langchain/google-genai": "^0.2.13",
95
+ "@langchain/google-vertexai": "^0.2.13",
96
+ "@langchain/langgraph": "^0.4.9",
97
+ "@langchain/mistralai": "^0.2.1",
98
+ "@langchain/ollama": "^0.2.3",
99
+ "@langchain/openai": "0.5.18",
100
+ "@langchain/textsplitters": "^0.1.0",
101
+ "@langchain/xai": "^0.0.3",
102
+ "@langfuse/langchain": "^4.3.0",
103
+ "@langfuse/otel": "^4.3.0",
104
+ "@langfuse/tracing": "^4.3.0",
105
+ "@opentelemetry/sdk-node": "^0.207.0",
106
+ "axios": "^1.12.1",
107
+ "cheerio": "^1.0.0",
108
+ "dotenv": "^16.4.7",
109
+ "https-proxy-agent": "^7.0.6",
110
+ "mathjs": "^15.1.0",
111
+ "nanoid": "^3.3.7",
112
+ "openai": "5.8.2"
113
+ },
114
+ "imports": {
115
+ "@/*": "./src/*",
116
+ "~/*": "./*"
117
+ },
118
+ "devDependencies": {
119
+ "@anthropic-ai/vertex-sdk": "^0.12.0",
120
+ "@eslint/compat": "^1.2.7",
121
+ "@rollup/plugin-alias": "^5.1.0",
122
+ "@rollup/plugin-commonjs": "^28.0.3",
123
+ "@rollup/plugin-json": "^6.1.0",
124
+ "@rollup/plugin-node-resolve": "^15.2.3",
125
+ "@rollup/plugin-terser": "^0.4.4",
126
+ "@rollup/plugin-typescript": "^12.1.2",
127
+ "@swc/core": "^1.6.13",
128
+ "@types/jest": "^29.5.14",
129
+ "@types/node": "^20.14.11",
130
+ "@types/node-fetch": "^2.6.13",
131
+ "@types/yargs-parser": "^21.0.3",
132
+ "@typescript-eslint/eslint-plugin": "^8.24.0",
133
+ "@typescript-eslint/parser": "^8.24.0",
134
+ "cross-env": "^10.1.0",
135
+ "eslint": "^9.31.0",
136
+ "eslint-import-resolver-typescript": "^3.7.0",
137
+ "eslint-plugin-import": "^2.31.0",
138
+ "husky": "^9.1.7",
139
+ "jest": "^29.7.0",
140
+ "lint-staged": "^15.2.7",
141
+ "prettier": "^3.5.1",
142
+ "rollup": "^4.34.6",
143
+ "rollup-plugin-cleandir": "^2.0.0",
144
+ "rollup-plugin-obfuscator": "^1.1.0",
145
+ "ts-jest": "^29.3.1",
146
+ "ts-node": "^10.9.2",
147
+ "tsc-alias": "^1.8.10",
148
+ "tsconfig-paths": "^4.2.0",
149
+ "tslib": "^2.6.3",
150
+ "typescript": "^5.5.3",
151
+ "winston": "^3.17.0"
152
+ },
153
+ "lint-staged": {
154
+ "*.{js,ts}": [
155
+ "prettier --write",
156
+ "eslint --fix"
157
+ ],
158
+ "*.{json,md}": [
159
+ "prettier --write"
160
+ ]
161
+ }
162
+ }
@@ -0,0 +1,323 @@
1
+ /* eslint-disable no-console */
2
+ // src/agents/AgentContext.ts
3
+ import { zodToJsonSchema } from 'zod-to-json-schema';
4
+ import { SystemMessage } from '@langchain/core/messages';
5
+ import { RunnableLambda } from '@langchain/core/runnables';
6
+ import type {
7
+ UsageMetadata,
8
+ BaseMessage,
9
+ BaseMessageFields,
10
+ } from '@langchain/core/messages';
11
+ import type { RunnableConfig, Runnable } from '@langchain/core/runnables';
12
+ import type * as t from '@/types';
13
+ import type { createPruneMessages } from '@/messages';
14
+ import { ContentTypes, Providers } from '@/common';
15
+
16
+ /**
17
+ * Encapsulates agent-specific state that can vary between agents in a multi-agent system
18
+ */
19
+ export class AgentContext {
20
+ /**
21
+ * Create an AgentContext from configuration with token accounting initialization
22
+ */
23
+ static fromConfig(
24
+ agentConfig: t.AgentInputs,
25
+ tokenCounter?: t.TokenCounter,
26
+ indexTokenCountMap?: Record<string, number>
27
+ ): AgentContext {
28
+ const {
29
+ agentId,
30
+ provider,
31
+ clientOptions,
32
+ tools,
33
+ toolMap,
34
+ toolEnd,
35
+ instructions,
36
+ additional_instructions,
37
+ streamBuffer,
38
+ maxContextTokens,
39
+ reasoningKey,
40
+ useLegacyContent,
41
+ } = agentConfig;
42
+
43
+ const agentContext = new AgentContext({
44
+ agentId,
45
+ provider,
46
+ clientOptions,
47
+ maxContextTokens,
48
+ streamBuffer,
49
+ tools,
50
+ toolMap,
51
+ instructions,
52
+ additionalInstructions: additional_instructions,
53
+ reasoningKey,
54
+ toolEnd,
55
+ instructionTokens: 0,
56
+ tokenCounter,
57
+ useLegacyContent,
58
+ });
59
+
60
+ if (tokenCounter) {
61
+ const tokenMap = indexTokenCountMap || {};
62
+ agentContext.indexTokenCountMap = tokenMap;
63
+ agentContext.tokenCalculationPromise = agentContext
64
+ .calculateInstructionTokens(tokenCounter)
65
+ .then(() => {
66
+ // Update token map with instruction tokens
67
+ agentContext.updateTokenMapWithInstructions(tokenMap);
68
+ })
69
+ .catch((err) => {
70
+ console.error('Error calculating instruction tokens:', err);
71
+ });
72
+ } else if (indexTokenCountMap) {
73
+ agentContext.indexTokenCountMap = indexTokenCountMap;
74
+ }
75
+
76
+ return agentContext;
77
+ }
78
+
79
+ /** Agent identifier */
80
+ agentId: string;
81
+ /** Provider for this specific agent */
82
+ provider: Providers;
83
+ /** Client options for this agent */
84
+ clientOptions?: t.ClientOptions;
85
+ /** Token count map indexed by message position */
86
+ indexTokenCountMap: Record<string, number | undefined> = {};
87
+ /** Maximum context tokens for this agent */
88
+ maxContextTokens?: number;
89
+ /** Current usage metadata for this agent */
90
+ currentUsage?: Partial<UsageMetadata>;
91
+ /** Prune messages function configured for this agent */
92
+ pruneMessages?: ReturnType<typeof createPruneMessages>;
93
+ /** Token counter function for this agent */
94
+ tokenCounter?: t.TokenCounter;
95
+ /** Instructions/system message token count */
96
+ instructionTokens: number = 0;
97
+ /** The amount of time that should pass before another consecutive API call */
98
+ streamBuffer?: number;
99
+ /** Last stream call timestamp for rate limiting */
100
+ lastStreamCall?: number;
101
+ /** Tools available to this agent */
102
+ tools?: t.GraphTools;
103
+ /** Tool map for this agent */
104
+ toolMap?: t.ToolMap;
105
+ /** Instructions for this agent */
106
+ instructions?: string;
107
+ /** Additional instructions for this agent */
108
+ additionalInstructions?: string;
109
+ /** Reasoning key for this agent */
110
+ reasoningKey: 'reasoning_content' | 'reasoning' = 'reasoning_content';
111
+ /** Last token for reasoning detection */
112
+ lastToken?: string;
113
+ /** Token type switch state */
114
+ tokenTypeSwitch?: 'reasoning' | 'content';
115
+ /** Current token type being processed */
116
+ currentTokenType: ContentTypes.TEXT | ContentTypes.THINK | 'think_and_text' =
117
+ ContentTypes.TEXT;
118
+ /** Whether tools should end the workflow */
119
+ toolEnd: boolean = false;
120
+ /** System runnable for this agent */
121
+ systemRunnable?: Runnable<
122
+ BaseMessage[],
123
+ (BaseMessage | SystemMessage)[],
124
+ RunnableConfig<Record<string, unknown>>
125
+ >;
126
+ /** Promise for token calculation initialization */
127
+ tokenCalculationPromise?: Promise<void>;
128
+ /** Format content blocks as strings (for legacy compatibility) */
129
+ useLegacyContent: boolean = false;
130
+
131
+ constructor({
132
+ agentId,
133
+ provider,
134
+ clientOptions,
135
+ maxContextTokens,
136
+ streamBuffer,
137
+ tokenCounter,
138
+ tools,
139
+ toolMap,
140
+ instructions,
141
+ additionalInstructions,
142
+ reasoningKey,
143
+ toolEnd,
144
+ instructionTokens,
145
+ useLegacyContent,
146
+ }: {
147
+ agentId: string;
148
+ provider: Providers;
149
+ clientOptions?: t.ClientOptions;
150
+ maxContextTokens?: number;
151
+ streamBuffer?: number;
152
+ tokenCounter?: t.TokenCounter;
153
+ tools?: t.GraphTools;
154
+ toolMap?: t.ToolMap;
155
+ instructions?: string;
156
+ additionalInstructions?: string;
157
+ reasoningKey?: 'reasoning_content' | 'reasoning';
158
+ toolEnd?: boolean;
159
+ instructionTokens?: number;
160
+ useLegacyContent?: boolean;
161
+ }) {
162
+ this.agentId = agentId;
163
+ this.provider = provider;
164
+ this.clientOptions = clientOptions;
165
+ this.maxContextTokens = maxContextTokens;
166
+ this.streamBuffer = streamBuffer;
167
+ this.tokenCounter = tokenCounter;
168
+ this.tools = tools;
169
+ this.toolMap = toolMap;
170
+ this.instructions = instructions;
171
+ this.additionalInstructions = additionalInstructions;
172
+ if (reasoningKey) {
173
+ this.reasoningKey = reasoningKey;
174
+ }
175
+ if (toolEnd !== undefined) {
176
+ this.toolEnd = toolEnd;
177
+ }
178
+ if (instructionTokens !== undefined) {
179
+ this.instructionTokens = instructionTokens;
180
+ }
181
+
182
+ this.useLegacyContent = useLegacyContent ?? false;
183
+
184
+ this.systemRunnable = this.createSystemRunnable();
185
+ }
186
+
187
+ /**
188
+ * Create system runnable from instructions and calculate tokens if tokenCounter is available
189
+ */
190
+ private createSystemRunnable():
191
+ | Runnable<
192
+ BaseMessage[],
193
+ (BaseMessage | SystemMessage)[],
194
+ RunnableConfig<Record<string, unknown>>
195
+ >
196
+ | undefined {
197
+ let finalInstructions: string | BaseMessageFields | undefined =
198
+ this.instructions;
199
+
200
+ if (
201
+ this.additionalInstructions != null &&
202
+ this.additionalInstructions !== ''
203
+ ) {
204
+ finalInstructions =
205
+ finalInstructions != null && finalInstructions
206
+ ? `${finalInstructions}\n\n${this.additionalInstructions}`
207
+ : this.additionalInstructions;
208
+ }
209
+
210
+ // Handle Anthropic prompt caching
211
+ if (
212
+ finalInstructions != null &&
213
+ finalInstructions !== '' &&
214
+ this.provider === Providers.ANTHROPIC
215
+ ) {
216
+ const anthropicOptions = this.clientOptions as
217
+ | t.AnthropicClientOptions
218
+ | undefined;
219
+ const defaultHeaders = anthropicOptions?.clientOptions?.defaultHeaders as
220
+ | Record<string, string>
221
+ | undefined;
222
+ const anthropicBeta = defaultHeaders?.['anthropic-beta'];
223
+ if (
224
+ typeof anthropicBeta === 'string' &&
225
+ anthropicBeta.includes('prompt-caching')
226
+ ) {
227
+ finalInstructions = {
228
+ content: [
229
+ {
230
+ type: 'text',
231
+ text: this.instructions,
232
+ cache_control: { type: 'ephemeral' },
233
+ },
234
+ ],
235
+ };
236
+ }
237
+ }
238
+
239
+ if (finalInstructions != null && finalInstructions !== '') {
240
+ const systemMessage = new SystemMessage(finalInstructions);
241
+
242
+ if (this.tokenCounter) {
243
+ this.instructionTokens += this.tokenCounter(systemMessage);
244
+ }
245
+
246
+ return RunnableLambda.from((messages: BaseMessage[]) => {
247
+ return [systemMessage, ...messages];
248
+ }).withConfig({ runName: 'prompt' });
249
+ }
250
+
251
+ return undefined;
252
+ }
253
+
254
+ /**
255
+ * Reset context for a new run
256
+ */
257
+ reset(): void {
258
+ this.instructionTokens = 0;
259
+ this.lastToken = undefined;
260
+ this.indexTokenCountMap = {};
261
+ this.currentUsage = undefined;
262
+ this.pruneMessages = undefined;
263
+ this.lastStreamCall = undefined;
264
+ this.tokenTypeSwitch = undefined;
265
+ this.currentTokenType = ContentTypes.TEXT;
266
+ }
267
+
268
+ /**
269
+ * Update the token count map with instruction tokens
270
+ */
271
+ updateTokenMapWithInstructions(baseTokenMap: Record<string, number>): void {
272
+ if (this.instructionTokens > 0) {
273
+ // Shift all indices by the instruction token count
274
+ const shiftedMap: Record<string, number> = {};
275
+ for (const [key, value] of Object.entries(baseTokenMap)) {
276
+ const index = parseInt(key, 10);
277
+ if (!isNaN(index)) {
278
+ shiftedMap[String(index)] =
279
+ value + (index === 0 ? this.instructionTokens : 0);
280
+ }
281
+ }
282
+ this.indexTokenCountMap = shiftedMap;
283
+ } else {
284
+ this.indexTokenCountMap = { ...baseTokenMap };
285
+ }
286
+ }
287
+
288
+ /**
289
+ * Calculate tool tokens and add to instruction tokens
290
+ * Note: System message tokens are calculated during systemRunnable creation
291
+ */
292
+ async calculateInstructionTokens(
293
+ tokenCounter: t.TokenCounter
294
+ ): Promise<void> {
295
+ let toolTokens = 0;
296
+ if (this.tools && this.tools.length > 0) {
297
+ for (const tool of this.tools) {
298
+ const genericTool = tool as Record<string, unknown>;
299
+ if (
300
+ genericTool.schema != null &&
301
+ typeof genericTool.schema === 'object'
302
+ ) {
303
+ const schema = genericTool.schema as {
304
+ describe: (desc: string) => unknown;
305
+ };
306
+ const describedSchema = schema.describe(
307
+ (genericTool.description as string) || ''
308
+ );
309
+ const jsonSchema = zodToJsonSchema(
310
+ describedSchema as Parameters<typeof zodToJsonSchema>[0],
311
+ (genericTool.name as string) || ''
312
+ );
313
+ toolTokens += tokenCounter(
314
+ new SystemMessage(JSON.stringify(jsonSchema))
315
+ );
316
+ }
317
+ }
318
+ }
319
+
320
+ // Add tool tokens to existing instruction tokens (which may already include system message tokens)
321
+ this.instructionTokens += toolTokens;
322
+ }
323
+ }