@librechat/agents 1.4.0

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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/common/enum.cjs +108 -0
  3. package/dist/cjs/common/enum.cjs.map +1 -0
  4. package/dist/cjs/events.cjs +104 -0
  5. package/dist/cjs/events.cjs.map +1 -0
  6. package/dist/cjs/graphs/Graph.cjs +313 -0
  7. package/dist/cjs/graphs/Graph.cjs.map +1 -0
  8. package/dist/cjs/llm/providers.cjs +30 -0
  9. package/dist/cjs/llm/providers.cjs.map +1 -0
  10. package/dist/cjs/main.cjs +59 -0
  11. package/dist/cjs/main.cjs.map +1 -0
  12. package/dist/cjs/messages.cjs +195 -0
  13. package/dist/cjs/messages.cjs.map +1 -0
  14. package/dist/cjs/run.cjs +106 -0
  15. package/dist/cjs/run.cjs.map +1 -0
  16. package/dist/cjs/stream.cjs +133 -0
  17. package/dist/cjs/stream.cjs.map +1 -0
  18. package/dist/cjs/tools/ToolNode.cjs +80 -0
  19. package/dist/cjs/tools/ToolNode.cjs.map +1 -0
  20. package/dist/cjs/utils/graph.cjs +16 -0
  21. package/dist/cjs/utils/graph.cjs.map +1 -0
  22. package/dist/cjs/utils/run.cjs +59 -0
  23. package/dist/cjs/utils/run.cjs.map +1 -0
  24. package/dist/esm/common/enum.mjs +108 -0
  25. package/dist/esm/common/enum.mjs.map +1 -0
  26. package/dist/esm/events.mjs +97 -0
  27. package/dist/esm/events.mjs.map +1 -0
  28. package/dist/esm/graphs/Graph.mjs +310 -0
  29. package/dist/esm/graphs/Graph.mjs.map +1 -0
  30. package/dist/esm/llm/providers.mjs +27 -0
  31. package/dist/esm/llm/providers.mjs.map +1 -0
  32. package/dist/esm/main.mjs +9 -0
  33. package/dist/esm/main.mjs.map +1 -0
  34. package/dist/esm/messages.mjs +190 -0
  35. package/dist/esm/messages.mjs.map +1 -0
  36. package/dist/esm/run.mjs +104 -0
  37. package/dist/esm/run.mjs.map +1 -0
  38. package/dist/esm/stream.mjs +131 -0
  39. package/dist/esm/stream.mjs.map +1 -0
  40. package/dist/esm/tools/ToolNode.mjs +77 -0
  41. package/dist/esm/tools/ToolNode.mjs.map +1 -0
  42. package/dist/esm/utils/graph.mjs +13 -0
  43. package/dist/esm/utils/graph.mjs.map +1 -0
  44. package/dist/esm/utils/run.mjs +57 -0
  45. package/dist/esm/utils/run.mjs.map +1 -0
  46. package/dist/types/common/enum.d.ts +79 -0
  47. package/dist/types/common/index.d.ts +1 -0
  48. package/dist/types/events.d.ts +22 -0
  49. package/dist/types/graphs/Graph.d.ts +86 -0
  50. package/dist/types/graphs/index.d.ts +1 -0
  51. package/dist/types/index.d.ts +8 -0
  52. package/dist/types/llm/providers.d.ts +4 -0
  53. package/dist/types/messages.d.ts +10 -0
  54. package/dist/types/prompts/collab.d.ts +1 -0
  55. package/dist/types/prompts/index.d.ts +2 -0
  56. package/dist/types/prompts/taskmanager.d.ts +41 -0
  57. package/dist/types/run.d.ts +21 -0
  58. package/dist/types/scripts/args.d.ts +6 -0
  59. package/dist/types/scripts/cli.d.ts +1 -0
  60. package/dist/types/scripts/cli2.d.ts +1 -0
  61. package/dist/types/scripts/cli3.d.ts +1 -0
  62. package/dist/types/scripts/cli4.d.ts +1 -0
  63. package/dist/types/scripts/cli5.d.ts +1 -0
  64. package/dist/types/scripts/empty_input.d.ts +1 -0
  65. package/dist/types/stream.d.ts +5 -0
  66. package/dist/types/tools/ToolNode.d.ts +15 -0
  67. package/dist/types/tools/example.d.ts +26 -0
  68. package/dist/types/types/graph.d.ts +108 -0
  69. package/dist/types/types/index.d.ts +5 -0
  70. package/dist/types/types/llm.d.ts +25 -0
  71. package/dist/types/types/run.d.ts +53 -0
  72. package/dist/types/types/stream.d.ts +134 -0
  73. package/dist/types/types/tools.d.ts +24 -0
  74. package/dist/types/utils/graph.d.ts +2 -0
  75. package/dist/types/utils/index.d.ts +2 -0
  76. package/dist/types/utils/llmConfig.d.ts +2 -0
  77. package/dist/types/utils/logging.d.ts +1 -0
  78. package/dist/types/utils/run.d.ts +20 -0
  79. package/package.json +142 -0
  80. package/src/common/enum.ts +121 -0
  81. package/src/common/index.ts +2 -0
  82. package/src/events.ts +110 -0
  83. package/src/graphs/Graph.ts +416 -0
  84. package/src/graphs/index.ts +1 -0
  85. package/src/index.ts +15 -0
  86. package/src/llm/providers.ts +27 -0
  87. package/src/messages.ts +210 -0
  88. package/src/prompts/collab.ts +6 -0
  89. package/src/prompts/index.ts +2 -0
  90. package/src/prompts/taskmanager.ts +61 -0
  91. package/src/proto/CollabGraph.ts +269 -0
  92. package/src/proto/TaskManager.ts +243 -0
  93. package/src/proto/collab.ts +200 -0
  94. package/src/proto/collab_design.ts +184 -0
  95. package/src/proto/collab_design_v2.ts +224 -0
  96. package/src/proto/collab_design_v3.ts +255 -0
  97. package/src/proto/collab_design_v4.ts +220 -0
  98. package/src/proto/collab_design_v5.ts +251 -0
  99. package/src/proto/collab_graph.ts +181 -0
  100. package/src/proto/collab_original.ts +123 -0
  101. package/src/proto/example.ts +93 -0
  102. package/src/proto/example_new.ts +68 -0
  103. package/src/proto/example_old.ts +201 -0
  104. package/src/proto/example_test.ts +152 -0
  105. package/src/proto/example_test_anthropic.ts +100 -0
  106. package/src/proto/log_stream.ts +202 -0
  107. package/src/proto/main_collab_community_event.ts +133 -0
  108. package/src/proto/main_collab_design_v2.ts +96 -0
  109. package/src/proto/main_collab_design_v4.ts +100 -0
  110. package/src/proto/main_collab_design_v5.ts +135 -0
  111. package/src/proto/main_collab_global_analysis.ts +122 -0
  112. package/src/proto/main_collab_hackathon_event.ts +153 -0
  113. package/src/proto/main_collab_space_mission.ts +153 -0
  114. package/src/proto/main_philosophy.ts +210 -0
  115. package/src/proto/original_script.ts +126 -0
  116. package/src/proto/standard.ts +100 -0
  117. package/src/proto/stream.ts +56 -0
  118. package/src/proto/tasks.ts +118 -0
  119. package/src/proto/tools/global_analysis_tools.ts +86 -0
  120. package/src/proto/tools/space_mission_tools.ts +60 -0
  121. package/src/proto/vertexai.ts +54 -0
  122. package/src/run.ts +132 -0
  123. package/src/scripts/args.ts +42 -0
  124. package/src/scripts/cli.ts +166 -0
  125. package/src/scripts/cli2.ts +124 -0
  126. package/src/scripts/cli3.ts +175 -0
  127. package/src/scripts/cli4.ts +182 -0
  128. package/src/scripts/cli5.ts +182 -0
  129. package/src/scripts/empty_input.ts +136 -0
  130. package/src/stream.ts +145 -0
  131. package/src/tools/ToolNode.ts +108 -0
  132. package/src/tools/example.ts +52 -0
  133. package/src/types/graph.ts +126 -0
  134. package/src/types/index.ts +6 -0
  135. package/src/types/llm.ts +38 -0
  136. package/src/types/run.ts +56 -0
  137. package/src/types/stream.ts +174 -0
  138. package/src/types/tools.ts +31 -0
  139. package/src/utils/graph.ts +11 -0
  140. package/src/utils/index.ts +2 -0
  141. package/src/utils/llmConfig.ts +50 -0
  142. package/src/utils/logging.ts +48 -0
  143. package/src/utils/run.ts +91 -0
