illuma-agents 1.0.8 → 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 (217) 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/providers.cjs +13 -16
  13. package/dist/cjs/llm/providers.cjs.map +1 -1
  14. package/dist/cjs/llm/text.cjs.map +1 -1
  15. package/dist/cjs/messages/core.cjs +14 -14
  16. package/dist/cjs/messages/core.cjs.map +1 -1
  17. package/dist/cjs/messages/ids.cjs.map +1 -1
  18. package/dist/cjs/messages/prune.cjs.map +1 -1
  19. package/dist/cjs/run.cjs +10 -1
  20. package/dist/cjs/run.cjs.map +1 -1
  21. package/dist/cjs/splitStream.cjs.map +1 -1
  22. package/dist/cjs/stream.cjs +4 -1
  23. package/dist/cjs/stream.cjs.map +1 -1
  24. package/dist/cjs/tools/ToolNode.cjs +10 -1
  25. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  26. package/dist/cjs/tools/handlers.cjs +29 -25
  27. package/dist/cjs/tools/handlers.cjs.map +1 -1
  28. package/dist/cjs/tools/search/anthropic.cjs.map +1 -1
  29. package/dist/cjs/tools/search/content.cjs.map +1 -1
  30. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  31. package/dist/cjs/tools/search/format.cjs.map +1 -1
  32. package/dist/cjs/tools/search/highlights.cjs.map +1 -1
  33. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  34. package/dist/cjs/tools/search/schema.cjs +25 -25
  35. package/dist/cjs/tools/search/schema.cjs.map +1 -1
  36. package/dist/cjs/tools/search/search.cjs +6 -1
  37. package/dist/cjs/tools/search/search.cjs.map +1 -1
  38. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
  39. package/dist/cjs/tools/search/tool.cjs +162 -35
  40. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  41. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  42. package/dist/cjs/utils/graph.cjs.map +1 -1
  43. package/dist/cjs/utils/llm.cjs +0 -1
  44. package/dist/cjs/utils/llm.cjs.map +1 -1
  45. package/dist/cjs/utils/misc.cjs.map +1 -1
  46. package/dist/cjs/utils/run.cjs.map +1 -1
  47. package/dist/cjs/utils/title.cjs +7 -7
  48. package/dist/cjs/utils/title.cjs.map +1 -1
  49. package/dist/esm/common/enum.mjs +1 -2
  50. package/dist/esm/common/enum.mjs.map +1 -1
  51. package/dist/esm/instrumentation.mjs.map +1 -1
  52. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  53. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +79 -2
  54. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  55. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
  56. package/dist/esm/llm/bedrock/index.mjs +97 -0
  57. package/dist/esm/llm/bedrock/index.mjs.map +1 -0
  58. package/dist/esm/llm/fake.mjs.map +1 -1
  59. package/dist/esm/llm/providers.mjs +2 -5
  60. package/dist/esm/llm/providers.mjs.map +1 -1
  61. package/dist/esm/llm/text.mjs.map +1 -1
  62. package/dist/esm/messages/core.mjs +14 -14
  63. package/dist/esm/messages/core.mjs.map +1 -1
  64. package/dist/esm/messages/ids.mjs.map +1 -1
  65. package/dist/esm/messages/prune.mjs.map +1 -1
  66. package/dist/esm/run.mjs +10 -1
  67. package/dist/esm/run.mjs.map +1 -1
  68. package/dist/esm/splitStream.mjs.map +1 -1
  69. package/dist/esm/stream.mjs +4 -1
  70. package/dist/esm/stream.mjs.map +1 -1
  71. package/dist/esm/tools/ToolNode.mjs +10 -1
  72. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  73. package/dist/esm/tools/handlers.mjs +30 -26
  74. package/dist/esm/tools/handlers.mjs.map +1 -1
  75. package/dist/esm/tools/search/anthropic.mjs.map +1 -1
  76. package/dist/esm/tools/search/content.mjs.map +1 -1
  77. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  78. package/dist/esm/tools/search/format.mjs.map +1 -1
  79. package/dist/esm/tools/search/highlights.mjs.map +1 -1
  80. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  81. package/dist/esm/tools/search/schema.mjs +25 -25
  82. package/dist/esm/tools/search/schema.mjs.map +1 -1
  83. package/dist/esm/tools/search/search.mjs +6 -1
  84. package/dist/esm/tools/search/search.mjs.map +1 -1
  85. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
  86. package/dist/esm/tools/search/tool.mjs +162 -35
  87. package/dist/esm/tools/search/tool.mjs.map +1 -1
  88. package/dist/esm/tools/search/utils.mjs.map +1 -1
  89. package/dist/esm/utils/graph.mjs.map +1 -1
  90. package/dist/esm/utils/llm.mjs +0 -1
  91. package/dist/esm/utils/llm.mjs.map +1 -1
  92. package/dist/esm/utils/misc.mjs.map +1 -1
  93. package/dist/esm/utils/run.mjs.map +1 -1
  94. package/dist/esm/utils/title.mjs +7 -7
  95. package/dist/esm/utils/title.mjs.map +1 -1
  96. package/dist/types/common/enum.d.ts +1 -2
  97. package/dist/types/llm/bedrock/index.d.ts +36 -0
  98. package/dist/types/tools/search/types.d.ts +2 -0
  99. package/dist/types/types/llm.d.ts +3 -8
  100. package/package.json +15 -11
  101. package/src/common/enum.ts +1 -2
  102. package/src/common/index.ts +1 -1
  103. package/src/instrumentation.ts +22 -22
  104. package/src/llm/anthropic/llm.spec.ts +1442 -1442
  105. package/src/llm/anthropic/types.ts +140 -140
  106. package/src/llm/anthropic/utils/message_inputs.ts +757 -660
  107. package/src/llm/anthropic/utils/output_parsers.ts +133 -133
  108. package/src/llm/anthropic/utils/tools.ts +29 -29
  109. package/src/llm/bedrock/index.ts +128 -0
  110. package/src/llm/fake.ts +133 -133
  111. package/src/llm/google/utils/tools.ts +160 -160
  112. package/src/llm/openai/types.ts +24 -24
  113. package/src/llm/openai/utils/isReasoningModel.test.ts +90 -90
  114. package/src/llm/providers.ts +2 -7
  115. package/src/llm/text.ts +94 -94
  116. package/src/messages/core.ts +463 -463
  117. package/src/messages/formatAgentMessages.tools.test.ts +400 -400
  118. package/src/messages/formatMessage.test.ts +693 -693
  119. package/src/messages/ids.ts +26 -26
  120. package/src/messages/prune.ts +567 -567
  121. package/src/messages/shiftIndexTokenCountMap.test.ts +81 -81
  122. package/src/mockStream.ts +98 -98
  123. package/src/prompts/collab.ts +5 -5
  124. package/src/prompts/index.ts +1 -1
  125. package/src/prompts/taskmanager.ts +61 -61
  126. package/src/run.ts +13 -4
  127. package/src/scripts/ant_web_search_edge_case.ts +162 -0
  128. package/src/scripts/ant_web_search_error_edge_case.ts +148 -0
  129. package/src/scripts/args.ts +48 -48
  130. package/src/scripts/caching.ts +123 -123
  131. package/src/scripts/code_exec_files.ts +193 -193
  132. package/src/scripts/empty_input.ts +137 -137
  133. package/src/scripts/image.ts +178 -178
  134. package/src/scripts/memory.ts +97 -97
  135. package/src/scripts/thinking.ts +149 -149
  136. package/src/specs/anthropic.simple.test.ts +67 -0
  137. package/src/specs/spec.utils.ts +3 -3
  138. package/src/specs/token-distribution-edge-case.test.ts +316 -316
  139. package/src/specs/tool-error.test.ts +193 -193
  140. package/src/splitStream.test.ts +691 -691
  141. package/src/splitStream.ts +234 -234
  142. package/src/stream.test.ts +94 -94
  143. package/src/stream.ts +4 -1
  144. package/src/tools/ToolNode.ts +12 -1
  145. package/src/tools/handlers.ts +32 -28
  146. package/src/tools/search/anthropic.ts +51 -51
  147. package/src/tools/search/content.test.ts +173 -173
  148. package/src/tools/search/content.ts +147 -147
  149. package/src/tools/search/direct-url.test.ts +530 -0
  150. package/src/tools/search/firecrawl.ts +210 -210
  151. package/src/tools/search/format.ts +250 -250
  152. package/src/tools/search/highlights.ts +320 -320
  153. package/src/tools/search/index.ts +2 -2
  154. package/src/tools/search/jina-reranker.test.ts +126 -126
  155. package/src/tools/search/output.md +2775 -2775
  156. package/src/tools/search/rerankers.ts +242 -242
  157. package/src/tools/search/schema.ts +63 -63
  158. package/src/tools/search/search.ts +766 -759
  159. package/src/tools/search/serper-scraper.ts +155 -155
  160. package/src/tools/search/test.html +883 -883
  161. package/src/tools/search/test.md +642 -642
  162. package/src/tools/search/test.ts +159 -159
  163. package/src/tools/search/tool.ts +619 -471
  164. package/src/tools/search/types.ts +689 -687
  165. package/src/tools/search/utils.ts +79 -79
  166. package/src/types/index.ts +6 -6
  167. package/src/types/llm.ts +2 -8
  168. package/src/utils/graph.ts +10 -10
  169. package/src/utils/llm.ts +26 -27
  170. package/src/utils/llmConfig.ts +5 -3
  171. package/src/utils/logging.ts +48 -48
  172. package/src/utils/misc.ts +57 -57
  173. package/src/utils/run.ts +100 -100
  174. package/src/utils/title.ts +165 -165
  175. package/dist/cjs/llm/ollama/index.cjs +0 -70
  176. package/dist/cjs/llm/ollama/index.cjs.map +0 -1
  177. package/dist/cjs/llm/ollama/utils.cjs +0 -158
  178. package/dist/cjs/llm/ollama/utils.cjs.map +0 -1
  179. package/dist/esm/llm/ollama/index.mjs +0 -68
  180. package/dist/esm/llm/ollama/index.mjs.map +0 -1
  181. package/dist/esm/llm/ollama/utils.mjs +0 -155
  182. package/dist/esm/llm/ollama/utils.mjs.map +0 -1
  183. package/dist/types/llm/ollama/index.d.ts +0 -8
  184. package/dist/types/llm/ollama/utils.d.ts +0 -7
  185. package/src/llm/ollama/index.ts +0 -92
  186. package/src/llm/ollama/utils.ts +0 -193
  187. package/src/proto/CollabGraph.ts +0 -269
  188. package/src/proto/TaskManager.ts +0 -243
  189. package/src/proto/collab.ts +0 -200
  190. package/src/proto/collab_design.ts +0 -184
  191. package/src/proto/collab_design_v2.ts +0 -224
  192. package/src/proto/collab_design_v3.ts +0 -255
  193. package/src/proto/collab_design_v4.ts +0 -220
  194. package/src/proto/collab_design_v5.ts +0 -251
  195. package/src/proto/collab_graph.ts +0 -181
  196. package/src/proto/collab_original.ts +0 -123
  197. package/src/proto/example.ts +0 -93
  198. package/src/proto/example_new.ts +0 -68
  199. package/src/proto/example_old.ts +0 -201
  200. package/src/proto/example_test.ts +0 -152
  201. package/src/proto/example_test_anthropic.ts +0 -100
  202. package/src/proto/log_stream.ts +0 -202
  203. package/src/proto/main_collab_community_event.ts +0 -133
  204. package/src/proto/main_collab_design_v2.ts +0 -96
  205. package/src/proto/main_collab_design_v4.ts +0 -100
  206. package/src/proto/main_collab_design_v5.ts +0 -135
  207. package/src/proto/main_collab_global_analysis.ts +0 -122
  208. package/src/proto/main_collab_hackathon_event.ts +0 -153
  209. package/src/proto/main_collab_space_mission.ts +0 -153
  210. package/src/proto/main_philosophy.ts +0 -210
  211. package/src/proto/original_script.ts +0 -126
  212. package/src/proto/standard.ts +0 -100
  213. package/src/proto/stream.ts +0 -56
  214. package/src/proto/tasks.ts +0 -118
  215. package/src/proto/tools/global_analysis_tools.ts +0 -86
  216. package/src/proto/tools/space_mission_tools.ts +0 -60
  217. package/src/proto/vertexai.ts +0 -54
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;;;;"}