illuma-agents 1.0.7 → 1.0.9

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 (237) hide show
  1. package/LICENSE +1 -5
  2. package/dist/cjs/common/enum.cjs +1 -2
  3. package/dist/cjs/common/enum.cjs.map +1 -1
  4. package/dist/cjs/instrumentation.cjs.map +1 -1
  5. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  6. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +79 -2
  7. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  8. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
  9. package/dist/cjs/llm/bedrock/index.cjs +99 -0
  10. package/dist/cjs/llm/bedrock/index.cjs.map +1 -0
  11. package/dist/cjs/llm/fake.cjs.map +1 -1
  12. package/dist/cjs/llm/google/index.cjs +78 -9
  13. package/dist/cjs/llm/google/index.cjs.map +1 -1
  14. package/dist/cjs/llm/google/utils/common.cjs +185 -28
  15. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  16. package/dist/cjs/llm/providers.cjs +13 -16
  17. package/dist/cjs/llm/providers.cjs.map +1 -1
  18. package/dist/cjs/llm/text.cjs.map +1 -1
  19. package/dist/cjs/messages/core.cjs +14 -14
  20. package/dist/cjs/messages/core.cjs.map +1 -1
  21. package/dist/cjs/messages/ids.cjs.map +1 -1
  22. package/dist/cjs/messages/prune.cjs.map +1 -1
  23. package/dist/cjs/run.cjs +10 -1
  24. package/dist/cjs/run.cjs.map +1 -1
  25. package/dist/cjs/splitStream.cjs.map +1 -1
  26. package/dist/cjs/stream.cjs +4 -1
  27. package/dist/cjs/stream.cjs.map +1 -1
  28. package/dist/cjs/tools/ToolNode.cjs +163 -55
  29. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  30. package/dist/cjs/tools/handlers.cjs +29 -25
  31. package/dist/cjs/tools/handlers.cjs.map +1 -1
  32. package/dist/cjs/tools/search/anthropic.cjs.map +1 -1
  33. package/dist/cjs/tools/search/content.cjs.map +1 -1
  34. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  35. package/dist/cjs/tools/search/format.cjs.map +1 -1
  36. package/dist/cjs/tools/search/highlights.cjs.map +1 -1
  37. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  38. package/dist/cjs/tools/search/schema.cjs +25 -25
  39. package/dist/cjs/tools/search/schema.cjs.map +1 -1
  40. package/dist/cjs/tools/search/search.cjs +6 -1
  41. package/dist/cjs/tools/search/search.cjs.map +1 -1
  42. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
  43. package/dist/cjs/tools/search/tool.cjs +162 -35
  44. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  45. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  46. package/dist/cjs/utils/graph.cjs.map +1 -1
  47. package/dist/cjs/utils/llm.cjs +0 -1
  48. package/dist/cjs/utils/llm.cjs.map +1 -1
  49. package/dist/cjs/utils/misc.cjs.map +1 -1
  50. package/dist/cjs/utils/run.cjs.map +1 -1
  51. package/dist/cjs/utils/title.cjs +7 -7
  52. package/dist/cjs/utils/title.cjs.map +1 -1
  53. package/dist/esm/common/enum.mjs +1 -2
  54. package/dist/esm/common/enum.mjs.map +1 -1
  55. package/dist/esm/instrumentation.mjs.map +1 -1
  56. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  57. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +79 -2
  58. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  59. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
  60. package/dist/esm/llm/bedrock/index.mjs +97 -0
  61. package/dist/esm/llm/bedrock/index.mjs.map +1 -0
  62. package/dist/esm/llm/fake.mjs.map +1 -1
  63. package/dist/esm/llm/google/index.mjs +79 -10
  64. package/dist/esm/llm/google/index.mjs.map +1 -1
  65. package/dist/esm/llm/google/utils/common.mjs +184 -30
  66. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  67. package/dist/esm/llm/providers.mjs +2 -5
  68. package/dist/esm/llm/providers.mjs.map +1 -1
  69. package/dist/esm/llm/text.mjs.map +1 -1
  70. package/dist/esm/messages/core.mjs +14 -14
  71. package/dist/esm/messages/core.mjs.map +1 -1
  72. package/dist/esm/messages/ids.mjs.map +1 -1
  73. package/dist/esm/messages/prune.mjs.map +1 -1
  74. package/dist/esm/run.mjs +10 -1
  75. package/dist/esm/run.mjs.map +1 -1
  76. package/dist/esm/splitStream.mjs.map +1 -1
  77. package/dist/esm/stream.mjs +4 -1
  78. package/dist/esm/stream.mjs.map +1 -1
  79. package/dist/esm/tools/ToolNode.mjs +164 -56
  80. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  81. package/dist/esm/tools/handlers.mjs +30 -26
  82. package/dist/esm/tools/handlers.mjs.map +1 -1
  83. package/dist/esm/tools/search/anthropic.mjs.map +1 -1
  84. package/dist/esm/tools/search/content.mjs.map +1 -1
  85. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  86. package/dist/esm/tools/search/format.mjs.map +1 -1
  87. package/dist/esm/tools/search/highlights.mjs.map +1 -1
  88. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  89. package/dist/esm/tools/search/schema.mjs +25 -25
  90. package/dist/esm/tools/search/schema.mjs.map +1 -1
  91. package/dist/esm/tools/search/search.mjs +6 -1
  92. package/dist/esm/tools/search/search.mjs.map +1 -1
  93. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
  94. package/dist/esm/tools/search/tool.mjs +162 -35
  95. package/dist/esm/tools/search/tool.mjs.map +1 -1
  96. package/dist/esm/tools/search/utils.mjs.map +1 -1
  97. package/dist/esm/utils/graph.mjs.map +1 -1
  98. package/dist/esm/utils/llm.mjs +0 -1
  99. package/dist/esm/utils/llm.mjs.map +1 -1
  100. package/dist/esm/utils/misc.mjs.map +1 -1
  101. package/dist/esm/utils/run.mjs.map +1 -1
  102. package/dist/esm/utils/title.mjs +7 -7
  103. package/dist/esm/utils/title.mjs.map +1 -1
  104. package/dist/types/common/enum.d.ts +1 -2
  105. package/dist/types/llm/bedrock/index.d.ts +36 -0
  106. package/dist/types/llm/google/index.d.ts +10 -0
  107. package/dist/types/llm/google/types.d.ts +11 -1
  108. package/dist/types/llm/google/utils/common.d.ts +17 -2
  109. package/dist/types/tools/ToolNode.d.ts +9 -1
  110. package/dist/types/tools/search/types.d.ts +2 -0
  111. package/dist/types/types/llm.d.ts +3 -8
  112. package/dist/types/types/tools.d.ts +1 -1
  113. package/package.json +15 -11
  114. package/src/common/enum.ts +1 -2
  115. package/src/common/index.ts +1 -1
  116. package/src/instrumentation.ts +22 -22
  117. package/src/llm/anthropic/llm.spec.ts +1442 -1442
  118. package/src/llm/anthropic/types.ts +140 -140
  119. package/src/llm/anthropic/utils/message_inputs.ts +757 -660
  120. package/src/llm/anthropic/utils/output_parsers.ts +133 -133
  121. package/src/llm/anthropic/utils/tools.ts +29 -29
  122. package/src/llm/bedrock/index.ts +128 -0
  123. package/src/llm/fake.ts +133 -133
  124. package/src/llm/google/data/gettysburg10.wav +0 -0
  125. package/src/llm/google/data/hotdog.jpg +0 -0
  126. package/src/llm/google/index.ts +129 -14
  127. package/src/llm/google/llm.spec.ts +932 -0
  128. package/src/llm/google/types.ts +56 -43
  129. package/src/llm/google/utils/common.ts +873 -660
  130. package/src/llm/google/utils/tools.ts +160 -160
  131. package/src/llm/openai/types.ts +24 -24
  132. package/src/llm/openai/utils/isReasoningModel.test.ts +90 -90
  133. package/src/llm/providers.ts +2 -7
  134. package/src/llm/text.ts +94 -94
  135. package/src/messages/core.ts +463 -463
  136. package/src/messages/formatAgentMessages.tools.test.ts +400 -400
  137. package/src/messages/formatMessage.test.ts +693 -693
  138. package/src/messages/ids.ts +26 -26
  139. package/src/messages/prune.ts +567 -567
  140. package/src/messages/shiftIndexTokenCountMap.test.ts +81 -81
  141. package/src/mockStream.ts +98 -98
  142. package/src/prompts/collab.ts +5 -5
  143. package/src/prompts/index.ts +1 -1
  144. package/src/prompts/taskmanager.ts +61 -61
  145. package/src/run.ts +13 -4
  146. package/src/scripts/ant_web_search_edge_case.ts +162 -0
  147. package/src/scripts/ant_web_search_error_edge_case.ts +148 -0
  148. package/src/scripts/args.ts +48 -48
  149. package/src/scripts/caching.ts +123 -123
  150. package/src/scripts/code_exec_files.ts +193 -193
  151. package/src/scripts/empty_input.ts +137 -137
  152. package/src/scripts/image.ts +178 -178
  153. package/src/scripts/memory.ts +97 -97
  154. package/src/scripts/thinking.ts +149 -149
  155. package/src/specs/anthropic.simple.test.ts +67 -0
  156. package/src/specs/spec.utils.ts +3 -3
  157. package/src/specs/token-distribution-edge-case.test.ts +316 -316
  158. package/src/specs/tool-error.test.ts +193 -193
  159. package/src/splitStream.test.ts +691 -691
  160. package/src/splitStream.ts +234 -234
  161. package/src/stream.test.ts +94 -94
  162. package/src/stream.ts +4 -1
  163. package/src/tools/ToolNode.ts +206 -64
  164. package/src/tools/handlers.ts +32 -28
  165. package/src/tools/search/anthropic.ts +51 -51
  166. package/src/tools/search/content.test.ts +173 -173
  167. package/src/tools/search/content.ts +147 -147
  168. package/src/tools/search/direct-url.test.ts +530 -0
  169. package/src/tools/search/firecrawl.ts +210 -210
  170. package/src/tools/search/format.ts +250 -250
  171. package/src/tools/search/highlights.ts +320 -320
  172. package/src/tools/search/index.ts +2 -2
  173. package/src/tools/search/jina-reranker.test.ts +126 -126
  174. package/src/tools/search/output.md +2775 -2775
  175. package/src/tools/search/rerankers.ts +242 -242
  176. package/src/tools/search/schema.ts +63 -63
  177. package/src/tools/search/search.ts +766 -759
  178. package/src/tools/search/serper-scraper.ts +155 -155
  179. package/src/tools/search/test.html +883 -883
  180. package/src/tools/search/test.md +642 -642
  181. package/src/tools/search/test.ts +159 -159
  182. package/src/tools/search/tool.ts +619 -471
  183. package/src/tools/search/types.ts +689 -687
  184. package/src/tools/search/utils.ts +79 -79
  185. package/src/types/index.ts +6 -6
  186. package/src/types/llm.ts +2 -8
  187. package/src/types/tools.ts +80 -80
  188. package/src/utils/graph.ts +10 -10
  189. package/src/utils/llm.ts +26 -27
  190. package/src/utils/llmConfig.ts +5 -3
  191. package/src/utils/logging.ts +48 -48
  192. package/src/utils/misc.ts +57 -57
  193. package/src/utils/run.ts +100 -100
  194. package/src/utils/title.ts +165 -165
  195. package/dist/cjs/llm/ollama/index.cjs +0 -70
  196. package/dist/cjs/llm/ollama/index.cjs.map +0 -1
  197. package/dist/cjs/llm/ollama/utils.cjs +0 -158
  198. package/dist/cjs/llm/ollama/utils.cjs.map +0 -1
  199. package/dist/esm/llm/ollama/index.mjs +0 -68
  200. package/dist/esm/llm/ollama/index.mjs.map +0 -1
  201. package/dist/esm/llm/ollama/utils.mjs +0 -155
  202. package/dist/esm/llm/ollama/utils.mjs.map +0 -1
  203. package/dist/types/llm/ollama/index.d.ts +0 -8
  204. package/dist/types/llm/ollama/utils.d.ts +0 -7
  205. package/src/llm/ollama/index.ts +0 -92
  206. package/src/llm/ollama/utils.ts +0 -193
  207. package/src/proto/CollabGraph.ts +0 -269
  208. package/src/proto/TaskManager.ts +0 -243
  209. package/src/proto/collab.ts +0 -200
  210. package/src/proto/collab_design.ts +0 -184
  211. package/src/proto/collab_design_v2.ts +0 -224
  212. package/src/proto/collab_design_v3.ts +0 -255
  213. package/src/proto/collab_design_v4.ts +0 -220
  214. package/src/proto/collab_design_v5.ts +0 -251
  215. package/src/proto/collab_graph.ts +0 -181
  216. package/src/proto/collab_original.ts +0 -123
  217. package/src/proto/example.ts +0 -93
  218. package/src/proto/example_new.ts +0 -68
  219. package/src/proto/example_old.ts +0 -201
  220. package/src/proto/example_test.ts +0 -152
  221. package/src/proto/example_test_anthropic.ts +0 -100
  222. package/src/proto/log_stream.ts +0 -202
  223. package/src/proto/main_collab_community_event.ts +0 -133
  224. package/src/proto/main_collab_design_v2.ts +0 -96
  225. package/src/proto/main_collab_design_v4.ts +0 -100
  226. package/src/proto/main_collab_design_v5.ts +0 -135
  227. package/src/proto/main_collab_global_analysis.ts +0 -122
  228. package/src/proto/main_collab_hackathon_event.ts +0 -153
  229. package/src/proto/main_collab_space_mission.ts +0 -153
  230. package/src/proto/main_philosophy.ts +0 -210
  231. package/src/proto/original_script.ts +0 -126
  232. package/src/proto/standard.ts +0 -100
  233. package/src/proto/stream.ts +0 -56
  234. package/src/proto/tasks.ts +0 -118
  235. package/src/proto/tools/global_analysis_tools.ts +0 -86
  236. package/src/proto/tools/space_mission_tools.ts +0 -60
  237. package/src/proto/vertexai.ts +0 -54
