illuma-agents 1.0.8 → 1.0.10

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 (250) 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/events.cjs +11 -0
  5. package/dist/cjs/events.cjs.map +1 -1
  6. package/dist/cjs/graphs/Graph.cjs +2 -1
  7. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  8. package/dist/cjs/instrumentation.cjs +3 -1
  9. package/dist/cjs/instrumentation.cjs.map +1 -1
  10. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  11. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +79 -2
  12. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  13. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
  14. package/dist/cjs/llm/bedrock/index.cjs +99 -0
  15. package/dist/cjs/llm/bedrock/index.cjs.map +1 -0
  16. package/dist/cjs/llm/fake.cjs.map +1 -1
  17. package/dist/cjs/llm/openai/index.cjs +102 -0
  18. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  19. package/dist/cjs/llm/openai/utils/index.cjs +87 -1
  20. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  21. package/dist/cjs/llm/openrouter/index.cjs +175 -1
  22. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  23. package/dist/cjs/llm/providers.cjs +13 -16
  24. package/dist/cjs/llm/providers.cjs.map +1 -1
  25. package/dist/cjs/llm/text.cjs.map +1 -1
  26. package/dist/cjs/messages/core.cjs +14 -14
  27. package/dist/cjs/messages/core.cjs.map +1 -1
  28. package/dist/cjs/messages/ids.cjs.map +1 -1
  29. package/dist/cjs/messages/prune.cjs.map +1 -1
  30. package/dist/cjs/run.cjs +18 -1
  31. package/dist/cjs/run.cjs.map +1 -1
  32. package/dist/cjs/splitStream.cjs.map +1 -1
  33. package/dist/cjs/stream.cjs +24 -1
  34. package/dist/cjs/stream.cjs.map +1 -1
  35. package/dist/cjs/tools/ToolNode.cjs +20 -1
  36. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  37. package/dist/cjs/tools/handlers.cjs +29 -25
  38. package/dist/cjs/tools/handlers.cjs.map +1 -1
  39. package/dist/cjs/tools/search/anthropic.cjs.map +1 -1
  40. package/dist/cjs/tools/search/content.cjs.map +1 -1
  41. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  42. package/dist/cjs/tools/search/format.cjs.map +1 -1
  43. package/dist/cjs/tools/search/highlights.cjs.map +1 -1
  44. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  45. package/dist/cjs/tools/search/schema.cjs +27 -25
  46. package/dist/cjs/tools/search/schema.cjs.map +1 -1
  47. package/dist/cjs/tools/search/search.cjs +6 -1
  48. package/dist/cjs/tools/search/search.cjs.map +1 -1
  49. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
  50. package/dist/cjs/tools/search/tool.cjs +182 -35
  51. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  52. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  53. package/dist/cjs/utils/graph.cjs.map +1 -1
  54. package/dist/cjs/utils/llm.cjs +0 -1
  55. package/dist/cjs/utils/llm.cjs.map +1 -1
  56. package/dist/cjs/utils/misc.cjs.map +1 -1
  57. package/dist/cjs/utils/run.cjs.map +1 -1
  58. package/dist/cjs/utils/title.cjs +7 -7
  59. package/dist/cjs/utils/title.cjs.map +1 -1
  60. package/dist/esm/common/enum.mjs +1 -2
  61. package/dist/esm/common/enum.mjs.map +1 -1
  62. package/dist/esm/events.mjs +11 -0
  63. package/dist/esm/events.mjs.map +1 -1
  64. package/dist/esm/graphs/Graph.mjs +2 -1
  65. package/dist/esm/graphs/Graph.mjs.map +1 -1
  66. package/dist/esm/instrumentation.mjs +3 -1
  67. package/dist/esm/instrumentation.mjs.map +1 -1
  68. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  69. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +79 -2
  70. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  71. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
  72. package/dist/esm/llm/bedrock/index.mjs +97 -0
  73. package/dist/esm/llm/bedrock/index.mjs.map +1 -0
  74. package/dist/esm/llm/fake.mjs.map +1 -1
  75. package/dist/esm/llm/openai/index.mjs +103 -1
  76. package/dist/esm/llm/openai/index.mjs.map +1 -1
  77. package/dist/esm/llm/openai/utils/index.mjs +88 -2
  78. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  79. package/dist/esm/llm/openrouter/index.mjs +175 -1
  80. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  81. package/dist/esm/llm/providers.mjs +2 -5
  82. package/dist/esm/llm/providers.mjs.map +1 -1
  83. package/dist/esm/llm/text.mjs.map +1 -1
  84. package/dist/esm/messages/core.mjs +14 -14
  85. package/dist/esm/messages/core.mjs.map +1 -1
  86. package/dist/esm/messages/ids.mjs.map +1 -1
  87. package/dist/esm/messages/prune.mjs.map +1 -1
  88. package/dist/esm/run.mjs +18 -1
  89. package/dist/esm/run.mjs.map +1 -1
  90. package/dist/esm/splitStream.mjs.map +1 -1
  91. package/dist/esm/stream.mjs +24 -1
  92. package/dist/esm/stream.mjs.map +1 -1
  93. package/dist/esm/tools/ToolNode.mjs +20 -1
  94. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  95. package/dist/esm/tools/handlers.mjs +30 -26
  96. package/dist/esm/tools/handlers.mjs.map +1 -1
  97. package/dist/esm/tools/search/anthropic.mjs.map +1 -1
  98. package/dist/esm/tools/search/content.mjs.map +1 -1
  99. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  100. package/dist/esm/tools/search/format.mjs.map +1 -1
  101. package/dist/esm/tools/search/highlights.mjs.map +1 -1
  102. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  103. package/dist/esm/tools/search/schema.mjs +27 -25
  104. package/dist/esm/tools/search/schema.mjs.map +1 -1
  105. package/dist/esm/tools/search/search.mjs +6 -1
  106. package/dist/esm/tools/search/search.mjs.map +1 -1
  107. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
  108. package/dist/esm/tools/search/tool.mjs +182 -35
  109. package/dist/esm/tools/search/tool.mjs.map +1 -1
  110. package/dist/esm/tools/search/utils.mjs.map +1 -1
  111. package/dist/esm/utils/graph.mjs.map +1 -1
  112. package/dist/esm/utils/llm.mjs +0 -1
  113. package/dist/esm/utils/llm.mjs.map +1 -1
  114. package/dist/esm/utils/misc.mjs.map +1 -1
  115. package/dist/esm/utils/run.mjs.map +1 -1
  116. package/dist/esm/utils/title.mjs +7 -7
  117. package/dist/esm/utils/title.mjs.map +1 -1
  118. package/dist/types/common/enum.d.ts +1 -2
  119. package/dist/types/llm/bedrock/index.d.ts +36 -0
  120. package/dist/types/llm/openai/index.d.ts +1 -0
  121. package/dist/types/llm/openai/utils/index.d.ts +10 -1
  122. package/dist/types/llm/openrouter/index.d.ts +4 -1
  123. package/dist/types/tools/search/types.d.ts +2 -0
  124. package/dist/types/types/llm.d.ts +3 -8
  125. package/package.json +16 -12
  126. package/src/common/enum.ts +1 -2
  127. package/src/common/index.ts +1 -1
  128. package/src/events.ts +11 -0
  129. package/src/graphs/Graph.ts +2 -1
  130. package/src/instrumentation.ts +25 -22
  131. package/src/llm/anthropic/llm.spec.ts +1442 -1442
  132. package/src/llm/anthropic/types.ts +140 -140
  133. package/src/llm/anthropic/utils/message_inputs.ts +757 -660
  134. package/src/llm/anthropic/utils/output_parsers.ts +133 -133
  135. package/src/llm/anthropic/utils/tools.ts +29 -29
  136. package/src/llm/bedrock/index.ts +128 -0
  137. package/src/llm/fake.ts +133 -133
  138. package/src/llm/google/llm.spec.ts +3 -1
  139. package/src/llm/google/utils/tools.ts +160 -160
  140. package/src/llm/openai/index.ts +126 -0
  141. package/src/llm/openai/types.ts +24 -24
  142. package/src/llm/openai/utils/index.ts +116 -1
  143. package/src/llm/openai/utils/isReasoningModel.test.ts +90 -90
  144. package/src/llm/openrouter/index.ts +222 -1
  145. package/src/llm/providers.ts +2 -7
  146. package/src/llm/text.ts +94 -94
  147. package/src/messages/core.ts +463 -463
  148. package/src/messages/formatAgentMessages.tools.test.ts +400 -400
  149. package/src/messages/formatMessage.test.ts +693 -693
  150. package/src/messages/ids.ts +26 -26
  151. package/src/messages/prune.ts +567 -567
  152. package/src/messages/shiftIndexTokenCountMap.test.ts +81 -81
  153. package/src/mockStream.ts +98 -98
  154. package/src/prompts/collab.ts +5 -5
  155. package/src/prompts/index.ts +1 -1
  156. package/src/prompts/taskmanager.ts +61 -61
  157. package/src/run.ts +22 -4
  158. package/src/scripts/ant_web_search_edge_case.ts +162 -0
  159. package/src/scripts/ant_web_search_error_edge_case.ts +148 -0
  160. package/src/scripts/args.ts +48 -48
  161. package/src/scripts/caching.ts +123 -123
  162. package/src/scripts/code_exec_files.ts +193 -193
  163. package/src/scripts/empty_input.ts +137 -137
  164. package/src/scripts/memory.ts +97 -97
  165. package/src/scripts/test-tools-before-handoff.ts +1 -5
  166. package/src/scripts/thinking.ts +149 -149
  167. package/src/scripts/tools.ts +1 -4
  168. package/src/specs/anthropic.simple.test.ts +67 -0
  169. package/src/specs/spec.utils.ts +3 -3
  170. package/src/specs/token-distribution-edge-case.test.ts +316 -316
  171. package/src/specs/tool-error.test.ts +193 -193
  172. package/src/splitStream.test.ts +691 -691
  173. package/src/splitStream.ts +234 -234
  174. package/src/stream.test.ts +94 -94
  175. package/src/stream.ts +30 -1
  176. package/src/tools/ToolNode.ts +24 -1
  177. package/src/tools/handlers.ts +32 -28
  178. package/src/tools/search/anthropic.ts +51 -51
  179. package/src/tools/search/content.test.ts +173 -173
  180. package/src/tools/search/content.ts +147 -147
  181. package/src/tools/search/direct-url.test.ts +530 -0
  182. package/src/tools/search/firecrawl.ts +210 -210
  183. package/src/tools/search/format.ts +250 -250
  184. package/src/tools/search/highlights.ts +320 -320
  185. package/src/tools/search/index.ts +2 -2
  186. package/src/tools/search/jina-reranker.test.ts +126 -126
  187. package/src/tools/search/output.md +2775 -2775
  188. package/src/tools/search/rerankers.ts +242 -242
  189. package/src/tools/search/schema.ts +65 -63
  190. package/src/tools/search/search.ts +766 -759
  191. package/src/tools/search/serper-scraper.ts +155 -155
  192. package/src/tools/search/test.html +883 -883
  193. package/src/tools/search/test.md +642 -642
  194. package/src/tools/search/test.ts +159 -159
  195. package/src/tools/search/tool.ts +641 -471
  196. package/src/tools/search/types.ts +689 -687
  197. package/src/tools/search/utils.ts +79 -79
  198. package/src/types/index.ts +6 -6
  199. package/src/types/llm.ts +2 -8
  200. package/src/utils/graph.ts +10 -10
  201. package/src/utils/llm.ts +26 -27
  202. package/src/utils/llmConfig.ts +13 -5
  203. package/src/utils/logging.ts +48 -48
  204. package/src/utils/misc.ts +57 -57
  205. package/src/utils/run.ts +100 -100
  206. package/src/utils/title.ts +165 -165
  207. package/dist/cjs/llm/ollama/index.cjs +0 -70
  208. package/dist/cjs/llm/ollama/index.cjs.map +0 -1
  209. package/dist/cjs/llm/ollama/utils.cjs +0 -158
  210. package/dist/cjs/llm/ollama/utils.cjs.map +0 -1
  211. package/dist/esm/llm/ollama/index.mjs +0 -68
  212. package/dist/esm/llm/ollama/index.mjs.map +0 -1
  213. package/dist/esm/llm/ollama/utils.mjs +0 -155
  214. package/dist/esm/llm/ollama/utils.mjs.map +0 -1
  215. package/dist/types/llm/ollama/index.d.ts +0 -8
  216. package/dist/types/llm/ollama/utils.d.ts +0 -7
  217. package/src/llm/ollama/index.ts +0 -92
  218. package/src/llm/ollama/utils.ts +0 -193
  219. package/src/proto/CollabGraph.ts +0 -269
  220. package/src/proto/TaskManager.ts +0 -243
  221. package/src/proto/collab.ts +0 -200
  222. package/src/proto/collab_design.ts +0 -184
  223. package/src/proto/collab_design_v2.ts +0 -224
  224. package/src/proto/collab_design_v3.ts +0 -255
  225. package/src/proto/collab_design_v4.ts +0 -220
  226. package/src/proto/collab_design_v5.ts +0 -251
  227. package/src/proto/collab_graph.ts +0 -181
  228. package/src/proto/collab_original.ts +0 -123
  229. package/src/proto/example.ts +0 -93
  230. package/src/proto/example_new.ts +0 -68
  231. package/src/proto/example_old.ts +0 -201
  232. package/src/proto/example_test.ts +0 -152
  233. package/src/proto/example_test_anthropic.ts +0 -100
  234. package/src/proto/log_stream.ts +0 -202
  235. package/src/proto/main_collab_community_event.ts +0 -133
  236. package/src/proto/main_collab_design_v2.ts +0 -96
  237. package/src/proto/main_collab_design_v4.ts +0 -100
  238. package/src/proto/main_collab_design_v5.ts +0 -135
  239. package/src/proto/main_collab_global_analysis.ts +0 -122
  240. package/src/proto/main_collab_hackathon_event.ts +0 -153
  241. package/src/proto/main_collab_space_mission.ts +0 -153
  242. package/src/proto/main_philosophy.ts +0 -210
  243. package/src/proto/original_script.ts +0 -126
  244. package/src/proto/standard.ts +0 -100
  245. package/src/proto/stream.ts +0 -56
  246. package/src/proto/tasks.ts +0 -118
  247. package/src/proto/tools/global_analysis_tools.ts +0 -86
  248. package/src/proto/tools/space_mission_tools.ts +0 -60
  249. package/src/proto/vertexai.ts +0 -54
  250. package/src/scripts/image.ts +0 -178