@@ -0,0 +1,104 @@
1
+ import { Providers, GraphEvents, Callback } from './common/enum.mjs';
2
+ import { StandardGraph } from './graphs/Graph.mjs';
3
+ import { HandlerRegistry } from './events.mjs';
4
+
5
+ class Run {
6
+ graphRunnable;
7
+ // private collab!: CollabGraph;
8
+ // private taskManager!: TaskManager;
9
+ handlerRegistry;
10
+ Graph;
11
+ provider;
12
+ run_id;
13
+ constructor(config) {
14
+ const handlerRegistry = new HandlerRegistry();
15
+ if (config.customHandlers) {
16
+ for (const [eventType, handler] of Object.entries(config.customHandlers)) {
17
+ handlerRegistry.register(eventType, handler);
18
+ }
19
+ }
20
+ this.handlerRegistry = handlerRegistry;
21
+ if (config.graphConfig.type === 'standard' || !config.graphConfig.type) {
22
+ this.provider = config.graphConfig.llmConfig.provider;
23
+ this.graphRunnable = this.createStandardGraph(config.graphConfig);
24
+ if (this.Graph) {
25
+ this.Graph.handlerRegistry = handlerRegistry;
26
+ }
27
+ }
28
+ }
29
+ createStandardGraph(config) {
30
+ const { runId, llmConfig, instructions, additional_instructions, tools = [] } = config;
31
+ const { provider, ...clientOptions } = llmConfig;
32
+ const standardGraph = new StandardGraph({
33
+ runId,
34
+ tools,
35
+ provider,
36
+ instructions,
37
+ clientOptions,
38
+ additional_instructions,
39
+ });
40
+ this.Graph = standardGraph;
41
+ return standardGraph.createWorkflow();
42
+ }
43
+ static async create(config) {
44
+ return new Run(config);
45
+ }
46
+ getRunMessages() {
47
+ if (!this.Graph) {
48
+ throw new Error('Graph not initialized. Make sure to use Run.create() to instantiate the Run.');
49
+ }
50
+ return this.Graph.getRunMessages();
51
+ }
52
+ async processStream(inputs, config, clientCallbacks) {
53
+ if (!this.graphRunnable) {
54
+ throw new Error('Run not initialized. Make sure to use Run.create() to instantiate the Run.');
55
+ }
56
+ if (!this.Graph) {
57
+ throw new Error('Graph not initialized. Make sure to use Run.create() to instantiate the Run.');
58
+ }
59
+ this.Graph.resetValues();
60
+ const provider = this.Graph.provider;
61
+ const hasTools = this.Graph.tools ? this.Graph.tools.length > 0 : false;
62
+ if (clientCallbacks) {
63
+ /* TODO: conflicts with callback manager */
64
+ const callbacks = config.callbacks || [];
65
+ config.callbacks = callbacks.concat(this.getCallbacks(clientCallbacks));
66
+ }
67
+ const stream = this.graphRunnable.streamEvents(inputs, config);
68
+ for await (const event of stream) {
69
+ const { data, name, metadata, ...info } = event;
70
+ let eventName = info.event;
71
+ if (hasTools && provider === Providers.ANTHROPIC && eventName === GraphEvents.CHAT_MODEL_STREAM) {
72
+ /* Skipping CHAT_MODEL_STREAM event for Anthropic due to double-call edge case */
73
+ continue;
74
+ }
75
+ if (eventName && eventName === GraphEvents.ON_CUSTOM_EVENT) {
76
+ eventName = name;
77
+ }
78
+ // console.log(`Event: ${event.event} | Executing Event: ${eventName}`);
79
+ const handler = this.handlerRegistry.getHandler(eventName);
80
+ if (handler) {
81
+ handler.handle(eventName, data, metadata, this.Graph);
82
+ }
83
+ }
84
+ return this.Graph.getContentParts();
85
+ }
86
+ createSystemCallback(clientCallbacks, key) {
87
+ return ((...args) => {
88
+ const clientCallback = clientCallbacks[key];
89
+ if (clientCallback && this.Graph) {
90
+ clientCallback(this.Graph, ...args);
91
+ }
92
+ });
93
+ }
94
+ getCallbacks(clientCallbacks) {
95
+ return {
96
+ [Callback.TOOL_ERROR]: this.createSystemCallback(clientCallbacks, Callback.TOOL_ERROR),
97
+ [Callback.TOOL_START]: this.createSystemCallback(clientCallbacks, Callback.TOOL_START),
98
+ [Callback.TOOL_END]: this.createSystemCallback(clientCallbacks, Callback.TOOL_END),
99
+ };
100
+ }
101
+ }
102
+
103
+ export { Run };
104
+ //# sourceMappingURL=run.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.mjs","sources":["../../src/run.ts"],"sourcesContent":["// src/run.ts\nimport type { BaseCallbackHandler, CallbackHandlerMethods } from '@langchain/core/callbacks/base';\nimport type { BaseMessage, MessageContentComplex } from '@langchain/core/messages';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type { ClientCallbacks, SystemCallbacks } from '@/graphs/Graph';\nimport type * as t from '@/types';\nimport { GraphEvents, Providers, Callback } from '@/common';\nimport { StandardGraph } from '@/graphs/Graph';\nimport { HandlerRegistry } from '@/events';\n\nexport class Run<T extends t.BaseGraphState> {\n graphRunnable?: t.CompiledWorkflow<T, Partial<T>, string>;\n // private collab!: CollabGraph;\n // private taskManager!: TaskManager;\n private handlerRegistry: HandlerRegistry;\n private Graph: StandardGraph | undefined;\n provider: Providers | undefined;\n run_id: string | undefined;\n\n private constructor(config: t.RunConfig) {\n const handlerRegistry = new HandlerRegistry();\n\n if (config.customHandlers) {\n for (const [eventType, handler] of Object.entries(config.customHandlers)) {\n handlerRegistry.register(eventType, handler);\n }\n }\n\n this.handlerRegistry = handlerRegistry;\n\n if (config.graphConfig.type === 'standard' || !config.graphConfig.type) {\n this.provider = config.graphConfig.llmConfig.provider;\n this.graphRunnable = this.createStandardGraph(config.graphConfig) as unknown as t.CompiledWorkflow<T, Partial<T>, string>;\n if (this.Graph) {\n this.Graph.handlerRegistry = handlerRegistry;\n }\n }\n }\n\n private createStandardGraph(config: t.StandardGraphConfig): t.CompiledWorkflow<t.IState, Partial<t.IState>, string> {\n const { runId, llmConfig, instructions, additional_instructions, tools = [] } = config;\n const { provider, ...clientOptions } = llmConfig;\n\n const standardGraph = new StandardGraph({\n runId,\n tools,\n provider,\n instructions,\n clientOptions,\n additional_instructions,\n });\n this.Graph = standardGraph;\n return standardGraph.createWorkflow();\n }\n\n static async create<T extends t.BaseGraphState>(config: t.RunConfig): Promise<Run<T>> {\n return new Run<T>(config);\n }\n\n getRunMessages(): BaseMessage[] | undefined {\n if (!this.Graph) {\n throw new Error('Graph not initialized. Make sure to use Run.create() to instantiate the Run.');\n }\n return this.Graph.getRunMessages();\n }\n\n async processStream(\n inputs: t.IState,\n config: Partial<RunnableConfig> & { version: 'v1' | 'v2' },\n clientCallbacks?: ClientCallbacks,\n ): Promise<MessageContentComplex[] | undefined> {\n if (!this.graphRunnable) {\n throw new Error('Run not initialized. Make sure to use Run.create() to instantiate the Run.');\n }\n if (!this.Graph) {\n throw new Error('Graph not initialized. Make sure to use Run.create() to instantiate the Run.');\n }\n\n this.Graph.resetValues();\n const provider = this.Graph.provider;\n const hasTools = this.Graph.tools ? this.Graph.tools.length > 0 : false;\n if (clientCallbacks) {\n /* TODO: conflicts with callback manager */\n const callbacks = config.callbacks as (BaseCallbackHandler | CallbackHandlerMethods)[] || [];\n config.callbacks = callbacks.concat(this.getCallbacks(clientCallbacks));\n }\n const stream = this.graphRunnable.streamEvents(inputs, config);\n\n for await (const event of stream) {\n const { data, name, metadata, ...info } = event;\n\n let eventName: t.EventName = info.event;\n if (hasTools && provider === Providers.ANTHROPIC && eventName === GraphEvents.CHAT_MODEL_STREAM) {\n /* Skipping CHAT_MODEL_STREAM event for Anthropic due to double-call edge case */\n continue;\n }\n\n if (eventName && eventName === GraphEvents.ON_CUSTOM_EVENT) {\n eventName = name;\n }\n\n // console.log(`Event: ${event.event} | Executing Event: ${eventName}`);\n\n const handler = this.handlerRegistry.getHandler(eventName);\n if (handler) {\n handler.handle(eventName, data, metadata, this.Graph);\n }\n }\n\n return this.Graph.getContentParts();\n }\n\n private createSystemCallback<K extends keyof ClientCallbacks>(\n clientCallbacks: ClientCallbacks,\n key: K\n ): SystemCallbacks[K] {\n return ((...args: unknown[]) => {\n const clientCallback = clientCallbacks[key];\n if (clientCallback && this.Graph) {\n (clientCallback as (...args: unknown[]) => void)(this.Graph, ...args);\n }\n }) as SystemCallbacks[K];\n }\n\n getCallbacks(clientCallbacks: ClientCallbacks): SystemCallbacks {\n return {\n [Callback.TOOL_ERROR]: this.createSystemCallback(clientCallbacks, Callback.TOOL_ERROR),\n [Callback.TOOL_START]: this.createSystemCallback(clientCallbacks, Callback.TOOL_START),\n [Callback.TOOL_END]: this.createSystemCallback(clientCallbacks, Callback.TOOL_END),\n };\n }\n}\n"],"names":[],"mappings":";;;;MAUa,GAAG,CAAA;AACd,IAAA,aAAa,CAA6C;;;AAGlD,IAAA,eAAe,CAAkB;AACjC,IAAA,KAAK,CAA4B;AACzC,IAAA,QAAQ,CAAwB;AAChC,IAAA,MAAM,CAAqB;AAE3B,IAAA,WAAA,CAAoB,MAAmB,EAAA;AACrC,QAAA,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;AAE9C,QAAA,IAAI,MAAM,CAAC,cAAc,EAAE;AACzB,YAAA,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE;AACxE,gBAAA,eAAe,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;aAC9C;SACF;AAED,QAAA,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;AAEvC,QAAA,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE;YACtE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC;YACtD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,WAAW,CAAyD,CAAC;AAC1H,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,gBAAA,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,eAAe,CAAC;aAC9C;SACF;KACF;AAEO,IAAA,mBAAmB,CAAC,MAA6B,EAAA;AACvD,QAAA,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,uBAAuB,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;QACvF,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,GAAG,SAAS,CAAC;AAEjD,QAAA,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC;YACtC,KAAK;YACL,KAAK;YACL,QAAQ;YACR,YAAY;YACZ,aAAa;YACb,uBAAuB;AACxB,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC;AAC3B,QAAA,OAAO,aAAa,CAAC,cAAc,EAAE,CAAC;KACvC;AAED,IAAA,aAAa,MAAM,CAA6B,MAAmB,EAAA;AACjE,QAAA,OAAO,IAAI,GAAG,CAAI,MAAM,CAAC,CAAC;KAC3B;IAED,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACf,YAAA,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;SACjG;AACD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;KACpC;AAED,IAAA,MAAM,aAAa,CACjB,MAAgB,EAChB,MAA0D,EAC1D,eAAiC,EAAA;AAEjC,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACvB,YAAA,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;SAC/F;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACf,YAAA,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;SACjG;AAED,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;AACzB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC;QACxE,IAAI,eAAe,EAAE;;AAEnB,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAA6D,IAAI,EAAE,CAAC;AAC7F,YAAA,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC;SACzE;AACD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/D,QAAA,WAAW,MAAM,KAAK,IAAI,MAAM,EAAE;AAChC,YAAA,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;AAEhD,YAAA,IAAI,SAAS,GAAgB,IAAI,CAAC,KAAK,CAAC;AACxC,YAAA,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,CAAC,SAAS,IAAI,SAAS,KAAK,WAAW,CAAC,iBAAiB,EAAE;;gBAE/F,SAAS;aACV;YAED,IAAI,SAAS,IAAI,SAAS,KAAK,WAAW,CAAC,eAAe,EAAE;gBAC1D,SAAS,GAAG,IAAI,CAAC;aAClB;;YAID,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAC3D,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;aACvD;SACF;AAED,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;KACrC;IAEO,oBAAoB,CAC1B,eAAgC,EAChC,GAAM,EAAA;AAEN,QAAA,QAAQ,CAAC,GAAG,IAAe,KAAI;AAC7B,YAAA,MAAM,cAAc,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;AAC5C,YAAA,IAAI,cAAc,IAAI,IAAI,CAAC,KAAK,EAAE;gBAC/B,cAA+C,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;aACvE;AACH,SAAC,EAAwB;KAC1B;AAED,IAAA,YAAY,CAAC,eAAgC,EAAA;QAC3C,OAAO;AACL,YAAA,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,QAAQ,CAAC,UAAU,CAAC;AACtF,YAAA,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,QAAQ,CAAC,UAAU,CAAC;AACtF,YAAA,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,QAAQ,CAAC,QAAQ,CAAC;SACnF,CAAC;KACH;AACF;;;;"}
@@ -0,0 +1,131 @@
1
+ import { nanoid } from 'nanoid';
2
+ import { StepTypes } from './common/enum.mjs';
3
+
4
+ // src/stream.ts
5
+ const getMessageId = (stepKey, graph) => {
6
+ const messageId = graph.messageIdsByStepKey.get(stepKey);
7
+ if (messageId) {
8
+ return;
9
+ }
10
+ const prelimMessageId = graph.prelimMessageIdsByStepKey.get(stepKey);
11
+ if (prelimMessageId) {
12
+ graph.prelimMessageIdsByStepKey.delete(stepKey);
13
+ graph.messageIdsByStepKey.set(stepKey, prelimMessageId);
14
+ return prelimMessageId;
15
+ }
16
+ const message_id = `msg_${nanoid()}`;
17
+ graph.messageIdsByStepKey.set(stepKey, message_id);
18
+ return message_id;
19
+ };
20
+ class ChatModelStreamHandler {
21
+ handle(event, data, metadata, graph) {
22
+ if (!graph) {
23
+ throw new Error('Graph not found');
24
+ }
25
+ const chunk = data.chunk;
26
+ const content = chunk?.content;
27
+ if (!graph.config) {
28
+ throw new Error('Config not found in graph');
29
+ }
30
+ if (!chunk) {
31
+ console.warn(`No chunk found in ${event} event`);
32
+ return;
33
+ }
34
+ const hasToolCalls = chunk.tool_calls && chunk.tool_calls.length > 0;
35
+ const hasToolCallChunks = chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0;
36
+ if (hasToolCalls && chunk.tool_calls?.every((tc) => tc.id)) {
37
+ const tool_calls = [];
38
+ for (const tool_call of chunk.tool_calls) {
39
+ if (!tool_call.id || graph.toolCallStepIds.has(tool_call.id)) {
40
+ continue;
41
+ }
42
+ tool_calls.push(tool_call);
43
+ }
44
+ const stepKey = graph.getStepKey(metadata);
45
+ graph.dispatchRunStep(stepKey, {
46
+ type: StepTypes.TOOL_CALLS,
47
+ tool_calls,
48
+ });
49
+ }
50
+ const isEmptyContent = !content || !content.length;
51
+ const isEmptyChunk = isEmptyContent && !hasToolCallChunks;
52
+ if (isEmptyChunk && chunk.id && chunk.id?.startsWith('msg')) {
53
+ if (graph.messageIdsByStepKey.has(chunk.id)) {
54
+ return;
55
+ }
56
+ else if (graph.prelimMessageIdsByStepKey.has(chunk.id)) {
57
+ return;
58
+ }
59
+ const stepKey = graph.getStepKey(metadata);
60
+ graph.prelimMessageIdsByStepKey.set(stepKey, chunk.id);
61
+ return;
62
+ }
63
+ else if (isEmptyChunk) {
64
+ return;
65
+ }
66
+ const stepKey = graph.getStepKey(metadata);
67
+ if (hasToolCallChunks && chunk.tool_call_chunks?.length && typeof chunk.tool_call_chunks[0]?.index === 'number') {
68
+ const stepId = graph.getStepIdByKey(stepKey, chunk.tool_call_chunks[0].index);
69
+ graph.dispatchRunStepDelta(stepId, {
70
+ type: StepTypes.TOOL_CALLS,
71
+ tool_calls: chunk.tool_call_chunks,
72
+ });
73
+ }
74
+ if (isEmptyContent) {
75
+ return;
76
+ }
77
+ const message_id = getMessageId(stepKey, graph);
78
+ if (message_id) {
79
+ graph.dispatchRunStep(stepKey, {
80
+ type: StepTypes.MESSAGE_CREATION,
81
+ message_creation: {
82
+ message_id,
83
+ },
84
+ });
85
+ }
86
+ const stepId = graph.getStepIdByKey(stepKey);
87
+ const runStep = graph.getRunStep(stepId);
88
+ if (!runStep) {
89
+ // eslint-disable-next-line no-console
90
+ console.warn(`\n
91
+ ==============================================================
92
+
93
+
94
+ Run step for ${stepId} does not exist, cannot dispatch delta event.
95
+
96
+ event: ${event}
97
+ stepId: ${stepId}
98
+ stepKey: ${stepKey}
99
+ message_id: ${message_id}
100
+ hasToolCalls: ${hasToolCalls}
101
+ hasToolCallChunks: ${hasToolCallChunks}
102
+
103
+ ==============================================================
104
+ \n`);
105
+ return;
106
+ }
107
+ /* Note: tool call chunks may have non-empty content that matches the current tool chunk generation */
108
+ if (typeof content === 'string' && runStep.type === StepTypes.TOOL_CALLS) {
109
+ return;
110
+ }
111
+ else if (hasToolCallChunks && chunk.tool_call_chunks?.some((tc) => tc.args === content)) {
112
+ return;
113
+ }
114
+ else if (typeof content === 'string') {
115
+ graph.dispatchMessageDelta(stepId, {
116
+ content: [{
117
+ type: 'text',
118
+ text: content,
119
+ }],
120
+ });
121
+ }
122
+ else if (content?.every((c) => c.type?.startsWith('text'))) {
123
+ graph.dispatchMessageDelta(stepId, {
124
+ content,
125
+ });
126
+ }
127
+ }
128
+ }
129
+
130
+ export { ChatModelStreamHandler };
131
+ //# sourceMappingURL=stream.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.mjs","sources":["../../src/stream.ts"],"sourcesContent":["// src/stream.ts\nimport { nanoid } from 'nanoid';\nimport type { AIMessageChunk } from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type { Graph } from '@/graphs';\nimport type * as t from '@/types';\nimport { StepTypes } from '@/common';\n\nconst getMessageId = (stepKey: string, graph: Graph<t.BaseGraphState>): string | undefined => {\n const messageId = graph.messageIdsByStepKey.get(stepKey);\n if (messageId) {\n return;\n }\n\n const prelimMessageId = graph.prelimMessageIdsByStepKey.get(stepKey);\n if (prelimMessageId) {\n graph.prelimMessageIdsByStepKey.delete(stepKey);\n graph.messageIdsByStepKey.set(stepKey, prelimMessageId);\n return prelimMessageId;\n }\n\n const message_id = `msg_${nanoid()}`;\n graph.messageIdsByStepKey.set(stepKey, message_id);\n return message_id;\n};\n\nexport class ChatModelStreamHandler implements t.EventHandler {\n handle(event: string, data: t.StreamEventData, metadata?: Record<string, unknown>, graph?: Graph): void {\n if (!graph) {\n throw new Error('Graph not found');\n }\n\n const chunk = data.chunk as AIMessageChunk;\n const content = chunk?.content;\n\n if (!graph.config) {\n throw new Error('Config not found in graph');\n }\n\n if (!chunk) {\n console.warn(`No chunk found in ${event} event`);\n return;\n }\n\n const hasToolCalls = chunk.tool_calls && chunk.tool_calls.length > 0;\n const hasToolCallChunks = chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0;\n\n if (hasToolCalls && chunk.tool_calls?.every((tc) => tc.id)) {\n const tool_calls: ToolCall[] = [];\n for (const tool_call of chunk.tool_calls) {\n if (!tool_call.id || graph.toolCallStepIds.has(tool_call.id)) {\n continue;\n }\n\n tool_calls.push(tool_call);\n }\n\n const stepKey = graph.getStepKey(metadata);\n graph.dispatchRunStep(stepKey, {\n type: StepTypes.TOOL_CALLS,\n tool_calls,\n });\n }\n\n const isEmptyContent = !content || !content.length;\n const isEmptyChunk = isEmptyContent && !hasToolCallChunks;\n if (isEmptyChunk && chunk.id && chunk.id?.startsWith('msg')) {\n if (graph.messageIdsByStepKey.has(chunk.id)) {\n return;\n } else if (graph.prelimMessageIdsByStepKey.has(chunk.id)) {\n return;\n }\n\n const stepKey = graph.getStepKey(metadata);\n graph.prelimMessageIdsByStepKey.set(stepKey, chunk.id);\n return;\n } else if (isEmptyChunk) {\n return;\n }\n\n const stepKey = graph.getStepKey(metadata);\n\n if (hasToolCallChunks && chunk.tool_call_chunks?.length && typeof chunk.tool_call_chunks[0]?.index === 'number') {\n const stepId = graph.getStepIdByKey(stepKey, chunk.tool_call_chunks[0].index);\n graph.dispatchRunStepDelta(stepId, {\n type: StepTypes.TOOL_CALLS,\n tool_calls: chunk.tool_call_chunks,\n });\n }\n\n if (isEmptyContent) {\n return;\n }\n\n const message_id = getMessageId(stepKey, graph);\n if (message_id) {\n graph.dispatchRunStep(stepKey, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n });\n }\n\n const stepId = graph.getStepIdByKey(stepKey);\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n // eslint-disable-next-line no-console\n console.warn(`\\n\n==============================================================\n\n\nRun step for ${stepId} does not exist, cannot dispatch delta event.\n\nevent: ${event}\nstepId: ${stepId}\nstepKey: ${stepKey}\nmessage_id: ${message_id}\nhasToolCalls: ${hasToolCalls}\nhasToolCallChunks: ${hasToolCallChunks}\n\n==============================================================\n\\n`);\n return;\n }\n\n /* Note: tool call chunks may have non-empty content that matches the current tool chunk generation */\n if (typeof content === 'string' && runStep.type === StepTypes.TOOL_CALLS) {\n return;\n } else if (hasToolCallChunks && chunk.tool_call_chunks?.some((tc) => tc.args === content)) {\n return;\n } else if (typeof content === 'string') {\n graph.dispatchMessageDelta(stepId, {\n content: [{\n type: 'text',\n text: content,\n }],\n });\n } else if (content?.every((c) => c.type?.startsWith('text'))) {\n graph.dispatchMessageDelta(stepId, {\n content,\n });\n }\n }\n}"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { END } from '@langchain/langgraph';
2
+ import { isBaseMessage, ToolMessage } from '@langchain/core/messages';
3
+ import { RunnableCallable } from '../utils/run.mjs';
4
+ import { GraphNodeKeys } from '../common/enum.mjs';
5
+
6
+ class ToolNode extends RunnableCallable {
7
+ tools;
8
+ toolMap;
9
+ loadRuntimeTools;
10
+ handleToolErrors = true;
11
+ constructor({ tools, toolMap, name, tags, handleToolErrors, loadRuntimeTools, }) {
12
+ super({ name, tags, func: (input, config) => this.run(input, config) });
13
+ this.tools = tools;
14
+ this.toolMap = toolMap ?? new Map(tools.map(tool => [tool.name, tool]));
15
+ this.handleToolErrors = handleToolErrors ?? this.handleToolErrors;
16
+ this.loadRuntimeTools = loadRuntimeTools;
17
+ }
18
+ async run(input, config) {
19
+ const message = Array.isArray(input)
20
+ ? input[input.length - 1]
21
+ : input.messages[input.messages.length - 1];
22
+ if (message._getType() !== 'ai') {
23
+ throw new Error('ToolNode only accepts AIMessages as input.');
24
+ }
25
+ if (this.loadRuntimeTools) {
26
+ const { tools, toolMap } = this.loadRuntimeTools(message.tool_calls ?? []);
27
+ this.tools = tools;
28
+ this.toolMap = toolMap ?? new Map(tools.map(tool => [tool.name, tool]));
29
+ }
30
+ const outputs = await Promise.all(message.tool_calls?.map(async (call) => {
31
+ const tool = this.toolMap.get(call.name);
32
+ try {
33
+ if (tool === undefined) {
34
+ throw new Error(`Tool "${call.name}" not found.`);
35
+ }
36
+ const output = await tool.invoke({ ...call, type: 'tool_call' }, config);
37
+ if (isBaseMessage(output) && output._getType() === 'tool') {
38
+ return output;
39
+ }
40
+ else {
41
+ return new ToolMessage({
42
+ name: tool.name,
43
+ content: typeof output === 'string' ? output : JSON.stringify(output),
44
+ tool_call_id: call.id,
45
+ });
46
+ }
47
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
+ }
49
+ catch (e) {
50
+ if (!this.handleToolErrors) {
51
+ throw e;
52
+ }
53
+ return new ToolMessage({
54
+ content: `Error: ${e.message}\n Please fix your mistakes.`,
55
+ name: call.name,
56
+ tool_call_id: call.id ?? '',
57
+ });
58
+ }
59
+ }) ?? []);
60
+ return Array.isArray(input) ? outputs : { messages: outputs };
61
+ }
62
+ }
63
+ function toolsCondition(state) {
64
+ const message = Array.isArray(state)
65
+ ? state[state.length - 1]
66
+ : state.messages[state.messages.length - 1];
67
+ if ('tool_calls' in message &&
68
+ (message.tool_calls?.length ?? 0) > 0) {
69
+ return GraphNodeKeys.TOOLS;
70
+ }
71
+ else {
72
+ return END;
73
+ }
74
+ }
75
+
76
+ export { ToolNode, toolsCondition };
77
+ //# sourceMappingURL=ToolNode.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolNode.mjs","sources":["../../../src/tools/ToolNode.ts"],"sourcesContent":["import { END } from '@langchain/langgraph';\nimport { ToolMessage, isBaseMessage } from '@langchain/core/messages';\nimport type { RunnableConfig, RunnableToolLike } from '@langchain/core/runnables';\nimport type { MessagesState } from '@langchain/langgraph/dist/graph/message';\nimport type { BaseMessage, AIMessage } from '@langchain/core/messages';\nimport type { StructuredToolInterface } from '@langchain/core/tools';\nimport type * as t from '@/types';\nimport{ RunnableCallable } from '@/utils';\nimport { GraphNodeKeys } from '@/common';\n\nexport class ToolNode<\n T extends BaseMessage[] | MessagesState\n> extends RunnableCallable<T, T> {\n tools: t.GenericTool[];\n private toolMap: Map<string, StructuredToolInterface | RunnableToolLike>;\n private loadRuntimeTools?: t.ToolRefGenerator;\n handleToolErrors = true;\n\n constructor({\n tools,\n toolMap,\n name,\n tags,\n handleToolErrors,\n loadRuntimeTools,\n }: t.ToolNodeConstructorParams) {\n super({ name, tags, func: (input, config) => this.run(input, config) });\n this.tools = tools;\n this.toolMap = toolMap ?? new Map(tools.map(tool => [tool.name, tool]));\n this.handleToolErrors = handleToolErrors ?? this.handleToolErrors;\n this.loadRuntimeTools = loadRuntimeTools;\n }\n\n private async run(\n input: BaseMessage[] | MessagesState,\n config: RunnableConfig\n ): Promise<BaseMessage[] | MessagesState> {\n const message = Array.isArray(input)\n ? input[input.length - 1]\n : input.messages[input.messages.length - 1];\n\n if (message._getType() !== 'ai') {\n throw new Error('ToolNode only accepts AIMessages as input.');\n }\n\n if (this.loadRuntimeTools) {\n const { tools, toolMap } = this.loadRuntimeTools(\n (message as AIMessage).tool_calls ?? []\n );\n this.tools = tools;\n this.toolMap = toolMap ?? new Map(tools.map(tool => [tool.name, tool]));\n }\n\n const outputs = await Promise.all(\n (message as AIMessage).tool_calls?.map(async (call) => {\n const tool = this.toolMap.get(call.name);\n try {\n if (tool === undefined) {\n throw new Error(`Tool \"${call.name}\" not found.`);\n }\n const output = await tool.invoke(\n { ...call, type: 'tool_call' },\n config\n );\n if (isBaseMessage(output) && output._getType() === 'tool') {\n return output;\n } else {\n return new ToolMessage({\n name: tool.name,\n content:\n typeof output === 'string' ? output : JSON.stringify(output),\n tool_call_id: call.id!,\n });\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (!this.handleToolErrors) {\n throw e;\n }\n return new ToolMessage({\n content: `Error: ${e.message}\\n Please fix your mistakes.`,\n name: call.name,\n tool_call_id: call.id ?? '',\n });\n }\n }) ?? []\n );\n\n return Array.isArray(input) ? outputs : { messages: outputs };\n }\n}\n\nexport function toolsCondition(\n state: BaseMessage[] | MessagesState\n): GraphNodeKeys.TOOLS | typeof END {\n const message = Array.isArray(state)\n ? state[state.length - 1]\n : state.messages[state.messages.length - 1];\n\n if (\n 'tool_calls' in message &&\n ((message as AIMessage).tool_calls?.length ?? 0) > 0\n ) {\n return GraphNodeKeys.TOOLS;\n } else {\n return END;\n }\n}"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ const resetIfNotEmpty = (value, resetValue) => {
2
+ if (Array.isArray(value)) {
3
+ return value.length > 0 ? resetValue : value;
4
+ }
5
+ if (value instanceof Set || value instanceof Map) {
6
+ return value.size > 0 ? resetValue : value;
7
+ }
8
+ return value !== undefined ? resetValue : value;
9
+ };
10
+ const joinKeys = (args) => args.join('_');
11
+
12
+ export { joinKeys, resetIfNotEmpty };
13
+ //# sourceMappingURL=graph.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.mjs","sources":["../../../src/utils/graph.ts"],"sourcesContent":["export const resetIfNotEmpty = <T>(value: T, resetValue: T): T => {\n if (Array.isArray(value)) {\n return value.length > 0 ? resetValue : value;\n }\n if (value instanceof Set || value instanceof Map) {\n return value.size > 0 ? resetValue : value;\n }\n return value !== undefined ? resetValue : value;\n};\n\nexport const joinKeys = (args: (string | number | undefined)[]): string => args.join('_');"],"names":[],"mappings":"MAAa,eAAe,GAAG,CAAI,KAAQ,EAAE,UAAa,KAAO;AAC/D,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,QAAA,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,GAAG,KAAK,CAAC;KAC9C;IACD,IAAI,KAAK,YAAY,GAAG,IAAI,KAAK,YAAY,GAAG,EAAE;AAChD,QAAA,OAAO,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,UAAU,GAAG,KAAK,CAAC;KAC5C;IACD,OAAO,KAAK,KAAK,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;AAClD,EAAE;AAEK,MAAM,QAAQ,GAAG,CAAC,IAAqC,KAAa,IAAI,CAAC,IAAI,CAAC,GAAG;;;;"}
@@ -0,0 +1,57 @@
1
+ import { Runnable, patchConfig, mergeConfigs } from '@langchain/core/runnables';
2
+ import { AsyncLocalStorageProviderSingleton } from '@langchain/core/singletons';
3
+
4
+ class RunnableCallable extends Runnable {
5
+ lc_namespace = ['langgraph'];
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
+ func;
8
+ tags;
9
+ config;
10
+ trace = true;
11
+ recurse = true;
12
+ constructor(fields) {
13
+ super();
14
+ this.name = fields.name ?? fields.func.name;
15
+ this.func = fields.func;
16
+ this.config = fields.tags ? { tags: fields.tags } : undefined;
17
+ this.trace = fields.trace ?? this.trace;
18
+ this.recurse = fields.recurse ?? this.recurse;
19
+ }
20
+ async _tracedInvoke(input, config, runManager) {
21
+ return new Promise((resolve, reject) => {
22
+ const childConfig = patchConfig(config, {
23
+ callbacks: runManager?.getChild(),
24
+ });
25
+ void AsyncLocalStorageProviderSingleton.runWithConfig(childConfig, async () => {
26
+ try {
27
+ const output = await this.func(input, childConfig);
28
+ resolve(output);
29
+ }
30
+ catch (e) {
31
+ reject(e);
32
+ }
33
+ });
34
+ });
35
+ }
36
+ async invoke(
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ input, options
39
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
40
+ ) {
41
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
+ let returnValue;
43
+ if (this.trace) {
44
+ returnValue = await this._callWithConfig(this._tracedInvoke, input, mergeConfigs(this.config, options));
45
+ }
46
+ else {
47
+ returnValue = await this.func(input, mergeConfigs(this.config, options));
48
+ }
49
+ if (Runnable.isRunnable(returnValue) && this.recurse) {
50
+ return await returnValue.invoke(input, options);
51
+ }
52
+ return returnValue;
53
+ }
54
+ }
55
+
56
+ export { RunnableCallable };
57
+ //# sourceMappingURL=run.mjs.map
@@ -0,0 +1 @@
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// 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":";;;AAmBM,MAAO,gBAA2C,SAAQ,QAAc,CAAA;AAC5E,IAAA,YAAY,GAAa,CAAC,WAAW,CAAC,CAAC;;AAGvC,IAAA,IAAI,CAA0B;AAE9B,IAAA,IAAI,CAAY;AAEhB,IAAA,MAAM,CAAkB;IAExB,KAAK,GAAY,IAAI,CAAC;IAEtB,OAAO,GAAY,IAAI,CAAC;AAExB,IAAA,WAAA,CAAY,MAA4B,EAAA;AACtC,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5C,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC;QAC9D,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;QACxC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;KAC/C;AAES,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,CAAC;YACH,KAAK,kCAAkC,CAAC,aAAa,CACnD,WAAW,EACX,YAAW;AACT,gBAAA,IAAI;oBACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;oBACnD,OAAO,CAAC,MAAM,CAAC,CAAC;iBACjB;gBAAC,OAAO,CAAC,EAAE;oBACV,MAAM,CAAC,CAAC,CAAC,CAAC;iBACX;AACH,aAAC,CACF,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,MAAM,MAAM;;AAEV,IAAA,KAAU,EACV,OAA6C;;;;AAI7C,QAAA,IAAI,WAAgB,CAAC;AAErB,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,CAAC;SACH;aAAM;AACL,YAAA,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;SAC1E;QAED,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;YACpD,OAAO,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;SACjD;AAED,QAAA,OAAO,WAAW,CAAC;KACpB;AACF;;;;"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Enum representing the various event types emitted during the execution of runnables.
3
+ * These events provide real-time information about the progress and state of different components.
4
+ *
5
+ * @enum {string}
6
+ */
7
+ export declare enum GraphEvents {
8
+ /** [Custom] Delta event for run steps (message creation and tool calls) */
9
+ ON_RUN_STEP = "on_run_step",
10
+ /** [Custom] Delta event for run steps (tool calls) */
11
+ ON_RUN_STEP_DELTA = "on_run_step_delta",
12
+ /** [Custom] Completed event for run steps (tool calls) */
13
+ ON_RUN_STEP_COMPLETED = "on_run_step_completed",
14
+ /** [Custom] Delta events for messages */
15
+ ON_MESSAGE_DELTA = "on_message_delta",
16
+ /** Custom event, emitted by system */
17
+ ON_CUSTOM_EVENT = "on_custom_event",
18
+ /** Emitted when a chat model starts processing. */
19
+ CHAT_MODEL_START = "on_chat_model_start",
20
+ /** Emitted when a chat model streams a chunk of its response. */
21
+ CHAT_MODEL_STREAM = "on_chat_model_stream",
22
+ /** Emitted when a chat model completes its processing. */
23
+ CHAT_MODEL_END = "on_chat_model_end",
24
+ /** Emitted when a language model starts processing. */
25
+ LLM_START = "on_llm_start",
26
+ /** Emitted when a language model streams a chunk of its response. */
27
+ LLM_STREAM = "on_llm_stream",
28
+ /** Emitted when a language model completes its processing. */
29
+ LLM_END = "on_llm_end",
30
+ /** Emitted when a chain starts processing. */
31
+ CHAIN_START = "on_chain_start",
32
+ /** Emitted when a chain streams a chunk of its output. */
33
+ CHAIN_STREAM = "on_chain_stream",
34
+ /** Emitted when a chain completes its processing. */
35
+ CHAIN_END = "on_chain_end",
36
+ /** Emitted when a tool starts its operation. */
37
+ TOOL_START = "on_tool_start",
38
+ /** Emitted when a tool completes its operation. */
39
+ TOOL_END = "on_tool_end",
40
+ /** Emitted when a retriever starts its operation. */
41
+ RETRIEVER_START = "on_retriever_start",
42
+ /** Emitted when a retriever completes its operation. */
43
+ RETRIEVER_END = "on_retriever_end",
44
+ /** Emitted when a prompt starts processing. */
45
+ PROMPT_START = "on_prompt_start",
46
+ /** Emitted when a prompt completes its processing. */
47
+ PROMPT_END = "on_prompt_end"
48
+ }
49
+ export declare enum Providers {
50
+ OPENAI = "openAI",
51
+ BEDROCK = "bedrock",
52
+ VERTEXAI = "vertexai",
53
+ AWS = "aws",
54
+ ANTHROPIC = "anthropic",
55
+ MISTRALAI = "mistralai"
56
+ }
57
+ export declare enum GraphNodeKeys {
58
+ TOOLS = "tools",
59
+ AGENT = "agent",
60
+ PRE_TOOLS = "pre_tools",
61
+ POST_TOOLS = "post_tools"
62
+ }
63
+ export declare enum GraphNodeActions {
64
+ TOOL_NODE = "tool_node",
65
+ CALL_MODEL = "call_model",
66
+ ROUTE_MESSAGE = "route_message"
67
+ }
68
+ export declare enum CommonEvents {
69
+ LANGGRAPH = "LangGraph"
70
+ }
71
+ export declare enum StepTypes {
72
+ TOOL_CALLS = "tool_calls",
73
+ MESSAGE_CREATION = "message_creation"
74
+ }
75
+ export declare enum Callback {
76
+ TOOL_ERROR = "handleToolError",
77
+ TOOL_START = "handleToolStart",
78
+ TOOL_END = "handleToolEnd"
79
+ }
@@ -0,0 +1 @@
1
+ export * from './enum';
@@ -0,0 +1,22 @@
1
+ import type { Graph } from '@/graphs';
2
+ import type * as t from '@/types';
3
+ export declare class HandlerRegistry {
4
+ private handlers;
5
+ register(eventType: string, handler: t.EventHandler): void;
6
+ getHandler(eventType: string): t.EventHandler | undefined;
7
+ }
8
+ export declare class ModelEndHandler implements t.EventHandler {
9
+ handle(event: string, data: t.StreamEventData, metadata?: Record<string, unknown>, graph?: Graph): void;
10
+ }
11
+ export declare class ToolEndHandler implements t.EventHandler {
12
+ handle(event: string, data: t.StreamEventData, metadata?: Record<string, unknown>, graph?: Graph): void;
13
+ }
14
+ export declare class TestLLMStreamHandler implements t.EventHandler {
15
+ handle(event: string, data: t.StreamEventData): void;
16
+ }
17
+ export declare class TestChatStreamHandler implements t.EventHandler {
18
+ handle(event: string, data: t.StreamEventData): void;
19
+ }
20
+ export declare class LLMStreamHandler implements t.EventHandler {
21
+ handle(event: string, data: t.StreamEventData, metadata?: Record<string, unknown>): void;
22
+ }
@@ -0,0 +1,86 @@
1
+ import { ToolNode } from '@langchain/langgraph/prebuilt';
2
+ import { START } from '@langchain/langgraph';
3
+ import { Runnable, RunnableConfig } from '@langchain/core/runnables';
4
+ import { SystemMessage } from '@langchain/core/messages';
5
+ import type { BaseMessage } from '@langchain/core/messages';
6
+ import type * as t from '@/types';
7
+ import { Providers, GraphNodeKeys, Callback } from '@/common';
8
+ import { ToolNode as CustomToolNode } from '@/tools/ToolNode';
9
+ import { HandlerRegistry } from '@/events';
10
+ export type GraphNode = GraphNodeKeys | typeof START;
11
+ export type ClientCallback<T extends unknown[]> = (graph: StandardGraph, ...args: T) => void;
12
+ export type ClientCallbacks = {
13
+ [Callback.TOOL_ERROR]?: ClientCallback<[Error, string]>;
14
+ [Callback.TOOL_START]?: ClientCallback<unknown[]>;
15
+ [Callback.TOOL_END]?: ClientCallback<unknown[]>;
16
+ };
17
+ export type SystemCallbacks = {
18
+ [K in keyof ClientCallbacks]: ClientCallbacks[K] extends ClientCallback<infer Args> ? (...args: Args) => void : never;
19
+ };
20
+ export declare abstract class Graph<T extends t.BaseGraphState = t.BaseGraphState, TNodeName extends string = string> {
21
+ abstract resetValues(): void;
22
+ abstract createGraphState(): t.GraphStateChannels<T>;
23
+ abstract initializeTools(): CustomToolNode<T> | ToolNode<T>;
24
+ abstract initializeModel(): Runnable;
25
+ abstract getRunMessages(): BaseMessage[] | undefined;
26
+ abstract getContentParts(): t.MessageContentComplex[] | undefined;
27
+ abstract generateStepId(stepKey: string): [string, number];
28
+ abstract getKeyList(metadata: Record<string, unknown> | undefined): (string | number | undefined)[];
29
+ abstract getStepKey(metadata: Record<string, unknown> | undefined): string;
30
+ abstract checkKeyList(keyList: (string | number | undefined)[]): boolean;
31
+ abstract getStepIdByKey(stepKey: string, index?: number): string;
32
+ abstract getRunStep(stepId: string): t.RunStep | undefined;
33
+ abstract dispatchRunStep(stepKey: string, stepDetails: t.StepDetails): void;
34
+ abstract dispatchRunStepDelta(id: string, delta: t.ToolCallDelta): void;
35
+ abstract dispatchMessageDelta(id: string, delta: t.MessageDelta): void;
36
+ abstract handleToolCallCompleted(data: t.ToolEndData): void;
37
+ abstract createCallModel(): (state: T, config?: RunnableConfig) => Promise<Partial<T>>;
38
+ abstract createWorkflow(): t.CompiledWorkflow<T, Partial<T>, TNodeName>;
39
+ messageIdsByStepKey: Map<string, string>;
40
+ prelimMessageIdsByStepKey: Map<string, string>;
41
+ config: RunnableConfig | undefined;
42
+ contentData: t.RunStep[];
43
+ stepKeyIds: Map<string, string[]>;
44
+ contentIndexMap: Map<string, number>;
45
+ toolCallStepIds: Map<string, string>;
46
+ }
47
+ export declare class StandardGraph extends Graph<t.BaseGraphState, GraphNode> {
48
+ private graphState;
49
+ private clientOptions;
50
+ private boundModel;
51
+ handlerRegistry: HandlerRegistry | undefined;
52
+ systemMessage: SystemMessage | undefined;
53
+ messages: BaseMessage[];
54
+ runId: string | undefined;
55
+ tools?: t.GenericTool[];
56
+ toolMap?: t.ToolMap;
57
+ startIndex: number;
58
+ provider: Providers;
59
+ constructor({ runId, tools, toolMap, provider, clientOptions, instructions, additional_instructions, }: {
60
+ runId?: string;
61
+ provider: Providers;
62
+ tools?: t.GenericTool[];
63
+ toolMap?: t.ToolMap;
64
+ clientOptions: Record<string, unknown>;
65
+ instructions?: string;
66
+ additional_instructions?: string;
67
+ });
68
+ resetValues(): void;
69
+ getRunStep(stepId: string): t.RunStep | undefined;
70
+ getStepKey(metadata: Record<string, unknown> | undefined): string;
71
+ getStepIdByKey(stepKey: string, index?: number): string;
72
+ generateStepId(stepKey: string): [string, number];
73
+ getKeyList(metadata: Record<string, unknown> | undefined): (string | number | undefined)[];
74
+ checkKeyList(keyList: (string | number | undefined)[]): boolean;
75
+ getRunMessages(): BaseMessage[] | undefined;
76
+ getContentParts(): t.MessageContentComplex[] | undefined;
77
+ createGraphState(): t.GraphStateChannels<t.BaseGraphState>;
78
+ initializeTools(): CustomToolNode<t.BaseGraphState> | ToolNode<t.BaseGraphState>;
79
+ initializeModel(): Runnable;
80
+ createCallModel(): (state: t.BaseGraphState, config?: RunnableConfig) => Promise<Partial<t.BaseGraphState>>;
81
+ createWorkflow(): t.CompiledWorkflow<t.BaseGraphState, Partial<t.BaseGraphState>, GraphNode>;
82
+ dispatchRunStep(stepKey: string, stepDetails: t.StepDetails): void;
83
+ handleToolCallCompleted(data: t.ToolEndData, metadata?: Record<string, unknown>): void;
84
+ dispatchRunStepDelta(id: string, delta: t.ToolCallDelta): void;
85
+ dispatchMessageDelta(id: string, delta: t.MessageDelta): void;
86
+ }
@@ -0,0 +1 @@
1
+ export * from './Graph';