@@ -11,7 +11,6 @@ function isOpenAILike(provider) {
11
11
  Providers.OPENROUTER,
12
12
  Providers.XAI,
13
13
  Providers.DEEPSEEK,
14
- Providers.OLLAMA,
15
14
  ].includes(provider);
16
15
  }
17
16
  function isGoogleLike(provider) {
@@ -1 +1 @@
1
- {"version":3,"file":"llm.mjs","sources":["../../../src/utils/llm.ts"],"sourcesContent":["// src/utils/llm.ts\r\nimport { Providers } from '@/common';\r\n\r\nexport function isOpenAILike(provider?: string | Providers): boolean {\r\n if (provider == null) {\r\n return false;\r\n }\r\n return (\r\n [\r\n Providers.OPENAI,\r\n Providers.AZURE,\r\n Providers.OPENROUTER,\r\n Providers.XAI,\r\n Providers.DEEPSEEK,\r\n Providers.OLLAMA,\r\n ] as string[]\r\n ).includes(provider);\r\n}\r\n\r\nexport function isGoogleLike(provider?: string | Providers): boolean {\r\n if (provider == null) {\r\n return false;\r\n }\r\n return ([Providers.GOOGLE, Providers.VERTEXAI] as string[]).includes(\r\n provider\r\n );\r\n}\r\n"],"names":[],"mappings":";;AAAA;AAGM,SAAU,YAAY,CAAC,QAA6B,EAAA;AACxD,IAAA,IAAI,QAAQ,IAAI,IAAI,EAAE;AACpB,QAAA,OAAO,KAAK;;IAEd,OACE;AACE,QAAA,SAAS,CAAC,MAAM;AAChB,QAAA,SAAS,CAAC,KAAK;AACf,QAAA,SAAS,CAAC,UAAU;AACpB,QAAA,SAAS,CAAC,GAAG;AACb,QAAA,SAAS,CAAC,QAAQ;AAClB,QAAA,SAAS,CAAC,MAAM;AAEnB,KAAA,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACtB;AAEM,SAAU,YAAY,CAAC,QAA6B,EAAA;AACxD,IAAA,IAAI,QAAQ,IAAI,IAAI,EAAE;AACpB,QAAA,OAAO,KAAK;;AAEd,IAAA,OAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAc,CAAC,QAAQ,CAClE,QAAQ,CACT;AACH;;;;"}
1
+ {"version":3,"file":"llm.mjs","sources":["../../../src/utils/llm.ts"],"sourcesContent":["// src/utils/llm.ts\nimport { Providers } from '@/common';\n\nexport function isOpenAILike(provider?: string | Providers): boolean {\n if (provider == null) {\n return false;\n }\n return (\n [\n Providers.OPENAI,\n Providers.AZURE,\n Providers.OPENROUTER,\n Providers.XAI,\n Providers.DEEPSEEK,\n ] as string[]\n ).includes(provider);\n}\n\nexport function isGoogleLike(provider?: string | Providers): boolean {\n if (provider == null) {\n return false;\n }\n return ([Providers.GOOGLE, Providers.VERTEXAI] as string[]).includes(\n provider\n );\n}\n"],"names":[],"mappings":";;AAAA;AAGM,SAAU,YAAY,CAAC,QAA6B,EAAA;AACxD,IAAA,IAAI,QAAQ,IAAI,IAAI,EAAE;AACpB,QAAA,OAAO,KAAK;;IAEd,OACE;AACE,QAAA,SAAS,CAAC,MAAM;AAChB,QAAA,SAAS,CAAC,KAAK;AACf,QAAA,SAAS,CAAC,UAAU;AACpB,QAAA,SAAS,CAAC,GAAG;AACb,QAAA,SAAS,CAAC,QAAQ;AAErB,KAAA,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACtB;AAEM,SAAU,YAAY,CAAC,QAA6B,EAAA;AACxD,IAAA,IAAI,QAAQ,IAAI,IAAI,EAAE;AACpB,QAAA,OAAO,KAAK;;AAEd,IAAA,OAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAc,CAAC,QAAQ,CAClE,QAAQ,CACT;AACH;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"misc.mjs","sources":["../../../src/utils/misc.ts"],"sourcesContent":["export function isPresent(value: string | null | undefined): value is string {\r\n return value != null && value !== '';\r\n}\r\n\r\n/**\r\n * Unescapes a c-escaped string\r\n * @param str The string to unescape\r\n * @returns The unescaped string\r\n */\r\nconst unescapeString = (string: string): string =>\r\n string.replace(/\\\\(.)/g, (_, char) => {\r\n switch (char) {\r\n case 'n':\r\n return '\\n';\r\n case 't':\r\n return '\\t';\r\n case 'r':\r\n return '\\r';\r\n case '\"':\r\n return '\"';\r\n case '\\'':\r\n return '\\'';\r\n case '\\\\':\r\n return '\\\\';\r\n default:\r\n return char;\r\n }\r\n });\r\n\r\n/**\r\n * Recursively unescapes all string values in an object\r\n * @param obj The object to unescape\r\n * @returns The unescaped object\r\n */\r\nexport function unescapeObject(obj: unknown, key?: string): unknown {\r\n if (typeof obj === 'string') {\r\n let unescaped = unescapeString(obj);\r\n if (key === 'filePath' && unescaped.match(/^\"(.+)\"$/)) {\r\n unescaped = unescaped.substring(1, unescaped.length - 1);\r\n }\r\n return unescaped;\r\n }\r\n if (Array.isArray(obj)) {\r\n return obj.map((value) =>\r\n unescapeObject(value, key === 'contextPaths' ? 'filePath' : '')\r\n );\r\n }\r\n if (typeof obj === 'object' && obj !== null) {\r\n return Object.fromEntries(\r\n Object.entries(obj).map(([key, value]) => [\r\n key,\r\n unescapeObject(value, key),\r\n ])\r\n );\r\n }\r\n return obj;\r\n}\r\n"],"names":[],"mappings":"AAAM,SAAU,SAAS,CAAC,KAAgC,EAAA;AACxD,IAAA,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;AACtC;AAEA;;;;AAIG;AACH,MAAM,cAAc,GAAG,CAAC,MAAc,KACpC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,KAAI;IACnC,QAAQ,IAAI;AACZ,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,IAAI;AACb,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,IAAI;AACb,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,IAAI;AACb,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,GAAG;AACZ,QAAA,KAAK,IAAI;AACP,YAAA,OAAO,IAAI;AACb,QAAA,KAAK,IAAI;AACP,YAAA,OAAO,IAAI;AACb,QAAA;AACE,YAAA,OAAO,IAAI;;AAEf,CAAC,CAAC;AAEJ;;;;AAIG;AACa,SAAA,cAAc,CAAC,GAAY,EAAE,GAAY,EAAA;AACvD,IAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC3B,QAAA,IAAI,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC;QACnC,IAAI,GAAG,KAAK,UAAU,IAAI,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;AACrD,YAAA,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;;AAE1D,QAAA,OAAO,SAAS;;AAElB,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACtB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,KACnB,cAAc,CAAC,KAAK,EAAE,GAAG,KAAK,cAAc,GAAG,UAAU,GAAG,EAAE,CAAC,CAChE;;IAEH,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE;QAC3C,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;YACxC,GAAG;AACH,YAAA,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC;AAC3B,SAAA,CAAC,CACH;;AAEH,IAAA,OAAO,GAAG;AACZ;;;;"}
1
+ {"version":3,"file":"misc.mjs","sources":["../../../src/utils/misc.ts"],"sourcesContent":["export function isPresent(value: string | null | undefined): value is string {\n return value != null && value !== '';\n}\n\n/**\n * Unescapes a c-escaped string\n * @param str The string to unescape\n * @returns The unescaped string\n */\nconst unescapeString = (string: string): string =>\n string.replace(/\\\\(.)/g, (_, char) => {\n switch (char) {\n case 'n':\n return '\\n';\n case 't':\n return '\\t';\n case 'r':\n return '\\r';\n case '\"':\n return '\"';\n case '\\'':\n return '\\'';\n case '\\\\':\n return '\\\\';\n default:\n return char;\n }\n });\n\n/**\n * Recursively unescapes all string values in an object\n * @param obj The object to unescape\n * @returns The unescaped object\n */\nexport function unescapeObject(obj: unknown, key?: string): unknown {\n if (typeof obj === 'string') {\n let unescaped = unescapeString(obj);\n if (key === 'filePath' && unescaped.match(/^\"(.+)\"$/)) {\n unescaped = unescaped.substring(1, unescaped.length - 1);\n }\n return unescaped;\n }\n if (Array.isArray(obj)) {\n return obj.map((value) =>\n unescapeObject(value, key === 'contextPaths' ? 'filePath' : '')\n );\n }\n if (typeof obj === 'object' && obj !== null) {\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [\n key,\n unescapeObject(value, key),\n ])\n );\n }\n return obj;\n}\n"],"names":[],"mappings":"AAAM,SAAU,SAAS,CAAC,KAAgC,EAAA;AACxD,IAAA,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;AACtC;AAEA;;;;AAIG;AACH,MAAM,cAAc,GAAG,CAAC,MAAc,KACpC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,KAAI;IACnC,QAAQ,IAAI;AACZ,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,IAAI;AACb,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,IAAI;AACb,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,IAAI;AACb,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,GAAG;AACZ,QAAA,KAAK,IAAI;AACP,YAAA,OAAO,IAAI;AACb,QAAA,KAAK,IAAI;AACP,YAAA,OAAO,IAAI;AACb,QAAA;AACE,YAAA,OAAO,IAAI;;AAEf,CAAC,CAAC;AAEJ;;;;AAIG;AACa,SAAA,cAAc,CAAC,GAAY,EAAE,GAAY,EAAA;AACvD,IAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC3B,QAAA,IAAI,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC;QACnC,IAAI,GAAG,KAAK,UAAU,IAAI,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;AACrD,YAAA,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;;AAE1D,QAAA,OAAO,SAAS;;AAElB,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACtB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,KACnB,cAAc,CAAC,KAAK,EAAE,GAAG,KAAK,cAAc,GAAG,UAAU,GAAG,EAAE,CAAC,CAChE;;IAEH,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE;QAC3C,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;YACxC,GAAG;AACH,YAAA,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC;AAC3B,SAAA,CAAC,CACH;;AAEH,IAAA,OAAO,GAAG;AACZ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"run.mjs","sources":["../../../src/utils/run.ts"],"sourcesContent":["import { CallbackManagerForChainRun } from '@langchain/core/callbacks/manager';\r\nimport {\r\n mergeConfigs,\r\n patchConfig,\r\n Runnable,\r\n RunnableConfig,\r\n} from '@langchain/core/runnables';\r\nimport { AsyncLocalStorageProviderSingleton } from '@langchain/core/singletons';\r\n\r\n/**\r\n * Delays the execution for a specified number of milliseconds.\r\n *\r\n * @param {number} ms - The number of milliseconds to delay.\r\n * @return {Promise<void>} A promise that resolves after the specified delay.\r\n */\r\nexport function sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport interface RunnableCallableArgs extends Partial<any> {\r\n name?: string;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n func: (...args: any[]) => any;\r\n tags?: string[];\r\n trace?: boolean;\r\n recurse?: boolean;\r\n}\r\n\r\nexport class RunnableCallable<I = unknown, O = unknown> extends Runnable<I, O> {\r\n lc_namespace: string[] = ['langgraph'];\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n func: (...args: any[]) => any;\r\n\r\n tags?: string[];\r\n\r\n config?: RunnableConfig;\r\n\r\n trace: boolean = true;\r\n\r\n recurse: boolean = true;\r\n\r\n constructor(fields: RunnableCallableArgs) {\r\n super();\r\n this.name = fields.name ?? fields.func.name;\r\n this.func = fields.func;\r\n this.config = fields.tags ? { tags: fields.tags } : undefined;\r\n this.trace = fields.trace ?? this.trace;\r\n this.recurse = fields.recurse ?? this.recurse;\r\n }\r\n\r\n protected async _tracedInvoke(\r\n input: I,\r\n config?: Partial<RunnableConfig>,\r\n runManager?: CallbackManagerForChainRun\r\n ): Promise<O> {\r\n return new Promise<O>((resolve, reject) => {\r\n const childConfig = patchConfig(config, {\r\n callbacks: runManager?.getChild(),\r\n });\r\n void AsyncLocalStorageProviderSingleton.runWithConfig(\r\n childConfig,\r\n async () => {\r\n try {\r\n const output = await this.func(input, childConfig);\r\n resolve(output);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n }\r\n );\r\n });\r\n }\r\n\r\n async invoke(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n input: any,\r\n options?: Partial<RunnableConfig> | undefined\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n ): Promise<any> {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n let returnValue: any;\r\n\r\n if (this.trace) {\r\n returnValue = await this._callWithConfig(\r\n this._tracedInvoke,\r\n input,\r\n mergeConfigs(this.config, options)\r\n );\r\n } else {\r\n returnValue = await this.func(input, mergeConfigs(this.config, options));\r\n }\r\n\r\n if (Runnable.isRunnable(returnValue) && this.recurse) {\r\n return await returnValue.invoke(input, options);\r\n }\r\n\r\n return returnValue;\r\n }\r\n}"],"names":[],"mappings":";;;AASA;;;;;AAKG;AACG,SAAU,KAAK,CAAC,EAAU,EAAA;AAC9B,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1D;AAYM,MAAO,gBAA2C,SAAQ,QAAc,CAAA;AAC5E,IAAA,YAAY,GAAa,CAAC,WAAW,CAAC;;AAGtC,IAAA,IAAI;AAEJ,IAAA,IAAI;AAEJ,IAAA,MAAM;IAEN,KAAK,GAAY,IAAI;IAErB,OAAO,GAAY,IAAI;AAEvB,IAAA,WAAA,CAAY,MAA4B,EAAA;AACtC,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI;AAC3C,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,SAAS;QAC7D,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK;QACvC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;;AAGrC,IAAA,MAAM,aAAa,CAC3B,KAAQ,EACR,MAAgC,EAChC,UAAuC,EAAA;QAEvC,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,KAAI;AACxC,YAAA,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE;AACtC,gBAAA,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE;AAClC,aAAA,CAAC;YACF,KAAK,kCAAkC,CAAC,aAAa,CACnD,WAAW,EACX,YAAW;AACT,gBAAA,IAAI;oBACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC;oBAClD,OAAO,CAAC,MAAM,CAAC;;gBACf,OAAO,CAAC,EAAE;oBACV,MAAM,CAAC,CAAC,CAAC;;AAEb,aAAC,CACF;AACH,SAAC,CAAC;;AAGJ,IAAA,MAAM,MAAM;;AAEV,IAAA,KAAU,EACV;;;;AAIA,QAAA,IAAI,WAAgB;AAEpB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CACtC,IAAI,CAAC,aAAa,EAClB,KAAK,EACL,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CACnC;;aACI;AACL,YAAA,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;QAG1E,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;YACpD,OAAO,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;;AAGjD,QAAA,OAAO,WAAW;;AAErB;;;;"}
1
+ {"version":3,"file":"run.mjs","sources":["../../../src/utils/run.ts"],"sourcesContent":["import { CallbackManagerForChainRun } from '@langchain/core/callbacks/manager';\nimport {\n mergeConfigs,\n patchConfig,\n Runnable,\n RunnableConfig,\n} from '@langchain/core/runnables';\nimport { AsyncLocalStorageProviderSingleton } from '@langchain/core/singletons';\n\n/**\n * Delays the execution for a specified number of milliseconds.\n *\n * @param {number} ms - The number of milliseconds to delay.\n * @return {Promise<void>} A promise that resolves after the specified delay.\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface RunnableCallableArgs extends Partial<any> {\n name?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n func: (...args: any[]) => any;\n tags?: string[];\n trace?: boolean;\n recurse?: boolean;\n}\n\nexport class RunnableCallable<I = unknown, O = unknown> extends Runnable<I, O> {\n lc_namespace: string[] = ['langgraph'];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n func: (...args: any[]) => any;\n\n tags?: string[];\n\n config?: RunnableConfig;\n\n trace: boolean = true;\n\n recurse: boolean = true;\n\n constructor(fields: RunnableCallableArgs) {\n super();\n this.name = fields.name ?? fields.func.name;\n this.func = fields.func;\n this.config = fields.tags ? { tags: fields.tags } : undefined;\n this.trace = fields.trace ?? this.trace;\n this.recurse = fields.recurse ?? this.recurse;\n }\n\n protected async _tracedInvoke(\n input: I,\n config?: Partial<RunnableConfig>,\n runManager?: CallbackManagerForChainRun\n ): Promise<O> {\n return new Promise<O>((resolve, reject) => {\n const childConfig = patchConfig(config, {\n callbacks: runManager?.getChild(),\n });\n void AsyncLocalStorageProviderSingleton.runWithConfig(\n childConfig,\n async () => {\n try {\n const output = await this.func(input, childConfig);\n resolve(output);\n } catch (e) {\n reject(e);\n }\n }\n );\n });\n }\n\n async invoke(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input: any,\n options?: Partial<RunnableConfig> | undefined\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let returnValue: any;\n\n if (this.trace) {\n returnValue = await this._callWithConfig(\n this._tracedInvoke,\n input,\n mergeConfigs(this.config, options)\n );\n } else {\n returnValue = await this.func(input, mergeConfigs(this.config, options));\n }\n\n if (Runnable.isRunnable(returnValue) && this.recurse) {\n return await returnValue.invoke(input, options);\n }\n\n return returnValue;\n }\n}"],"names":[],"mappings":";;;AASA;;;;;AAKG;AACG,SAAU,KAAK,CAAC,EAAU,EAAA;AAC9B,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1D;AAYM,MAAO,gBAA2C,SAAQ,QAAc,CAAA;AAC5E,IAAA,YAAY,GAAa,CAAC,WAAW,CAAC;;AAGtC,IAAA,IAAI;AAEJ,IAAA,IAAI;AAEJ,IAAA,MAAM;IAEN,KAAK,GAAY,IAAI;IAErB,OAAO,GAAY,IAAI;AAEvB,IAAA,WAAA,CAAY,MAA4B,EAAA;AACtC,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI;AAC3C,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,SAAS;QAC7D,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK;QACvC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;;AAGrC,IAAA,MAAM,aAAa,CAC3B,KAAQ,EACR,MAAgC,EAChC,UAAuC,EAAA;QAEvC,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,KAAI;AACxC,YAAA,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE;AACtC,gBAAA,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE;AAClC,aAAA,CAAC;YACF,KAAK,kCAAkC,CAAC,aAAa,CACnD,WAAW,EACX,YAAW;AACT,gBAAA,IAAI;oBACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC;oBAClD,OAAO,CAAC,MAAM,CAAC;;gBACf,OAAO,CAAC,EAAE;oBACV,MAAM,CAAC,CAAC,CAAC;;AAEb,aAAC,CACF;AACH,SAAC,CAAC;;AAGJ,IAAA,MAAM,MAAM;;AAEV,IAAA,KAAU,EACV;;;;AAIA,QAAA,IAAI,WAAgB;AAEpB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CACtC,IAAI,CAAC,aAAa,EAClB,KAAK,EACL,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CACnC;;aACI;AACL,YAAA,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;QAG1E,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;YACpD,OAAO,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;;AAGjD,QAAA,OAAO,WAAW;;AAErB;;;;"}
@@ -3,10 +3,10 @@ import { ChatPromptTemplate } from '@langchain/core/prompts';
3
3
  import { RunnableLambda, RunnableSequence } from '@langchain/core/runnables';
4
4
  import { ContentTypes } from '../common/enum.mjs';
5
5
 
6
- const defaultTitlePrompt = `Analyze this conversation and provide:
7
- 1. The detected language of the conversation
8
- 2. A concise title in the detected language (5 words or less, no punctuation or quotation)
9
-
6
+ const defaultTitlePrompt = `Analyze this conversation and provide:
7
+ 1. The detected language of the conversation
8
+ 2. A concise title in the detected language (5 words or less, no punctuation or quotation)
9
+
10
10
  {convo}`;
11
11
  const titleSchema = z.object({
12
12
  title: z
@@ -69,9 +69,9 @@ const createTitleRunnable = async (model, _titlePrompt) => {
69
69
  },
70
70
  }).withConfig({ runName: 'TitleGenerator' });
71
71
  };
72
- const defaultCompletionPrompt = `Provide a concise, 5-word-or-less title for the conversation, using title case conventions. Only return the title itself.
73
-
74
- Conversation:
72
+ const defaultCompletionPrompt = `Provide a concise, 5-word-or-less title for the conversation, using title case conventions. Only return the title itself.
73
+
74
+ Conversation:
75
75
  {convo}`;
76
76
  const createCompletionTitleRunnable = async (model, titlePrompt) => {
77
77
  const completionPrompt = ChatPromptTemplate.fromTemplate(titlePrompt ?? defaultCompletionPrompt).withConfig({ runName: 'CompletionTitlePrompt' });
@@ -1 +1 @@
1
- {"version":3,"file":"title.mjs","sources":["../../../src/utils/title.ts"],"sourcesContent":["import { z } from 'zod';\r\nimport { ChatPromptTemplate } from '@langchain/core/prompts';\r\nimport { RunnableLambda, RunnableSequence } from '@langchain/core/runnables';\r\nimport type { Runnable, RunnableConfig } from '@langchain/core/runnables';\r\nimport type { AIMessage } from '@langchain/core/messages';\r\nimport type * as t from '@/types';\r\nimport { ContentTypes } from '@/common';\r\n\r\nconst defaultTitlePrompt = `Analyze this conversation and provide:\r\n1. The detected language of the conversation\r\n2. A concise title in the detected language (5 words or less, no punctuation or quotation)\r\n\r\n{convo}`;\r\n\r\nconst titleSchema = z.object({\r\n title: z\r\n .string()\r\n .describe(\r\n 'A concise title for the conversation in 5 words or less, without punctuation or quotation'\r\n ),\r\n});\r\n\r\nconst combinedSchema = z.object({\r\n language: z.string().describe('The detected language of the conversation'),\r\n title: z\r\n .string()\r\n .describe(\r\n 'A concise title for the conversation in 5 words or less, without punctuation or quotation'\r\n ),\r\n});\r\n\r\nexport const createTitleRunnable = async (\r\n model: t.ChatModelInstance,\r\n _titlePrompt?: string\r\n): Promise<Runnable> => {\r\n // Disabled since this works fine\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n /* @ts-ignore */\r\n const titleLLM = model.withStructuredOutput(titleSchema);\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n /* @ts-ignore */\r\n const combinedLLM = model.withStructuredOutput(combinedSchema);\r\n\r\n const titlePrompt = ChatPromptTemplate.fromTemplate(\r\n _titlePrompt ?? defaultTitlePrompt\r\n ).withConfig({ runName: 'TitlePrompt' });\r\n\r\n const titleOnlyInnerChain = RunnableSequence.from([titlePrompt, titleLLM]);\r\n const combinedInnerChain = RunnableSequence.from([titlePrompt, combinedLLM]);\r\n\r\n /** Wrap titleOnlyChain in RunnableLambda to create parent span */\r\n const titleOnlyChain = new RunnableLambda({\r\n func: async (\r\n input: { convo: string },\r\n config?: Partial<RunnableConfig>\r\n ): Promise<{ title: string }> => {\r\n return await titleOnlyInnerChain.invoke(input, config);\r\n },\r\n }).withConfig({ runName: 'TitleOnlyChain' });\r\n\r\n /** Wrap combinedChain in RunnableLambda to create parent span */\r\n const combinedChain = new RunnableLambda({\r\n func: async (\r\n input: { convo: string },\r\n config?: Partial<RunnableConfig>\r\n ): Promise<{ language: string; title: string }> => {\r\n return await combinedInnerChain.invoke(input, config);\r\n },\r\n }).withConfig({ runName: 'TitleLanguageChain' });\r\n\r\n /** Runnable to add default values if needed */\r\n const addDefaults = new RunnableLambda({\r\n func: (\r\n result: { language: string; title: string } | undefined\r\n ): { language: string; title: string } => ({\r\n language: result?.language ?? 'English',\r\n title: result?.title ?? '',\r\n }),\r\n }).withConfig({ runName: 'AddDefaults' });\r\n\r\n const combinedChainInner = RunnableSequence.from([\r\n combinedChain,\r\n addDefaults,\r\n ]);\r\n\r\n /** Wrap combinedChainWithDefaults in RunnableLambda to create parent span */\r\n const combinedChainWithDefaults = new RunnableLambda({\r\n func: async (\r\n input: { convo: string },\r\n config?: Partial<RunnableConfig>\r\n ): Promise<{ language: string; title: string }> => {\r\n return await combinedChainInner.invoke(input, config);\r\n },\r\n }).withConfig({ runName: 'CombinedChainWithDefaults' });\r\n\r\n return new RunnableLambda({\r\n func: async (\r\n input: {\r\n convo: string;\r\n inputText: string;\r\n skipLanguage: boolean;\r\n },\r\n config?: Partial<RunnableConfig>\r\n ): Promise<{ language: string; title: string } | { title: string }> => {\r\n const invokeInput = { convo: input.convo };\r\n\r\n if (input.skipLanguage) {\r\n return (await titleOnlyChain.invoke(invokeInput, config)) as {\r\n title: string;\r\n };\r\n }\r\n\r\n return await combinedChainWithDefaults.invoke(invokeInput, config);\r\n },\r\n }).withConfig({ runName: 'TitleGenerator' });\r\n};\r\n\r\nconst defaultCompletionPrompt = `Provide a concise, 5-word-or-less title for the conversation, using title case conventions. Only return the title itself.\r\n\r\nConversation:\r\n{convo}`;\r\n\r\nexport const createCompletionTitleRunnable = async (\r\n model: t.ChatModelInstance,\r\n titlePrompt?: string\r\n): Promise<Runnable> => {\r\n const completionPrompt = ChatPromptTemplate.fromTemplate(\r\n titlePrompt ?? defaultCompletionPrompt\r\n ).withConfig({ runName: 'CompletionTitlePrompt' });\r\n\r\n /** Runnable to extract content from model response */\r\n const extractContent = new RunnableLambda({\r\n func: (response: AIMessage): { title: string } => {\r\n let content = '';\r\n if (typeof response.content === 'string') {\r\n content = response.content;\r\n } else if (Array.isArray(response.content)) {\r\n content = response.content\r\n .filter(\r\n (part): part is { type: ContentTypes.TEXT; text: string } =>\r\n part.type === ContentTypes.TEXT\r\n )\r\n .map((part) => part.text)\r\n .join('');\r\n }\r\n return { title: content.trim() };\r\n },\r\n }).withConfig({ runName: 'ExtractTitle' });\r\n\r\n const innerChain = RunnableSequence.from([\r\n completionPrompt,\r\n model,\r\n extractContent,\r\n ]);\r\n\r\n /** Wrap in RunnableLambda to create a parent span for LangFuse */\r\n return new RunnableLambda({\r\n func: async (\r\n input: { convo: string },\r\n config?: Partial<RunnableConfig>\r\n ): Promise<{ title: string }> => {\r\n return await innerChain.invoke(input, config);\r\n },\r\n }).withConfig({ runName: 'CompletionTitleChain' });\r\n};\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"title.mjs","sources":["../../../src/utils/title.ts"],"sourcesContent":["import { z } from 'zod';\nimport { ChatPromptTemplate } from '@langchain/core/prompts';\nimport { RunnableLambda, RunnableSequence } from '@langchain/core/runnables';\nimport type { Runnable, RunnableConfig } from '@langchain/core/runnables';\nimport type { AIMessage } from '@langchain/core/messages';\nimport type * as t from '@/types';\nimport { ContentTypes } from '@/common';\n\nconst defaultTitlePrompt = `Analyze this conversation and provide:\n1. The detected language of the conversation\n2. A concise title in the detected language (5 words or less, no punctuation or quotation)\n\n{convo}`;\n\nconst titleSchema = z.object({\n title: z\n .string()\n .describe(\n 'A concise title for the conversation in 5 words or less, without punctuation or quotation'\n ),\n});\n\nconst combinedSchema = z.object({\n language: z.string().describe('The detected language of the conversation'),\n title: z\n .string()\n .describe(\n 'A concise title for the conversation in 5 words or less, without punctuation or quotation'\n ),\n});\n\nexport const createTitleRunnable = async (\n model: t.ChatModelInstance,\n _titlePrompt?: string\n): Promise<Runnable> => {\n // Disabled since this works fine\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n /* @ts-ignore */\n const titleLLM = model.withStructuredOutput(titleSchema);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n /* @ts-ignore */\n const combinedLLM = model.withStructuredOutput(combinedSchema);\n\n const titlePrompt = ChatPromptTemplate.fromTemplate(\n _titlePrompt ?? defaultTitlePrompt\n ).withConfig({ runName: 'TitlePrompt' });\n\n const titleOnlyInnerChain = RunnableSequence.from([titlePrompt, titleLLM]);\n const combinedInnerChain = RunnableSequence.from([titlePrompt, combinedLLM]);\n\n /** Wrap titleOnlyChain in RunnableLambda to create parent span */\n const titleOnlyChain = new RunnableLambda({\n func: async (\n input: { convo: string },\n config?: Partial<RunnableConfig>\n ): Promise<{ title: string }> => {\n return await titleOnlyInnerChain.invoke(input, config);\n },\n }).withConfig({ runName: 'TitleOnlyChain' });\n\n /** Wrap combinedChain in RunnableLambda to create parent span */\n const combinedChain = new RunnableLambda({\n func: async (\n input: { convo: string },\n config?: Partial<RunnableConfig>\n ): Promise<{ language: string; title: string }> => {\n return await combinedInnerChain.invoke(input, config);\n },\n }).withConfig({ runName: 'TitleLanguageChain' });\n\n /** Runnable to add default values if needed */\n const addDefaults = new RunnableLambda({\n func: (\n result: { language: string; title: string } | undefined\n ): { language: string; title: string } => ({\n language: result?.language ?? 'English',\n title: result?.title ?? '',\n }),\n }).withConfig({ runName: 'AddDefaults' });\n\n const combinedChainInner = RunnableSequence.from([\n combinedChain,\n addDefaults,\n ]);\n\n /** Wrap combinedChainWithDefaults in RunnableLambda to create parent span */\n const combinedChainWithDefaults = new RunnableLambda({\n func: async (\n input: { convo: string },\n config?: Partial<RunnableConfig>\n ): Promise<{ language: string; title: string }> => {\n return await combinedChainInner.invoke(input, config);\n },\n }).withConfig({ runName: 'CombinedChainWithDefaults' });\n\n return new RunnableLambda({\n func: async (\n input: {\n convo: string;\n inputText: string;\n skipLanguage: boolean;\n },\n config?: Partial<RunnableConfig>\n ): Promise<{ language: string; title: string } | { title: string }> => {\n const invokeInput = { convo: input.convo };\n\n if (input.skipLanguage) {\n return (await titleOnlyChain.invoke(invokeInput, config)) as {\n title: string;\n };\n }\n\n return await combinedChainWithDefaults.invoke(invokeInput, config);\n },\n }).withConfig({ runName: 'TitleGenerator' });\n};\n\nconst defaultCompletionPrompt = `Provide a concise, 5-word-or-less title for the conversation, using title case conventions. Only return the title itself.\n\nConversation:\n{convo}`;\n\nexport const createCompletionTitleRunnable = async (\n model: t.ChatModelInstance,\n titlePrompt?: string\n): Promise<Runnable> => {\n const completionPrompt = ChatPromptTemplate.fromTemplate(\n titlePrompt ?? defaultCompletionPrompt\n ).withConfig({ runName: 'CompletionTitlePrompt' });\n\n /** Runnable to extract content from model response */\n const extractContent = new RunnableLambda({\n func: (response: AIMessage): { title: string } => {\n let content = '';\n if (typeof response.content === 'string') {\n content = response.content;\n } else if (Array.isArray(response.content)) {\n content = response.content\n .filter(\n (part): part is { type: ContentTypes.TEXT; text: string } =>\n part.type === ContentTypes.TEXT\n )\n .map((part) => part.text)\n .join('');\n }\n return { title: content.trim() };\n },\n }).withConfig({ runName: 'ExtractTitle' });\n\n const innerChain = RunnableSequence.from([\n completionPrompt,\n model,\n extractContent,\n ]);\n\n /** Wrap in RunnableLambda to create a parent span for LangFuse */\n return new RunnableLambda({\n func: async (\n input: { convo: string },\n config?: Partial<RunnableConfig>\n ): Promise<{ title: string }> => {\n return await innerChain.invoke(input, config);\n },\n }).withConfig({ runName: 'CompletionTitleChain' });\n};\n"],"names":[],"mappings":"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"}
@@ -57,7 +57,6 @@ export declare enum Providers {
57
57
  ANTHROPIC = "anthropic",
58
58
  MISTRALAI = "mistralai",
59
59
  MISTRAL = "mistral",
60
- OLLAMA = "ollama",
61
60
  GOOGLE = "google",
62
61
  AZURE = "azureOpenAI",
63
62
  DEEPSEEK = "deepseek",
@@ -126,5 +125,5 @@ export declare enum TitleMethod {
126
125
  }
127
126
  export declare enum EnvVar {
128
127
  CODE_API_KEY = "CODE_EXECUTOR_API_KEY",
129
- CODE_BASEURL = "CODE_EXECUTOR_API_BASEURL"
128
+ CODE_BASEURL = "CODE_EXECUTOR_BASEURL"
130
129
  }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Optimized ChatBedrockConverse wrapper that fixes contentBlockIndex conflicts
3
+ *
4
+ * Bedrock sends the same contentBlockIndex for both text and tool_use content blocks,
5
+ * causing LangChain's merge logic to fail with "field[contentBlockIndex] already exists"
6
+ * errors. This wrapper simply strips contentBlockIndex from response_metadata to avoid
7
+ * the conflict.
8
+ *
9
+ * The contentBlockIndex field is only used internally by Bedrock's streaming protocol
10
+ * and isn't needed by application logic - the index field on tool_call_chunks serves
11
+ * the purpose of tracking tool call ordering.
12
+ */
13
+ import { ChatBedrockConverse } from '@langchain/aws';
14
+ import type { ChatBedrockConverseInput } from '@langchain/aws';
15
+ import type { BaseMessage } from '@langchain/core/messages';
16
+ import { ChatGenerationChunk } from '@langchain/core/outputs';
17
+ import type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';
18
+ export declare class CustomChatBedrockConverse extends ChatBedrockConverse {
19
+ constructor(fields?: ChatBedrockConverseInput);
20
+ static lc_name(): string;
21
+ /**
22
+ * Override _streamResponseChunks to strip contentBlockIndex from response_metadata
23
+ * This prevents LangChain's merge conflicts when the same index is used for
24
+ * different content types (text vs tool calls)
25
+ */
26
+ _streamResponseChunks(messages: BaseMessage[], options: this['ParsedCallOptions'], runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatGenerationChunk>;
27
+ /**
28
+ * Check if contentBlockIndex exists at any level in the object
29
+ */
30
+ private hasContentBlockIndex;
31
+ /**
32
+ * Recursively remove contentBlockIndex from all levels of an object
33
+ */
34
+ private removeContentBlockIndex;
35
+ }
36
+ export type { ChatBedrockConverseInput };
@@ -7,8 +7,18 @@ import type { GeminiGenerationConfig } from '@langchain/google-common';
7
7
  import type { GoogleClientOptions } from '@/types';
8
8
  export declare class CustomChatGoogleGenerativeAI extends ChatGoogleGenerativeAI {
9
9
  thinkingConfig?: GeminiGenerationConfig['thinkingConfig'];
10
+ /**
11
+ * Override to add gemini-3 model support for multimodal and function calling thought signatures
12
+ */
13
+ get _isMultimodalModel(): boolean;
10
14
  constructor(fields: GoogleClientOptions);
11
15
  static lc_name(): 'IllumaGoogleGenerativeAI';
16
+ /**
17
+ * Helper function to convert Gemini API usage metadata to LangChain format
18
+ * Includes support for cached tokens and tier-based tracking for gemini-3-pro-preview
19
+ */
20
+ private _convertToUsageMetadata;
12
21
  invocationParams(options?: this['ParsedCallOptions']): Omit<GenerateContentRequest, 'contents'>;
22
+ _generate(messages: BaseMessage[], options: this['ParsedCallOptions'], runManager?: CallbackManagerForLLMRun): Promise<import('@langchain/core/outputs').ChatResult>;
13
23
  _streamResponseChunks(messages: BaseMessage[], options: this['ParsedCallOptions'], runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatGenerationChunk>;
14
24
  }
@@ -1,6 +1,10 @@
1
1
  import { CodeExecutionTool, FunctionDeclarationsTool as GoogleGenerativeAIFunctionDeclarationsTool, GoogleSearchRetrievalTool } from '@google/generative-ai';
2
2
  import { BindToolsInput } from '@langchain/core/language_models/chat_models';
3
- export type GoogleGenerativeAIToolType = BindToolsInput | GoogleGenerativeAIFunctionDeclarationsTool | CodeExecutionTool | GoogleSearchRetrievalTool;
3
+ /** New GoogleSearch tool for Gemini 2.0+ models */
4
+ export interface GoogleSearchTool {
5
+ googleSearch: Record<string, never>;
6
+ }
7
+ export type GoogleGenerativeAIToolType = BindToolsInput | GoogleGenerativeAIFunctionDeclarationsTool | CodeExecutionTool | GoogleSearchRetrievalTool | GoogleSearchTool;
4
8
  /** Enum for content modality types */
5
9
  declare enum Modality {
6
10
  MODALITY_UNSPECIFIED = "MODALITY_UNSPECIFIED",
@@ -15,6 +19,12 @@ interface ModalityTokenCount {
15
19
  modality: Modality;
16
20
  tokenCount: number;
17
21
  }
22
+ /** Interface for input token details with cache and tier tracking */
23
+ export interface InputTokenDetails {
24
+ cache_read?: number;
25
+ over_200k?: number;
26
+ cache_read_over_200k?: number;
27
+ }
18
28
  /** Main interface for Gemini API usage metadata */
19
29
  export interface GeminiApiUsageMetadata {
20
30
  promptTokenCount?: number;
@@ -1,7 +1,16 @@
1
1
  import { POSSIBLE_ROLES, type Part, type Content, type EnhancedGenerateContentResponse, type FunctionDeclarationsTool as GoogleGenerativeAIFunctionDeclarationsTool } from '@google/generative-ai';
2
2
  import { BaseMessage, UsageMetadata } from '@langchain/core/messages';
3
3
  import { ChatGenerationChunk } from '@langchain/core/outputs';
4
+ import type { ChatResult } from '@langchain/core/outputs';
4
5
  import { GoogleGenerativeAIToolType } from '../types';
6
+ export declare const _FUNCTION_CALL_THOUGHT_SIGNATURES_MAP_KEY = "__gemini_function_call_thought_signatures__";
7
+ /**
8
+ * Executes a function immediately and returns its result.
9
+ * Functional utility similar to an Immediately Invoked Function Expression (IIFE).
10
+ * @param fn The function to execute.
11
+ * @returns The result of invoking fn.
12
+ */
13
+ export declare const iife: <T>(fn: () => T) => T;
5
14
  export declare function getMessageAuthor(message: BaseMessage): string;
6
15
  /**
7
16
  * Maps a message type to a Google Generative AI chat author.
@@ -10,10 +19,16 @@ export declare function getMessageAuthor(message: BaseMessage): string;
10
19
  * @returns The message type mapped to a Google Generative AI chat author.
11
20
  */
12
21
  export declare function convertAuthorToRole(author: string): (typeof POSSIBLE_ROLES)[number];
13
- export declare function convertMessageContentToParts(message: BaseMessage, isMultimodalModel: boolean, previousMessages: BaseMessage[]): Part[];
14
- export declare function convertBaseMessagesToContent(messages: BaseMessage[], isMultimodalModel: boolean, convertSystemMessageToHumanContent?: boolean): Content[] | undefined;
22
+ export declare function convertMessageContentToParts(message: BaseMessage, isMultimodalModel: boolean, previousMessages: BaseMessage[], model?: string): Part[];
23
+ export declare function convertBaseMessagesToContent(messages: BaseMessage[], isMultimodalModel: boolean, convertSystemMessageToHumanContent?: boolean, model?: string): Content[] | undefined;
15
24
  export declare function convertResponseContentToChatGenerationChunk(response: EnhancedGenerateContentResponse, extra: {
16
25
  usageMetadata?: UsageMetadata | undefined;
17
26
  index: number;
18
27
  }): ChatGenerationChunk | null;
28
+ /**
29
+ * Maps a Google GenerateContentResult to a LangChain ChatResult
30
+ */
31
+ export declare function mapGenerateContentResultToChatResult(response: EnhancedGenerateContentResponse, extra?: {
32
+ usageMetadata: UsageMetadata | undefined;
33
+ }): ChatResult;
19
34
  export declare function convertToGenerativeAITools(tools: GoogleGenerativeAIToolType[]): GoogleGenerativeAIFunctionDeclarationsTool[];
@@ -1,4 +1,5 @@
1
- import { END, MessagesAnnotation } from '@langchain/langgraph';
1
+ import { ToolCall } from '@langchain/core/messages/tool';
2
+ import { END, Command, MessagesAnnotation } from '@langchain/langgraph';
2
3
  import type { RunnableConfig } from '@langchain/core/runnables';
3
4
  import type { BaseMessage } from '@langchain/core/messages';
4
5
  import type * as t from '@/types';
@@ -8,6 +9,7 @@ export declare class ToolNode<T = any> extends RunnableCallable<T, T> {
8
9
  private toolMap;
9
10
  private loadRuntimeTools?;
10
11
  handleToolErrors: boolean;
12
+ trace: boolean;
11
13
  toolCallStepIds?: Map<string, string>;
12
14
  errorHandler?: t.ToolNodeConstructorParams['errorHandler'];
13
15
  private toolUsageCount;
@@ -17,6 +19,12 @@ export declare class ToolNode<T = any> extends RunnableCallable<T, T> {
17
19
  * @returns A ReadonlyMap where keys are tool names and values are their usage counts.
18
20
  */
19
21
  getToolUsageCounts(): ReadonlyMap<string, number>;
22
+ /**
23
+ * Runs a single tool call with error handling
24
+ */
25
+ protected runTool(call: ToolCall, config: RunnableConfig): Promise<BaseMessage | Command>;
20
26
  protected run(input: any, config: RunnableConfig): Promise<T>;
27
+ private isSendInput;
28
+ private isMessagesState;
21
29
  }
22
30
  export declare function toolsCondition<T extends string>(state: BaseMessage[] | typeof MessagesAnnotation.State, toolNode: T, invokedToolIds?: Set<string>): T | typeof END;
@@ -566,6 +566,8 @@ export type ProcessSourcesFields = {
566
566
  news: boolean;
567
567
  proMode: boolean;
568
568
  onGetHighlights: SearchToolConfig['onGetHighlights'];
569
+ /** Skip scraping if content was already extracted directly (e.g., direct URL extraction) */
570
+ skipScraping?: boolean;
569
571
  };
570
572
  export type SearchToolSchema = z.ZodObject<{
571
573
  query: z.ZodString;
@@ -1,6 +1,4 @@
1
- import { ChatOllama } from '@langchain/ollama';
2
1
  import { ChatMistralAI } from '@langchain/mistralai';
3
- import { ChatBedrockConverse } from '@langchain/aws';
4
2
  import type { BindToolsInput, BaseChatModelParams } from '@langchain/core/language_models/chat_models';
5
3
  import type { OpenAIChatInput, ChatOpenAIFields, AzureOpenAIInput, ClientOptions as OAIClientOptions } from '@langchain/openai';
6
4
  import type { GoogleGenerativeAIChatInput } from '@langchain/google-genai';
@@ -14,11 +12,11 @@ import type { RequestOptions } from '@google/generative-ai';
14
12
  import type { StructuredTool } from '@langchain/core/tools';
15
13
  import type { AnthropicInput } from '@langchain/anthropic';
16
14
  import type { Runnable } from '@langchain/core/runnables';
17
- import type { ChatOllamaInput } from '@langchain/ollama';
18
15
  import type { OpenAI as OpenAIClient } from 'openai';
19
16
  import type { ChatXAIInput } from '@langchain/xai';
20
17
  import { AzureChatOpenAI, ChatDeepSeek, ChatOpenAI, ChatXAI } from '@/llm/openai';
21
18
  import { CustomChatGoogleGenerativeAI } from '@/llm/google';
19
+ import { CustomChatBedrockConverse } from '@/llm/bedrock';
22
20
  import { CustomAnthropic } from '@/llm/anthropic';
23
21
  import { ChatOpenRouter } from '@/llm/openrouter';
24
22
  import { ChatVertexAI } from '@/llm/vertexai';
@@ -39,7 +37,6 @@ export type AnthropicReasoning = {
39
37
  thinkingBudget?: number;
40
38
  };
41
39
  export type OpenAIClientOptions = ChatOpenAIFields;
42
- export type OllamaClientOptions = ChatOllamaInput;
43
40
  export type AnthropicClientOptions = AnthropicInput;
44
41
  export type MistralAIClientOptions = ChatMistralAIInput;
45
42
  export type VertexAIClientOptions = ChatVertexAIInput & {
@@ -57,7 +54,7 @@ export type GoogleClientOptions = GoogleGenerativeAIChatInput & {
57
54
  };
58
55
  export type DeepSeekClientOptions = ChatDeepSeekCallOptions;
59
56
  export type XAIClientOptions = ChatXAIInput;
60
- export type ClientOptions = OpenAIClientOptions | AzureClientOptions | OllamaClientOptions | AnthropicClientOptions | MistralAIClientOptions | VertexAIClientOptions | BedrockConverseClientOptions | GoogleClientOptions | DeepSeekClientOptions | XAIClientOptions;
57
+ export type ClientOptions = OpenAIClientOptions | AzureClientOptions | AnthropicClientOptions | MistralAIClientOptions | VertexAIClientOptions | BedrockConverseClientOptions | GoogleClientOptions | DeepSeekClientOptions | XAIClientOptions;
61
58
  export type SharedLLMConfig = {
62
59
  provider: Providers;
63
60
  _lc_stream_delay?: number;
@@ -72,7 +69,6 @@ export type LLMConfig = SharedLLMConfig & ClientOptions & {
72
69
  export type ProviderOptionsMap = {
73
70
  [Providers.AZURE]: AzureClientOptions;
74
71
  [Providers.OPENAI]: OpenAIClientOptions;
75
- [Providers.OLLAMA]: OllamaClientOptions;
76
72
  [Providers.GOOGLE]: GoogleClientOptions;
77
73
  [Providers.VERTEXAI]: VertexAIClientOptions;
78
74
  [Providers.DEEPSEEK]: DeepSeekClientOptions;
@@ -86,7 +82,6 @@ export type ProviderOptionsMap = {
86
82
  export type ChatModelMap = {
87
83
  [Providers.XAI]: ChatXAI;
88
84
  [Providers.OPENAI]: ChatOpenAI;
89
- [Providers.OLLAMA]: ChatOllama;
90
85
  [Providers.AZURE]: AzureChatOpenAI;
91
86
  [Providers.DEEPSEEK]: ChatDeepSeek;
92
87
  [Providers.VERTEXAI]: ChatVertexAI;
@@ -94,7 +89,7 @@ export type ChatModelMap = {
94
89
  [Providers.MISTRALAI]: ChatMistralAI;
95
90
  [Providers.MISTRAL]: ChatMistralAI;
96
91
  [Providers.OPENROUTER]: ChatOpenRouter;
97
- [Providers.BEDROCK]: ChatBedrockConverse;
92
+ [Providers.BEDROCK]: CustomChatBedrockConverse;
98
93
  [Providers.GOOGLE]: CustomChatGoogleGenerativeAI;
99
94
  };
100
95
  export type ChatModelConstructorMap = {
@@ -24,7 +24,7 @@ export type ToolNodeOptions = {
24
24
  handleToolErrors?: boolean;
25
25
  loadRuntimeTools?: ToolRefGenerator;
26
26
  toolCallStepIds?: Map<string, string>;
27
- errorHandler?: (data: ToolErrorData, metadata?: Record<string, unknown>) => void;
27
+ errorHandler?: (data: ToolErrorData, metadata?: Record<string, unknown>) => Promise<void>;
28
28
  };
29
29
  export type ToolNodeConstructorParams = ToolRefs & ToolNodeOptions;
30
30
  export type ToolEndEvent = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "illuma-agents",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "main": "./dist/cjs/main.cjs",
5
5
  "module": "./dist/esm/main.mjs",
6
6
  "types": "./dist/types/index.d.ts",
@@ -15,6 +15,12 @@
15
15
  "description": "Illuma AI Agents Library",
16
16
  "author": "Varun Muppidi",
17
17
  "license": "MIT",
18
+ "licenses": [
19
+ {
20
+ "type": "MIT",
21
+ "url": "https://github.com/danny-avila/agents/blob/main/LICENSE"
22
+ }
23
+ ],
18
24
  "packageManager": "npm@10.5.2",
19
25
  "engines": {
20
26
  "node": ">=14.0.0"
@@ -28,7 +34,7 @@
28
34
  "scripts": {
29
35
  "prepare": "node husky-setup.js",
30
36
  "prepublishOnly": "npm run build",
31
- "build": "cross-env NODE_ENV=production rollup -c && tsc -p tsconfig.build.json",
37
+ "build": "set NODE_ENV=production && rollup -c && tsc -p tsconfig.build.json",
32
38
  "build:dev": "rollup -c",
33
39
  "start": "node dist/esm/main.js",
34
40
  "clean": "node ./config/clean.js",
@@ -48,6 +54,8 @@
48
54
  "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
55
  "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
56
  "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'",
57
+ "ant_web_search_edge_case": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/ant_web_search_edge_case.ts --name 'Jo' --location 'New York, NY'",
58
+ "ant_web_search_error_edge_case": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/ant_web_search_error_edge_case.ts --name 'Jo' --location 'New York, NY'",
51
59
  "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
60
  "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
61
  "multi-agent-test": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/multi-agent-test.ts",
@@ -98,7 +106,6 @@
98
106
  "@langchain/google-vertexai": "^0.2.18",
99
107
  "@langchain/langgraph": "^0.4.9",
100
108
  "@langchain/mistralai": "^0.2.1",
101
- "@langchain/ollama": "^0.2.3",
102
109
  "@langchain/openai": "0.5.18",
103
110
  "@langchain/textsplitters": "^0.1.0",
104
111
  "@langchain/xai": "^0.0.3",
@@ -125,27 +132,24 @@
125
132
  "@rollup/plugin-commonjs": "^28.0.3",
126
133
  "@rollup/plugin-json": "^6.1.0",
127
134
  "@rollup/plugin-node-resolve": "^15.2.3",
128
- "@rollup/plugin-terser": "^0.4.4",
129
135
  "@rollup/plugin-typescript": "^12.1.2",
130
136
  "@swc/core": "^1.6.13",
131
- "@types/jest": "^29.5.14",
137
+ "@types/jest": "^30.0.0",
132
138
  "@types/node": "^20.14.11",
133
139
  "@types/node-fetch": "^2.6.13",
134
140
  "@types/yargs-parser": "^21.0.3",
135
141
  "@typescript-eslint/eslint-plugin": "^8.24.0",
136
142
  "@typescript-eslint/parser": "^8.24.0",
137
- "cross-env": "^10.1.0",
138
- "eslint": "^9.31.0",
143
+ "eslint": "^9.39.1",
139
144
  "eslint-import-resolver-typescript": "^3.7.0",
140
145
  "eslint-plugin-import": "^2.31.0",
141
146
  "husky": "^9.1.7",
142
- "jest": "^29.7.0",
147
+ "jest": "^30.2.0",
143
148
  "lint-staged": "^15.2.7",
144
- "prettier": "^3.5.1",
149
+ "prettier": "^3.6.2",
145
150
  "rollup": "^4.34.6",
146
151
  "rollup-plugin-cleandir": "^2.0.0",
147
- "rollup-plugin-obfuscator": "^1.1.0",
148
- "ts-jest": "^29.3.1",
152
+ "ts-jest": "^29.4.5",
149
153
  "ts-node": "^10.9.2",
150
154
  "tsc-alias": "^1.8.10",
151
155
  "tsconfig-paths": "^4.2.0",
@@ -77,7 +77,6 @@ export enum Providers {
77
77
  ANTHROPIC = 'anthropic',
78
78
  MISTRALAI = 'mistralai',
79
79
  MISTRAL = 'mistral',
80
- OLLAMA = 'ollama',
81
80
  GOOGLE = 'google',
82
81
  AZURE = 'azureOpenAI',
83
82
  DEEPSEEK = 'deepseek',
@@ -173,5 +172,5 @@ export enum TitleMethod {
173
172
 
174
173
  export enum EnvVar {
175
174
  CODE_API_KEY = 'CODE_EXECUTOR_API_KEY',
176
- CODE_BASEURL = 'CODE_EXECUTOR_API_BASEURL',
175
+ CODE_BASEURL = 'CODE_EXECUTOR_BASEURL',
177
176
  }
@@ -1,2 +1,2 @@
1
- // src/common/index.ts
1
+ // src/common/index.ts
2
2
  export * from './enum';
@@ -1,22 +1,22 @@
1
- import { NodeSDK } from '@opentelemetry/sdk-node';
2
- import { LangfuseSpanProcessor } from '@langfuse/otel';
3
- import { isPresent } from '@/utils/misc';
4
-
5
- if (
6
- isPresent(process.env.LANGFUSE_SECRET_KEY) &&
7
- isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&
8
- isPresent(process.env.LANGFUSE_BASE_URL)
9
- ) {
10
- const langfuseSpanProcessor = new LangfuseSpanProcessor({
11
- publicKey: process.env.LANGFUSE_PUBLIC_KEY,
12
- secretKey: process.env.LANGFUSE_SECRET_KEY,
13
- baseUrl: process.env.LANGFUSE_BASE_URL,
14
- environment: process.env.NODE_ENV ?? 'development',
15
- });
16
-
17
- const sdk = new NodeSDK({
18
- spanProcessors: [langfuseSpanProcessor],
19
- });
20
-
21
- sdk.start();
22
- }
1
+ import { NodeSDK } from '@opentelemetry/sdk-node';
2
+ import { LangfuseSpanProcessor } from '@langfuse/otel';
3
+ import { isPresent } from '@/utils/misc';
4
+
5
+ if (
6
+ isPresent(process.env.LANGFUSE_SECRET_KEY) &&
7
+ isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&
8
+ isPresent(process.env.LANGFUSE_BASE_URL)
9
+ ) {
10
+ const langfuseSpanProcessor = new LangfuseSpanProcessor({
11
+ publicKey: process.env.LANGFUSE_PUBLIC_KEY,
12
+ secretKey: process.env.LANGFUSE_SECRET_KEY,
13
+ baseUrl: process.env.LANGFUSE_BASE_URL,
14
+ environment: process.env.NODE_ENV ?? 'development',
15
+ });
16
+
17
+ const sdk = new NodeSDK({
18
+ spanProcessors: [langfuseSpanProcessor],
19
+ });
20
+
21
+ sdk.start();
22
+ }