package/src/utils/run.ts CHANGED
@@ -1,101 +1,101 @@
1
- import { CallbackManagerForChainRun } from '@langchain/core/callbacks/manager';
2
- import {
3
- mergeConfigs,
4
- patchConfig,
5
- Runnable,
6
- RunnableConfig,
7
- } from '@langchain/core/runnables';
8
- import { AsyncLocalStorageProviderSingleton } from '@langchain/core/singletons';
9
-
10
- /**
11
- * Delays the execution for a specified number of milliseconds.
12
- *
13
- * @param {number} ms - The number of milliseconds to delay.
14
- * @return {Promise<void>} A promise that resolves after the specified delay.
15
- */
16
- export function sleep(ms: number): Promise<void> {
17
- return new Promise((resolve) => setTimeout(resolve, ms));
18
- }
19
-
20
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
- export interface RunnableCallableArgs extends Partial<any> {
22
- name?: string;
23
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
- func: (...args: any[]) => any;
25
- tags?: string[];
26
- trace?: boolean;
27
- recurse?: boolean;
28
- }
29
-
30
- export class RunnableCallable<I = unknown, O = unknown> extends Runnable<I, O> {
31
- lc_namespace: string[] = ['langgraph'];
32
-
33
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
- func: (...args: any[]) => any;
35
-
36
- tags?: string[];
37
-
38
- config?: RunnableConfig;
39
-
40
- trace: boolean = true;
41
-
42
- recurse: boolean = true;
43
-
44
- constructor(fields: RunnableCallableArgs) {
45
- super();
46
- this.name = fields.name ?? fields.func.name;
47
- this.func = fields.func;
48
- this.config = fields.tags ? { tags: fields.tags } : undefined;
49
- this.trace = fields.trace ?? this.trace;
50
- this.recurse = fields.recurse ?? this.recurse;
51
- }
52
-
53
- protected async _tracedInvoke(
54
- input: I,
55
- config?: Partial<RunnableConfig>,
56
- runManager?: CallbackManagerForChainRun
57
- ): Promise<O> {
58
- return new Promise<O>((resolve, reject) => {
59
- const childConfig = patchConfig(config, {
60
- callbacks: runManager?.getChild(),
61
- });
62
- void AsyncLocalStorageProviderSingleton.runWithConfig(
63
- childConfig,
64
- async () => {
65
- try {
66
- const output = await this.func(input, childConfig);
67
- resolve(output);
68
- } catch (e) {
69
- reject(e);
70
- }
71
- }
72
- );
73
- });
74
- }
75
-
76
- async invoke(
77
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
78
- input: any,
79
- options?: Partial<RunnableConfig> | undefined
80
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
81
- ): Promise<any> {
82
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
- let returnValue: any;
84
-
85
- if (this.trace) {
86
- returnValue = await this._callWithConfig(
87
- this._tracedInvoke,
88
- input,
89
- mergeConfigs(this.config, options)
90
- );
91
- } else {
92
- returnValue = await this.func(input, mergeConfigs(this.config, options));
93
- }
94
-
95
- if (Runnable.isRunnable(returnValue) && this.recurse) {
96
- return await returnValue.invoke(input, options);
97
- }
98
-
99
- return returnValue;
100
- }
1
+ import { CallbackManagerForChainRun } from '@langchain/core/callbacks/manager';
2
+ import {
3
+ mergeConfigs,
4
+ patchConfig,
5
+ Runnable,
6
+ RunnableConfig,
7
+ } from '@langchain/core/runnables';
8
+ import { AsyncLocalStorageProviderSingleton } from '@langchain/core/singletons';
9
+
10
+ /**
11
+ * Delays the execution for a specified number of milliseconds.
12
+ *
13
+ * @param {number} ms - The number of milliseconds to delay.
14
+ * @return {Promise<void>} A promise that resolves after the specified delay.
15
+ */
16
+ export function sleep(ms: number): Promise<void> {
17
+ return new Promise((resolve) => setTimeout(resolve, ms));
18
+ }
19
+
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ export interface RunnableCallableArgs extends Partial<any> {
22
+ name?: string;
23
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
+ func: (...args: any[]) => any;
25
+ tags?: string[];
26
+ trace?: boolean;
27
+ recurse?: boolean;
28
+ }
29
+
30
+ export class RunnableCallable<I = unknown, O = unknown> extends Runnable<I, O> {
31
+ lc_namespace: string[] = ['langgraph'];
32
+
33
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
+ func: (...args: any[]) => any;
35
+
36
+ tags?: string[];
37
+
38
+ config?: RunnableConfig;
39
+
40
+ trace: boolean = true;
41
+
42
+ recurse: boolean = true;
43
+
44
+ constructor(fields: RunnableCallableArgs) {
45
+ super();
46
+ this.name = fields.name ?? fields.func.name;
47
+ this.func = fields.func;
48
+ this.config = fields.tags ? { tags: fields.tags } : undefined;
49
+ this.trace = fields.trace ?? this.trace;
50
+ this.recurse = fields.recurse ?? this.recurse;
51
+ }
52
+
53
+ protected async _tracedInvoke(
54
+ input: I,
55
+ config?: Partial<RunnableConfig>,
56
+ runManager?: CallbackManagerForChainRun
57
+ ): Promise<O> {
58
+ return new Promise<O>((resolve, reject) => {
59
+ const childConfig = patchConfig(config, {
60
+ callbacks: runManager?.getChild(),
61
+ });
62
+ void AsyncLocalStorageProviderSingleton.runWithConfig(
63
+ childConfig,
64
+ async () => {
65
+ try {
66
+ const output = await this.func(input, childConfig);
67
+ resolve(output);
68
+ } catch (e) {
69
+ reject(e);
70
+ }
71
+ }
72
+ );
73
+ });
74
+ }
75
+
76
+ async invoke(
77
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
78
+ input: any,
79
+ options?: Partial<RunnableConfig> | undefined
80
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
81
+ ): Promise<any> {
82
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ let returnValue: any;
84
+
85
+ if (this.trace) {
86
+ returnValue = await this._callWithConfig(
87
+ this._tracedInvoke,
88
+ input,
89
+ mergeConfigs(this.config, options)
90
+ );
91
+ } else {
92
+ returnValue = await this.func(input, mergeConfigs(this.config, options));
93
+ }
94
+
95
+ if (Runnable.isRunnable(returnValue) && this.recurse) {
96
+ return await returnValue.invoke(input, options);
97
+ }
98
+
99
+ return returnValue;
100
+ }
101
101
  }
@@ -1,165 +1,165 @@
1
- import { z } from 'zod';
2
- import { ChatPromptTemplate } from '@langchain/core/prompts';
3
- import { RunnableLambda, RunnableSequence } from '@langchain/core/runnables';
4
- import type { Runnable, RunnableConfig } from '@langchain/core/runnables';
5
- import type { AIMessage } from '@langchain/core/messages';
6
- import type * as t from '@/types';
7
- import { ContentTypes } from '@/common';
8
-
9
- const defaultTitlePrompt = `Analyze this conversation and provide:
10
- 1. The detected language of the conversation
11
- 2. A concise title in the detected language (5 words or less, no punctuation or quotation)
12
-
13
- {convo}`;
14
-
15
- const titleSchema = z.object({
16
- title: z
17
- .string()
18
- .describe(
19
- 'A concise title for the conversation in 5 words or less, without punctuation or quotation'
20
- ),
21
- });
22
-
23
- const combinedSchema = z.object({
24
- language: z.string().describe('The detected language of the conversation'),
25
- title: z
26
- .string()
27
- .describe(
28
- 'A concise title for the conversation in 5 words or less, without punctuation or quotation'
29
- ),
30
- });
31
-
32
- export const createTitleRunnable = async (
33
- model: t.ChatModelInstance,
34
- _titlePrompt?: string
35
- ): Promise<Runnable> => {
36
- // Disabled since this works fine
37
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
38
- /* @ts-ignore */
39
- const titleLLM = model.withStructuredOutput(titleSchema);
40
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
41
- /* @ts-ignore */
42
- const combinedLLM = model.withStructuredOutput(combinedSchema);
43
-
44
- const titlePrompt = ChatPromptTemplate.fromTemplate(
45
- _titlePrompt ?? defaultTitlePrompt
46
- ).withConfig({ runName: 'TitlePrompt' });
47
-
48
- const titleOnlyInnerChain = RunnableSequence.from([titlePrompt, titleLLM]);
49
- const combinedInnerChain = RunnableSequence.from([titlePrompt, combinedLLM]);
50
-
51
- /** Wrap titleOnlyChain in RunnableLambda to create parent span */
52
- const titleOnlyChain = new RunnableLambda({
53
- func: async (
54
- input: { convo: string },
55
- config?: Partial<RunnableConfig>
56
- ): Promise<{ title: string }> => {
57
- return await titleOnlyInnerChain.invoke(input, config);
58
- },
59
- }).withConfig({ runName: 'TitleOnlyChain' });
60
-
61
- /** Wrap combinedChain in RunnableLambda to create parent span */
62
- const combinedChain = new RunnableLambda({
63
- func: async (
64
- input: { convo: string },
65
- config?: Partial<RunnableConfig>
66
- ): Promise<{ language: string; title: string }> => {
67
- return await combinedInnerChain.invoke(input, config);
68
- },
69
- }).withConfig({ runName: 'TitleLanguageChain' });
70
-
71
- /** Runnable to add default values if needed */
72
- const addDefaults = new RunnableLambda({
73
- func: (
74
- result: { language: string; title: string } | undefined
75
- ): { language: string; title: string } => ({
76
- language: result?.language ?? 'English',
77
- title: result?.title ?? '',
78
- }),
79
- }).withConfig({ runName: 'AddDefaults' });
80
-
81
- const combinedChainInner = RunnableSequence.from([
82
- combinedChain,
83
- addDefaults,
84
- ]);
85
-
86
- /** Wrap combinedChainWithDefaults in RunnableLambda to create parent span */
87
- const combinedChainWithDefaults = new RunnableLambda({
88
- func: async (
89
- input: { convo: string },
90
- config?: Partial<RunnableConfig>
91
- ): Promise<{ language: string; title: string }> => {
92
- return await combinedChainInner.invoke(input, config);
93
- },
94
- }).withConfig({ runName: 'CombinedChainWithDefaults' });
95
-
96
- return new RunnableLambda({
97
- func: async (
98
- input: {
99
- convo: string;
100
- inputText: string;
101
- skipLanguage: boolean;
102
- },
103
- config?: Partial<RunnableConfig>
104
- ): Promise<{ language: string; title: string } | { title: string }> => {
105
- const invokeInput = { convo: input.convo };
106
-
107
- if (input.skipLanguage) {
108
- return (await titleOnlyChain.invoke(invokeInput, config)) as {
109
- title: string;
110
- };
111
- }
112
-
113
- return await combinedChainWithDefaults.invoke(invokeInput, config);
114
- },
115
- }).withConfig({ runName: 'TitleGenerator' });
116
- };
117
-
118
- const defaultCompletionPrompt = `Provide a concise, 5-word-or-less title for the conversation, using title case conventions. Only return the title itself.
119
-
120
- Conversation:
121
- {convo}`;
122
-
123
- export const createCompletionTitleRunnable = async (
124
- model: t.ChatModelInstance,
125
- titlePrompt?: string
126
- ): Promise<Runnable> => {
127
- const completionPrompt = ChatPromptTemplate.fromTemplate(
128
- titlePrompt ?? defaultCompletionPrompt
129
- ).withConfig({ runName: 'CompletionTitlePrompt' });
130
-
131
- /** Runnable to extract content from model response */
132
- const extractContent = new RunnableLambda({
133
- func: (response: AIMessage): { title: string } => {
134
- let content = '';
135
- if (typeof response.content === 'string') {
136
- content = response.content;
137
- } else if (Array.isArray(response.content)) {
138
- content = response.content
139
- .filter(
140
- (part): part is { type: ContentTypes.TEXT; text: string } =>
141
- part.type === ContentTypes.TEXT
142
- )
143
- .map((part) => part.text)
144
- .join('');
145
- }
146
- return { title: content.trim() };
147
- },
148
- }).withConfig({ runName: 'ExtractTitle' });
149
-
150
- const innerChain = RunnableSequence.from([
151
- completionPrompt,
152
- model,
153
- extractContent,
154
- ]);
155
-
156
- /** Wrap in RunnableLambda to create a parent span for LangFuse */
157
- return new RunnableLambda({
158
- func: async (
159
- input: { convo: string },
160
- config?: Partial<RunnableConfig>
161
- ): Promise<{ title: string }> => {
162
- return await innerChain.invoke(input, config);
163
- },
164
- }).withConfig({ runName: 'CompletionTitleChain' });
165
- };
1
+ import { z } from 'zod';
2
+ import { ChatPromptTemplate } from '@langchain/core/prompts';
3
+ import { RunnableLambda, RunnableSequence } from '@langchain/core/runnables';
4
+ import type { Runnable, RunnableConfig } from '@langchain/core/runnables';
5
+ import type { AIMessage } from '@langchain/core/messages';
6
+ import type * as t from '@/types';
7
+ import { ContentTypes } from '@/common';
8
+
9
+ const defaultTitlePrompt = `Analyze this conversation and provide:
10
+ 1. The detected language of the conversation
11
+ 2. A concise title in the detected language (5 words or less, no punctuation or quotation)
12
+
13
+ {convo}`;
14
+
15
+ const titleSchema = z.object({
16
+ title: z
17
+ .string()
18
+ .describe(
19
+ 'A concise title for the conversation in 5 words or less, without punctuation or quotation'
20
+ ),
21
+ });
22
+
23
+ const combinedSchema = z.object({
24
+ language: z.string().describe('The detected language of the conversation'),
25
+ title: z
26
+ .string()
27
+ .describe(
28
+ 'A concise title for the conversation in 5 words or less, without punctuation or quotation'
29
+ ),
30
+ });
31
+
32
+ export const createTitleRunnable = async (
33
+ model: t.ChatModelInstance,
34
+ _titlePrompt?: string
35
+ ): Promise<Runnable> => {
36
+ // Disabled since this works fine
37
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
38
+ /* @ts-ignore */
39
+ const titleLLM = model.withStructuredOutput(titleSchema);
40
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
41
+ /* @ts-ignore */
42
+ const combinedLLM = model.withStructuredOutput(combinedSchema);
43
+
44
+ const titlePrompt = ChatPromptTemplate.fromTemplate(
45
+ _titlePrompt ?? defaultTitlePrompt
46
+ ).withConfig({ runName: 'TitlePrompt' });
47
+
48
+ const titleOnlyInnerChain = RunnableSequence.from([titlePrompt, titleLLM]);
49
+ const combinedInnerChain = RunnableSequence.from([titlePrompt, combinedLLM]);
50
+
51
+ /** Wrap titleOnlyChain in RunnableLambda to create parent span */
52
+ const titleOnlyChain = new RunnableLambda({
53
+ func: async (
54
+ input: { convo: string },
55
+ config?: Partial<RunnableConfig>
56
+ ): Promise<{ title: string }> => {
57
+ return await titleOnlyInnerChain.invoke(input, config);
58
+ },
59
+ }).withConfig({ runName: 'TitleOnlyChain' });
60
+
61
+ /** Wrap combinedChain in RunnableLambda to create parent span */
62
+ const combinedChain = new RunnableLambda({
63
+ func: async (
64
+ input: { convo: string },
65
+ config?: Partial<RunnableConfig>
66
+ ): Promise<{ language: string; title: string }> => {
67
+ return await combinedInnerChain.invoke(input, config);
68
+ },
69
+ }).withConfig({ runName: 'TitleLanguageChain' });
70
+
71
+ /** Runnable to add default values if needed */
72
+ const addDefaults = new RunnableLambda({
73
+ func: (
74
+ result: { language: string; title: string } | undefined
75
+ ): { language: string; title: string } => ({
76
+ language: result?.language ?? 'English',
77
+ title: result?.title ?? '',
78
+ }),
79
+ }).withConfig({ runName: 'AddDefaults' });
80
+
81
+ const combinedChainInner = RunnableSequence.from([
82
+ combinedChain,
83
+ addDefaults,
84
+ ]);
85
+
86
+ /** Wrap combinedChainWithDefaults in RunnableLambda to create parent span */
87
+ const combinedChainWithDefaults = new RunnableLambda({
88
+ func: async (
89
+ input: { convo: string },
90
+ config?: Partial<RunnableConfig>
91
+ ): Promise<{ language: string; title: string }> => {
92
+ return await combinedChainInner.invoke(input, config);
93
+ },
94
+ }).withConfig({ runName: 'CombinedChainWithDefaults' });
95
+
96
+ return new RunnableLambda({
97
+ func: async (
98
+ input: {
99
+ convo: string;
100
+ inputText: string;
101
+ skipLanguage: boolean;
102
+ },
103
+ config?: Partial<RunnableConfig>
104
+ ): Promise<{ language: string; title: string } | { title: string }> => {
105
+ const invokeInput = { convo: input.convo };
106
+
107
+ if (input.skipLanguage) {
108
+ return (await titleOnlyChain.invoke(invokeInput, config)) as {
109
+ title: string;
110
+ };
111
+ }
112
+
113
+ return await combinedChainWithDefaults.invoke(invokeInput, config);
114
+ },
115
+ }).withConfig({ runName: 'TitleGenerator' });
116
+ };
117
+
118
+ const defaultCompletionPrompt = `Provide a concise, 5-word-or-less title for the conversation, using title case conventions. Only return the title itself.
119
+
120
+ Conversation:
121
+ {convo}`;
122
+
123
+ export const createCompletionTitleRunnable = async (
124
+ model: t.ChatModelInstance,
125
+ titlePrompt?: string
126
+ ): Promise<Runnable> => {
127
+ const completionPrompt = ChatPromptTemplate.fromTemplate(
128
+ titlePrompt ?? defaultCompletionPrompt
129
+ ).withConfig({ runName: 'CompletionTitlePrompt' });
130
+
131
+ /** Runnable to extract content from model response */
132
+ const extractContent = new RunnableLambda({
133
+ func: (response: AIMessage): { title: string } => {
134
+ let content = '';
135
+ if (typeof response.content === 'string') {
136
+ content = response.content;
137
+ } else if (Array.isArray(response.content)) {
138
+ content = response.content
139
+ .filter(
140
+ (part): part is { type: ContentTypes.TEXT; text: string } =>
141
+ part.type === ContentTypes.TEXT
142
+ )
143
+ .map((part) => part.text)
144
+ .join('');
145
+ }
146
+ return { title: content.trim() };
147
+ },
148
+ }).withConfig({ runName: 'ExtractTitle' });
149
+
150
+ const innerChain = RunnableSequence.from([
151
+ completionPrompt,
152
+ model,
153
+ extractContent,
154
+ ]);
155
+
156
+ /** Wrap in RunnableLambda to create a parent span for LangFuse */
157
+ return new RunnableLambda({
158
+ func: async (
159
+ input: { convo: string },
160
+ config?: Partial<RunnableConfig>
161
+ ): Promise<{ title: string }> => {
162
+ return await innerChain.invoke(input, config);
163
+ },
164
+ }).withConfig({ runName: 'CompletionTitleChain' });
165
+ };
@@ -1,70 +0,0 @@
1
- 'use strict';
2
-
3
- var messages = require('@langchain/core/messages');
4
- var outputs = require('@langchain/core/outputs');
5
- var ollama = require('@langchain/ollama');
6
- var utils = require('./utils.cjs');
7
-
8
- class ChatOllama extends ollama.ChatOllama {
9
- static lc_name() {
10
- return 'IllumaOllama';
11
- }
12
- async *_streamResponseChunks(messages$1, options, runManager) {
13
- if (this.checkOrPullModel) {
14
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
15
- // @ts-ignore
16
- if (!(await this.checkModelExistsOnMachine(this.model))) {
17
- await this.pull(this.model, {
18
- logProgress: true,
19
- });
20
- }
21
- }
22
- const params = this.invocationParams(options);
23
- // TODO: remove cast after SDK adds support for tool calls
24
- const ollamaMessages = utils.convertToOllamaMessages(messages$1);
25
- const usageMetadata = {
26
- input_tokens: 0,
27
- output_tokens: 0,
28
- total_tokens: 0,
29
- };
30
- const stream = await this.client.chat({
31
- ...params,
32
- messages: ollamaMessages,
33
- stream: true,
34
- });
35
- let lastMetadata;
36
- for await (const chunk of stream) {
37
- if (options.signal?.aborted === true) {
38
- this.client.abort();
39
- }
40
- const { message: responseMessage, ...rest } = chunk;
41
- usageMetadata.input_tokens += rest.prompt_eval_count ?? 0;
42
- usageMetadata.output_tokens += rest.eval_count ?? 0;
43
- usageMetadata.total_tokens =
44
- usageMetadata.input_tokens + usageMetadata.output_tokens;
45
- lastMetadata = rest;
46
- if (!responseMessage) {
47
- continue;
48
- }
49
- const message = utils.convertOllamaMessagesToLangChain(responseMessage);
50
- const generationChunk = new outputs.ChatGenerationChunk({
51
- text: responseMessage.content || '',
52
- message,
53
- });
54
- yield generationChunk;
55
- await runManager?.handleLLMNewToken(responseMessage.content || '', undefined, undefined, undefined, undefined, { chunk: generationChunk });
56
- }
57
- // Yield the `response_metadata` as the final chunk.
58
- yield new outputs.ChatGenerationChunk({
59
- text: '',
60
- message: new messages.AIMessageChunk({
61
- content: '',
62
- response_metadata: lastMetadata,
63
- usage_metadata: usageMetadata,
64
- }),
65
- });
66
- }
67
- }
68
-
69
- exports.ChatOllama = ChatOllama;
70
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../src/llm/ollama/index.ts"],"sourcesContent":["import { AIMessageChunk } from '@langchain/core/messages';\nimport { ChatGenerationChunk } from '@langchain/core/outputs';\nimport { ChatOllama as BaseChatOllama } from '@langchain/ollama';\nimport { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';\nimport type {\n ChatResponse as OllamaChatResponse,\n Message as OllamaMessage,\n} from 'ollama';\nimport type { UsageMetadata, BaseMessage } from '@langchain/core/messages';\nimport {\n convertOllamaMessagesToLangChain,\n convertToOllamaMessages,\n} from './utils';\n\nexport class ChatOllama extends BaseChatOllama {\n static lc_name(): 'IllumaOllama' {\n return 'IllumaOllama';\n }\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n if (this.checkOrPullModel) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (!((await this.checkModelExistsOnMachine(this.model)) as boolean)) {\n await this.pull(this.model, {\n logProgress: true,\n });\n }\n }\n\n const params = this.invocationParams(options);\n // TODO: remove cast after SDK adds support for tool calls\n const ollamaMessages = convertToOllamaMessages(messages) as OllamaMessage[];\n\n const usageMetadata: UsageMetadata = {\n input_tokens: 0,\n output_tokens: 0,\n total_tokens: 0,\n };\n\n const stream = await this.client.chat({\n ...params,\n messages: ollamaMessages,\n stream: true,\n });\n\n let lastMetadata: Omit<OllamaChatResponse, 'message'> | undefined;\n\n for await (const chunk of stream) {\n if (options.signal?.aborted === true) {\n this.client.abort();\n }\n const { message: responseMessage, ...rest } =\n chunk as Partial<OllamaChatResponse>;\n usageMetadata.input_tokens += rest.prompt_eval_count ?? 0;\n usageMetadata.output_tokens += rest.eval_count ?? 0;\n usageMetadata.total_tokens =\n usageMetadata.input_tokens + usageMetadata.output_tokens;\n lastMetadata = rest as Omit<OllamaChatResponse, 'message'>;\n if (!responseMessage) {\n continue;\n }\n const message = convertOllamaMessagesToLangChain(responseMessage);\n const generationChunk = new ChatGenerationChunk({\n text: responseMessage.content || '',\n message,\n });\n yield generationChunk;\n await runManager?.handleLLMNewToken(\n responseMessage.content || '',\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n\n // Yield the `response_metadata` as the final chunk.\n yield new ChatGenerationChunk({\n text: '',\n message: new AIMessageChunk({\n content: '',\n response_metadata: lastMetadata,\n usage_metadata: usageMetadata,\n }),\n });\n }\n}\n"],"names":["BaseChatOllama","messages","convertToOllamaMessages","convertOllamaMessagesToLangChain","ChatGenerationChunk","AIMessageChunk"],"mappings":";;;;;;;AAcM,MAAO,UAAW,SAAQA,iBAAc,CAAA;AAC5C,IAAA,OAAO,OAAO,GAAA;AACZ,QAAA,OAAO,cAAc;;IAEvB,OAAO,qBAAqB,CAC1BC,UAAuB,EACvB,OAAkC,EAClC,UAAqC,EAAA;AAErC,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;;;AAGzB,YAAA,IAAI,EAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAa,EAAE;AACpE,gBAAA,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AAC1B,oBAAA,WAAW,EAAE,IAAI;AAClB,iBAAA,CAAC;;;QAIN,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;;AAE7C,QAAA,MAAM,cAAc,GAAGC,6BAAuB,CAACD,UAAQ,CAAoB;AAE3E,QAAA,MAAM,aAAa,GAAkB;AACnC,YAAA,YAAY,EAAE,CAAC;AACf,YAAA,aAAa,EAAE,CAAC;AAChB,YAAA,YAAY,EAAE,CAAC;SAChB;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AACpC,YAAA,GAAG,MAAM;AACT,YAAA,QAAQ,EAAE,cAAc;AACxB,YAAA,MAAM,EAAE,IAAI;AACb,SAAA,CAAC;AAEF,QAAA,IAAI,YAA6D;AAEjE,QAAA,WAAW,MAAM,KAAK,IAAI,MAAM,EAAE;YAChC,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE;AACpC,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;;YAErB,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,EAAE,GACzC,KAAoC;YACtC,aAAa,CAAC,YAAY,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC;YACzD,aAAa,CAAC,aAAa,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC;AACnD,YAAA,aAAa,CAAC,YAAY;AACxB,gBAAA,aAAa,CAAC,YAAY,GAAG,aAAa,CAAC,aAAa;YAC1D,YAAY,GAAG,IAA2C;YAC1D,IAAI,CAAC,eAAe,EAAE;gBACpB;;AAEF,YAAA,MAAM,OAAO,GAAGE,sCAAgC,CAAC,eAAe,CAAC;AACjE,YAAA,MAAM,eAAe,GAAG,IAAIC,2BAAmB,CAAC;AAC9C,gBAAA,IAAI,EAAE,eAAe,CAAC,OAAO,IAAI,EAAE;gBACnC,OAAO;AACR,aAAA,CAAC;AACF,YAAA,MAAM,eAAe;YACrB,MAAM,UAAU,EAAE,iBAAiB,CACjC,eAAe,CAAC,OAAO,IAAI,EAAE,EAC7B,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,EAAE,KAAK,EAAE,eAAe,EAAE,CAC3B;;;QAIH,MAAM,IAAIA,2BAAmB,CAAC;AAC5B,YAAA,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,IAAIC,uBAAc,CAAC;AAC1B,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,iBAAiB,EAAE,YAAY;AAC/B,gBAAA,cAAc,EAAE,aAAa;aAC9B,CAAC;AACH,SAAA,CAAC;;AAEL;;;;"}