@langchain/core 0.2.18 → 0.2.20

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 (155) hide show
  1. package/dist/callbacks/manager.cjs +94 -19
  2. package/dist/callbacks/manager.d.ts +3 -1
  3. package/dist/callbacks/manager.js +94 -19
  4. package/dist/language_models/base.d.ts +0 -10
  5. package/dist/language_models/chat_models.cjs +5 -6
  6. package/dist/language_models/chat_models.d.ts +9 -10
  7. package/dist/language_models/chat_models.js +5 -6
  8. package/dist/language_models/llms.cjs +5 -6
  9. package/dist/language_models/llms.d.ts +10 -12
  10. package/dist/language_models/llms.js +5 -6
  11. package/dist/messages/base.cjs +16 -1
  12. package/dist/messages/base.d.ts +9 -0
  13. package/dist/messages/base.js +14 -0
  14. package/dist/messages/tool.cjs +23 -0
  15. package/dist/messages/tool.d.ts +15 -0
  16. package/dist/messages/tool.js +24 -1
  17. package/dist/messages/utils.cjs +1 -1
  18. package/dist/messages/utils.js +1 -1
  19. package/dist/output_parsers/string.cjs +1 -0
  20. package/dist/output_parsers/string.js +1 -0
  21. package/dist/runnables/base.cjs +35 -12
  22. package/dist/runnables/base.js +35 -12
  23. package/dist/runnables/config.cjs +41 -0
  24. package/dist/runnables/config.js +41 -0
  25. package/dist/runnables/remote.cjs +17 -14
  26. package/dist/runnables/remote.js +17 -14
  27. package/dist/runnables/types.d.ts +10 -0
  28. package/dist/tools/index.cjs +15 -6
  29. package/dist/tools/index.d.ts +21 -12
  30. package/dist/tools/index.js +15 -6
  31. package/dist/utils/math.cjs +6 -4
  32. package/dist/utils/math.js +6 -4
  33. package/dist/utils/ml-distance/distances.cjs +18 -0
  34. package/dist/utils/ml-distance/distances.d.ts +8 -0
  35. package/dist/utils/ml-distance/distances.js +14 -0
  36. package/dist/utils/ml-distance/similarities.cjs +21 -0
  37. package/dist/utils/ml-distance/similarities.d.ts +7 -0
  38. package/dist/utils/ml-distance/similarities.js +17 -0
  39. package/dist/utils/ml-distance-euclidean/euclidean.cjs +15 -0
  40. package/dist/utils/ml-distance-euclidean/euclidean.d.ts +2 -0
  41. package/dist/utils/ml-distance-euclidean/euclidean.js +10 -0
  42. package/dist/utils/signal.cjs +28 -0
  43. package/dist/utils/signal.d.ts +1 -0
  44. package/dist/utils/signal.js +24 -0
  45. package/dist/utils/stream.cjs +19 -4
  46. package/dist/utils/stream.d.ts +3 -1
  47. package/dist/utils/stream.js +19 -4
  48. package/dist/utils/testing/index.cjs +168 -4
  49. package/dist/utils/testing/index.d.ts +100 -6
  50. package/dist/utils/testing/index.js +167 -4
  51. package/package.json +4 -4
  52. package/dist/caches/tests/in_memory_cache.test.d.ts +0 -1
  53. package/dist/caches/tests/in_memory_cache.test.js +0 -33
  54. package/dist/callbacks/tests/callbacks.test.d.ts +0 -1
  55. package/dist/callbacks/tests/callbacks.test.js +0 -495
  56. package/dist/callbacks/tests/manager.int.test.d.ts +0 -1
  57. package/dist/callbacks/tests/manager.int.test.js +0 -29
  58. package/dist/callbacks/tests/run_collector.test.d.ts +0 -1
  59. package/dist/callbacks/tests/run_collector.test.js +0 -58
  60. package/dist/language_models/tests/chat_models.test.d.ts +0 -1
  61. package/dist/language_models/tests/chat_models.test.js +0 -204
  62. package/dist/language_models/tests/count_tokens.test.d.ts +0 -1
  63. package/dist/language_models/tests/count_tokens.test.js +0 -19
  64. package/dist/language_models/tests/llms.test.d.ts +0 -1
  65. package/dist/language_models/tests/llms.test.js +0 -52
  66. package/dist/messages/tests/base_message.test.d.ts +0 -1
  67. package/dist/messages/tests/base_message.test.js +0 -245
  68. package/dist/messages/tests/message_utils.test.d.ts +0 -1
  69. package/dist/messages/tests/message_utils.test.js +0 -434
  70. package/dist/output_parsers/openai_tools/tests/json_output_tools_parser.test.d.ts +0 -1
  71. package/dist/output_parsers/openai_tools/tests/json_output_tools_parser.test.js +0 -81
  72. package/dist/output_parsers/tests/json.test.d.ts +0 -1
  73. package/dist/output_parsers/tests/json.test.js +0 -427
  74. package/dist/output_parsers/tests/output_parser.test.d.ts +0 -1
  75. package/dist/output_parsers/tests/output_parser.test.js +0 -78
  76. package/dist/output_parsers/tests/string.test.d.ts +0 -1
  77. package/dist/output_parsers/tests/string.test.js +0 -68
  78. package/dist/output_parsers/tests/structured.test.d.ts +0 -1
  79. package/dist/output_parsers/tests/structured.test.js +0 -166
  80. package/dist/output_parsers/tests/xml.test.d.ts +0 -1
  81. package/dist/output_parsers/tests/xml.test.js +0 -81
  82. package/dist/prompts/tests/chat.mustache.test.d.ts +0 -1
  83. package/dist/prompts/tests/chat.mustache.test.js +0 -129
  84. package/dist/prompts/tests/chat.test.d.ts +0 -1
  85. package/dist/prompts/tests/chat.test.js +0 -557
  86. package/dist/prompts/tests/few_shot.test.d.ts +0 -1
  87. package/dist/prompts/tests/few_shot.test.js +0 -224
  88. package/dist/prompts/tests/pipeline.test.d.ts +0 -1
  89. package/dist/prompts/tests/pipeline.test.js +0 -101
  90. package/dist/prompts/tests/prompt.mustache.test.d.ts +0 -1
  91. package/dist/prompts/tests/prompt.mustache.test.js +0 -105
  92. package/dist/prompts/tests/prompt.test.d.ts +0 -1
  93. package/dist/prompts/tests/prompt.test.js +0 -78
  94. package/dist/prompts/tests/structured.test.d.ts +0 -1
  95. package/dist/prompts/tests/structured.test.js +0 -37
  96. package/dist/prompts/tests/template.test.d.ts +0 -1
  97. package/dist/prompts/tests/template.test.js +0 -24
  98. package/dist/runnables/tests/runnable.test.d.ts +0 -1
  99. package/dist/runnables/tests/runnable.test.js +0 -491
  100. package/dist/runnables/tests/runnable_binding.test.d.ts +0 -1
  101. package/dist/runnables/tests/runnable_binding.test.js +0 -46
  102. package/dist/runnables/tests/runnable_branch.test.d.ts +0 -1
  103. package/dist/runnables/tests/runnable_branch.test.js +0 -116
  104. package/dist/runnables/tests/runnable_graph.test.d.ts +0 -1
  105. package/dist/runnables/tests/runnable_graph.test.js +0 -100
  106. package/dist/runnables/tests/runnable_history.test.d.ts +0 -1
  107. package/dist/runnables/tests/runnable_history.test.js +0 -177
  108. package/dist/runnables/tests/runnable_interface.test.d.ts +0 -1
  109. package/dist/runnables/tests/runnable_interface.test.js +0 -209
  110. package/dist/runnables/tests/runnable_map.test.d.ts +0 -1
  111. package/dist/runnables/tests/runnable_map.test.js +0 -238
  112. package/dist/runnables/tests/runnable_passthrough.test.d.ts +0 -1
  113. package/dist/runnables/tests/runnable_passthrough.test.js +0 -96
  114. package/dist/runnables/tests/runnable_remote.int.test.d.ts +0 -1
  115. package/dist/runnables/tests/runnable_remote.int.test.js +0 -138
  116. package/dist/runnables/tests/runnable_remote.test.d.ts +0 -1
  117. package/dist/runnables/tests/runnable_remote.test.js +0 -200
  118. package/dist/runnables/tests/runnable_retry.test.d.ts +0 -1
  119. package/dist/runnables/tests/runnable_retry.test.js +0 -125
  120. package/dist/runnables/tests/runnable_stream_events.test.d.ts +0 -1
  121. package/dist/runnables/tests/runnable_stream_events.test.js +0 -1013
  122. package/dist/runnables/tests/runnable_stream_events_v2.test.d.ts +0 -1
  123. package/dist/runnables/tests/runnable_stream_events_v2.test.js +0 -2022
  124. package/dist/runnables/tests/runnable_stream_log.test.d.ts +0 -1
  125. package/dist/runnables/tests/runnable_stream_log.test.js +0 -71
  126. package/dist/runnables/tests/runnable_tools.test.d.ts +0 -1
  127. package/dist/runnables/tests/runnable_tools.test.js +0 -149
  128. package/dist/runnables/tests/runnable_tracing.int.test.d.ts +0 -1
  129. package/dist/runnables/tests/runnable_tracing.int.test.js +0 -37
  130. package/dist/runnables/tests/runnable_with_fallbacks.test.d.ts +0 -1
  131. package/dist/runnables/tests/runnable_with_fallbacks.test.js +0 -36
  132. package/dist/singletons/tests/async_local_storage.test.d.ts +0 -1
  133. package/dist/singletons/tests/async_local_storage.test.js +0 -153
  134. package/dist/structured_query/tests/utils.test.d.ts +0 -1
  135. package/dist/structured_query/tests/utils.test.js +0 -47
  136. package/dist/tools/tests/tools.test.d.ts +0 -1
  137. package/dist/tools/tests/tools.test.js +0 -85
  138. package/dist/tracers/tests/langchain_tracer.int.test.d.ts +0 -1
  139. package/dist/tracers/tests/langchain_tracer.int.test.js +0 -74
  140. package/dist/tracers/tests/langsmith_interop.test.d.ts +0 -1
  141. package/dist/tracers/tests/langsmith_interop.test.js +0 -551
  142. package/dist/tracers/tests/tracer.test.d.ts +0 -1
  143. package/dist/tracers/tests/tracer.test.js +0 -378
  144. package/dist/utils/testing/tests/chatfake.test.d.ts +0 -1
  145. package/dist/utils/testing/tests/chatfake.test.js +0 -112
  146. package/dist/utils/tests/async_caller.test.d.ts +0 -1
  147. package/dist/utils/tests/async_caller.test.js +0 -27
  148. package/dist/utils/tests/enviroment.test.d.ts +0 -1
  149. package/dist/utils/tests/enviroment.test.js +0 -6
  150. package/dist/utils/tests/function_calling.test.d.ts +0 -1
  151. package/dist/utils/tests/function_calling.test.js +0 -107
  152. package/dist/utils/tests/math_utils.test.d.ts +0 -1
  153. package/dist/utils/tests/math_utils.test.js +0 -139
  154. package/dist/utils/tests/polyfill_stream.test.d.ts +0 -1
  155. package/dist/utils/tests/polyfill_stream.test.js +0 -15
@@ -1,2022 +0,0 @@
1
- /* eslint-disable no-promise-executor-return */
2
- /* eslint-disable no-process-env */
3
- /* eslint-disable @typescript-eslint/no-explicit-any */
4
- import { test } from "@jest/globals";
5
- import { z } from "zod";
6
- import { RunnableLambda, RunnableMap, RunnablePassthrough, RunnablePick, } from "../index.js";
7
- import { ChatPromptTemplate } from "../../prompts/chat.js";
8
- import { FakeChatModel, FakeLLM, FakeListChatModel, FakeRetriever, FakeStreamingLLM, } from "../../utils/testing/index.js";
9
- import { AIMessage, AIMessageChunk, HumanMessage, SystemMessage, } from "../../messages/index.js";
10
- import { DynamicStructuredTool, DynamicTool, tool } from "../../tools/index.js";
11
- import { Document } from "../../documents/document.js";
12
- import { PromptTemplate } from "../../prompts/prompt.js";
13
- import { GenerationChunk } from "../../outputs.js";
14
- // Import from web to avoid side-effects from AsyncLocalStorage
15
- import { dispatchCustomEvent } from "../../callbacks/dispatch/web.js";
16
- function reverse(s) {
17
- // Reverse a string.
18
- return s.split("").reverse().join("");
19
- }
20
- const originalCallbackValue = process.env.LANGCHAIN_CALLBACKS_BACKGROUND;
21
- afterEach(() => {
22
- process.env.LANGCHAIN_CALLBACKS_BACKGROUND = originalCallbackValue;
23
- });
24
- test("Runnable streamEvents method", async () => {
25
- const chain = RunnableLambda.from(reverse).withConfig({
26
- runName: "reverse",
27
- });
28
- const events = [];
29
- const eventStream = await chain.streamEvents("hello", { version: "v2" });
30
- for await (const event of eventStream) {
31
- events.push(event);
32
- }
33
- expect(events).toEqual([
34
- {
35
- data: { input: "hello" },
36
- event: "on_chain_start",
37
- metadata: {},
38
- name: "reverse",
39
- run_id: expect.any(String),
40
- tags: [],
41
- },
42
- {
43
- data: { chunk: "olleh" },
44
- event: "on_chain_stream",
45
- metadata: {},
46
- name: "reverse",
47
- run_id: expect.any(String),
48
- tags: [],
49
- },
50
- {
51
- data: { output: "olleh" },
52
- event: "on_chain_end",
53
- metadata: {},
54
- name: "reverse",
55
- run_id: expect.any(String),
56
- tags: [],
57
- },
58
- ]);
59
- });
60
- test("Runnable streamEvents method on a chat model", async () => {
61
- const model = new FakeListChatModel({
62
- responses: ["abc"],
63
- });
64
- const events = [];
65
- const eventStream = await model.streamEvents("hello", { version: "v2" });
66
- for await (const event of eventStream) {
67
- events.push(event);
68
- }
69
- expect(events).toMatchObject([
70
- {
71
- data: { input: "hello" },
72
- event: "on_chat_model_start",
73
- name: "FakeListChatModel",
74
- metadata: expect.any(Object),
75
- run_id: expect.any(String),
76
- tags: [],
77
- },
78
- {
79
- data: { chunk: new AIMessageChunk({ content: "a" }) },
80
- event: "on_chat_model_stream",
81
- name: "FakeListChatModel",
82
- metadata: expect.any(Object),
83
- run_id: expect.any(String),
84
- tags: [],
85
- },
86
- {
87
- data: { chunk: new AIMessageChunk({ content: "b" }) },
88
- event: "on_chat_model_stream",
89
- name: "FakeListChatModel",
90
- metadata: expect.any(Object),
91
- run_id: expect.any(String),
92
- tags: [],
93
- },
94
- {
95
- data: { chunk: new AIMessageChunk({ content: "c" }) },
96
- event: "on_chat_model_stream",
97
- name: "FakeListChatModel",
98
- metadata: expect.any(Object),
99
- run_id: expect.any(String),
100
- tags: [],
101
- },
102
- {
103
- data: { output: new AIMessageChunk({ content: "abc" }) },
104
- event: "on_chat_model_end",
105
- name: "FakeListChatModel",
106
- metadata: expect.any(Object),
107
- run_id: expect.any(String),
108
- tags: [],
109
- },
110
- ]);
111
- });
112
- test("Runnable streamEvents method with three runnables", async () => {
113
- const r = RunnableLambda.from(reverse);
114
- const chain = r
115
- .withConfig({ runName: "1" })
116
- .pipe(r.withConfig({ runName: "2" }))
117
- .pipe(r.withConfig({ runName: "3" }));
118
- const events = [];
119
- const eventStream = await chain.streamEvents("hello", { version: "v2" });
120
- for await (const event of eventStream) {
121
- events.push(event);
122
- }
123
- expect(events).toEqual([
124
- {
125
- data: { input: "hello" },
126
- event: "on_chain_start",
127
- metadata: {},
128
- name: "RunnableSequence",
129
- run_id: expect.any(String),
130
- tags: [],
131
- },
132
- {
133
- data: {},
134
- event: "on_chain_start",
135
- metadata: {},
136
- name: "1",
137
- run_id: expect.any(String),
138
- tags: ["seq:step:1"],
139
- },
140
- {
141
- data: { chunk: "olleh" },
142
- event: "on_chain_stream",
143
- metadata: {},
144
- name: "1",
145
- run_id: expect.any(String),
146
- tags: ["seq:step:1"],
147
- },
148
- {
149
- data: {},
150
- event: "on_chain_start",
151
- metadata: {},
152
- name: "2",
153
- run_id: expect.any(String),
154
- tags: ["seq:step:2"],
155
- },
156
- {
157
- data: { input: "hello", output: "olleh" },
158
- event: "on_chain_end",
159
- metadata: {},
160
- name: "1",
161
- run_id: expect.any(String),
162
- tags: ["seq:step:1"],
163
- },
164
- {
165
- data: { chunk: "hello" },
166
- event: "on_chain_stream",
167
- metadata: {},
168
- name: "2",
169
- run_id: expect.any(String),
170
- tags: ["seq:step:2"],
171
- },
172
- {
173
- data: {},
174
- event: "on_chain_start",
175
- metadata: {},
176
- name: "3",
177
- run_id: expect.any(String),
178
- tags: ["seq:step:3"],
179
- },
180
- {
181
- data: { input: "olleh", output: "hello" },
182
- event: "on_chain_end",
183
- metadata: {},
184
- name: "2",
185
- run_id: expect.any(String),
186
- tags: ["seq:step:2"],
187
- },
188
- {
189
- data: { chunk: "olleh" },
190
- event: "on_chain_stream",
191
- metadata: {},
192
- name: "3",
193
- run_id: expect.any(String),
194
- tags: ["seq:step:3"],
195
- },
196
- {
197
- data: { chunk: "olleh" },
198
- event: "on_chain_stream",
199
- metadata: {},
200
- name: "RunnableSequence",
201
- run_id: expect.any(String),
202
- tags: [],
203
- },
204
- {
205
- data: { input: "hello", output: "olleh" },
206
- event: "on_chain_end",
207
- metadata: {},
208
- name: "3",
209
- run_id: expect.any(String),
210
- tags: ["seq:step:3"],
211
- },
212
- {
213
- data: { output: "olleh" },
214
- event: "on_chain_end",
215
- metadata: {},
216
- name: "RunnableSequence",
217
- run_id: expect.any(String),
218
- tags: [],
219
- },
220
- ]);
221
- });
222
- test("Runnable streamEvents method with three runnables with backgrounded callbacks set to true", async () => {
223
- process.env.LANGCHAIN_CALLBACKS_BACKGROUND = "true";
224
- const r = RunnableLambda.from(reverse);
225
- const chain = r
226
- .withConfig({ runName: "1" })
227
- .pipe(r.withConfig({ runName: "2" }))
228
- .pipe(r.withConfig({ runName: "3" }));
229
- const events = [];
230
- const eventStream = await chain.streamEvents("hello", { version: "v2" });
231
- for await (const event of eventStream) {
232
- events.push(event);
233
- }
234
- expect(events).toEqual([
235
- {
236
- data: { input: "hello" },
237
- event: "on_chain_start",
238
- metadata: {},
239
- name: "RunnableSequence",
240
- run_id: expect.any(String),
241
- tags: [],
242
- },
243
- {
244
- data: {},
245
- event: "on_chain_start",
246
- metadata: {},
247
- name: "1",
248
- run_id: expect.any(String),
249
- tags: ["seq:step:1"],
250
- },
251
- {
252
- data: { chunk: "olleh" },
253
- event: "on_chain_stream",
254
- metadata: {},
255
- name: "1",
256
- run_id: expect.any(String),
257
- tags: ["seq:step:1"],
258
- },
259
- {
260
- data: {},
261
- event: "on_chain_start",
262
- metadata: {},
263
- name: "2",
264
- run_id: expect.any(String),
265
- tags: ["seq:step:2"],
266
- },
267
- {
268
- data: { input: "hello", output: "olleh" },
269
- event: "on_chain_end",
270
- metadata: {},
271
- name: "1",
272
- run_id: expect.any(String),
273
- tags: ["seq:step:1"],
274
- },
275
- {
276
- data: { chunk: "hello" },
277
- event: "on_chain_stream",
278
- metadata: {},
279
- name: "2",
280
- run_id: expect.any(String),
281
- tags: ["seq:step:2"],
282
- },
283
- {
284
- data: {},
285
- event: "on_chain_start",
286
- metadata: {},
287
- name: "3",
288
- run_id: expect.any(String),
289
- tags: ["seq:step:3"],
290
- },
291
- {
292
- data: { input: "olleh", output: "hello" },
293
- event: "on_chain_end",
294
- metadata: {},
295
- name: "2",
296
- run_id: expect.any(String),
297
- tags: ["seq:step:2"],
298
- },
299
- {
300
- data: { chunk: "olleh" },
301
- event: "on_chain_stream",
302
- metadata: {},
303
- name: "3",
304
- run_id: expect.any(String),
305
- tags: ["seq:step:3"],
306
- },
307
- {
308
- data: { chunk: "olleh" },
309
- event: "on_chain_stream",
310
- metadata: {},
311
- name: "RunnableSequence",
312
- run_id: expect.any(String),
313
- tags: [],
314
- },
315
- {
316
- data: { input: "hello", output: "olleh" },
317
- event: "on_chain_end",
318
- metadata: {},
319
- name: "3",
320
- run_id: expect.any(String),
321
- tags: ["seq:step:3"],
322
- },
323
- {
324
- data: { output: "olleh" },
325
- event: "on_chain_end",
326
- metadata: {},
327
- name: "RunnableSequence",
328
- run_id: expect.any(String),
329
- tags: [],
330
- },
331
- ]);
332
- });
333
- test("Runnable streamEvents method with three runnables with filtering", async () => {
334
- const r = RunnableLambda.from(reverse);
335
- const chain = r
336
- .withConfig({ runName: "1" })
337
- .pipe(r.withConfig({ runName: "2", tags: ["my_tag"] }))
338
- .pipe(r.withConfig({ runName: "3", tags: ["my_tag"] }));
339
- const events = [];
340
- const eventStream = await chain.streamEvents("hello", { version: "v2" }, {
341
- includeNames: ["1"],
342
- });
343
- for await (const event of eventStream) {
344
- events.push(event);
345
- }
346
- expect(events).toEqual([
347
- {
348
- data: { input: "hello" },
349
- event: "on_chain_start",
350
- metadata: {},
351
- name: "1",
352
- run_id: expect.any(String),
353
- tags: ["seq:step:1"],
354
- },
355
- {
356
- data: { chunk: "olleh" },
357
- event: "on_chain_stream",
358
- metadata: {},
359
- name: "1",
360
- run_id: expect.any(String),
361
- tags: ["seq:step:1"],
362
- },
363
- {
364
- data: { output: "olleh" },
365
- event: "on_chain_end",
366
- metadata: {},
367
- name: "1",
368
- run_id: expect.any(String),
369
- tags: ["seq:step:1"],
370
- },
371
- ]);
372
- const events2 = [];
373
- const eventStream2 = await chain.streamEvents("hello", { version: "v2" }, {
374
- excludeNames: ["2"],
375
- includeTags: ["my_tag"],
376
- });
377
- for await (const event of eventStream2) {
378
- events2.push(event);
379
- }
380
- expect(events2).toEqual([
381
- {
382
- data: {
383
- input: "hello",
384
- },
385
- event: "on_chain_start",
386
- metadata: {},
387
- name: "3",
388
- run_id: expect.any(String),
389
- tags: expect.arrayContaining(["seq:step:3", "my_tag"]),
390
- },
391
- {
392
- data: { chunk: "olleh" },
393
- event: "on_chain_stream",
394
- metadata: {},
395
- name: "3",
396
- run_id: expect.any(String),
397
- tags: expect.arrayContaining(["seq:step:3", "my_tag"]),
398
- },
399
- {
400
- data: { output: "olleh" },
401
- event: "on_chain_end",
402
- metadata: {},
403
- name: "3",
404
- run_id: expect.any(String),
405
- tags: expect.arrayContaining(["seq:step:3", "my_tag"]),
406
- },
407
- ]);
408
- });
409
- test("Runnable streamEvents method with a runnable map", async () => {
410
- const r = RunnableLambda.from(reverse);
411
- const chain = RunnableMap.from({
412
- reversed: r,
413
- original: new RunnablePassthrough(),
414
- }).pipe(new RunnablePick("reversed"));
415
- const events = [];
416
- const eventStream = await chain.streamEvents("hello", { version: "v2" });
417
- for await (const event of eventStream) {
418
- events.push(event);
419
- }
420
- expect(events).toEqual([
421
- {
422
- run_id: expect.any(String),
423
- event: "on_chain_start",
424
- name: "RunnableSequence",
425
- tags: [],
426
- metadata: {},
427
- data: { input: "hello" },
428
- },
429
- {
430
- event: "on_chain_start",
431
- name: "RunnableMap",
432
- run_id: expect.any(String),
433
- tags: ["seq:step:1"],
434
- metadata: {},
435
- data: {},
436
- },
437
- {
438
- event: "on_chain_start",
439
- name: "RunnableLambda",
440
- run_id: expect.any(String),
441
- tags: ["map:key:reversed"],
442
- metadata: {},
443
- data: {},
444
- },
445
- {
446
- event: "on_chain_start",
447
- name: "RunnablePassthrough",
448
- run_id: expect.any(String),
449
- tags: ["map:key:original"],
450
- metadata: {},
451
- data: {},
452
- },
453
- {
454
- event: "on_chain_stream",
455
- name: "RunnablePassthrough",
456
- run_id: expect.any(String),
457
- tags: ["map:key:original"],
458
- metadata: {},
459
- data: { chunk: "hello" },
460
- },
461
- {
462
- event: "on_chain_stream",
463
- name: "RunnableLambda",
464
- run_id: expect.any(String),
465
- tags: ["map:key:reversed"],
466
- metadata: {},
467
- data: { chunk: "olleh" },
468
- },
469
- {
470
- event: "on_chain_stream",
471
- name: "RunnableMap",
472
- run_id: expect.any(String),
473
- tags: ["seq:step:1"],
474
- metadata: {},
475
- data: {
476
- chunk: {
477
- original: "hello",
478
- },
479
- },
480
- },
481
- {
482
- event: "on_chain_start",
483
- name: "RunnablePick",
484
- run_id: expect.any(String),
485
- tags: ["seq:step:2"],
486
- metadata: {},
487
- data: {},
488
- },
489
- {
490
- event: "on_chain_stream",
491
- name: "RunnableMap",
492
- run_id: expect.any(String),
493
- tags: ["seq:step:1"],
494
- metadata: {},
495
- data: {
496
- chunk: {
497
- reversed: "olleh",
498
- },
499
- },
500
- },
501
- {
502
- event: "on_chain_end",
503
- name: "RunnablePassthrough",
504
- run_id: expect.any(String),
505
- tags: ["map:key:original"],
506
- metadata: {},
507
- data: { input: "hello", output: "hello" },
508
- },
509
- {
510
- event: "on_chain_stream",
511
- name: "RunnablePick",
512
- run_id: expect.any(String),
513
- tags: ["seq:step:2"],
514
- metadata: {},
515
- data: { chunk: "olleh" },
516
- },
517
- {
518
- event: "on_chain_stream",
519
- run_id: expect.any(String),
520
- tags: [],
521
- metadata: {},
522
- name: "RunnableSequence",
523
- data: { chunk: "olleh" },
524
- },
525
- {
526
- event: "on_chain_end",
527
- name: "RunnableLambda",
528
- run_id: expect.any(String),
529
- tags: ["map:key:reversed"],
530
- metadata: {},
531
- data: { input: "hello", output: "olleh" },
532
- },
533
- {
534
- event: "on_chain_end",
535
- name: "RunnableMap",
536
- run_id: expect.any(String),
537
- tags: ["seq:step:1"],
538
- metadata: {},
539
- data: {
540
- input: "hello",
541
- output: {
542
- original: "hello",
543
- reversed: "olleh",
544
- },
545
- },
546
- },
547
- {
548
- event: "on_chain_end",
549
- name: "RunnablePick",
550
- run_id: expect.any(String),
551
- tags: ["seq:step:2"],
552
- metadata: {},
553
- data: {
554
- input: {
555
- original: "hello",
556
- reversed: "olleh",
557
- },
558
- output: "olleh",
559
- },
560
- },
561
- {
562
- event: "on_chain_end",
563
- name: "RunnableSequence",
564
- run_id: expect.any(String),
565
- tags: [],
566
- metadata: {},
567
- data: { output: "olleh" },
568
- },
569
- ]);
570
- });
571
- test("Runnable streamEvents method with llm", async () => {
572
- const model = new FakeStreamingLLM({
573
- responses: ["hey!"],
574
- }).withConfig({
575
- metadata: { a: "b" },
576
- tags: ["my_model"],
577
- runName: "my_model",
578
- });
579
- const events = [];
580
- const eventStream = await model.streamEvents("hello", { version: "v2" });
581
- for await (const event of eventStream) {
582
- events.push(event);
583
- }
584
- expect(events).toEqual([
585
- {
586
- event: "on_llm_start",
587
- data: {
588
- input: "hello",
589
- },
590
- name: "my_model",
591
- tags: ["my_model"],
592
- run_id: expect.any(String),
593
- metadata: {
594
- a: "b",
595
- },
596
- },
597
- {
598
- event: "on_llm_stream",
599
- data: {
600
- chunk: {
601
- text: "h",
602
- },
603
- },
604
- run_id: expect.any(String),
605
- name: "my_model",
606
- tags: ["my_model"],
607
- metadata: {
608
- a: "b",
609
- },
610
- },
611
- {
612
- event: "on_llm_stream",
613
- data: {
614
- chunk: {
615
- text: "e",
616
- },
617
- },
618
- run_id: expect.any(String),
619
- name: "my_model",
620
- tags: ["my_model"],
621
- metadata: {
622
- a: "b",
623
- },
624
- },
625
- {
626
- event: "on_llm_stream",
627
- data: {
628
- chunk: {
629
- text: "y",
630
- },
631
- },
632
- run_id: expect.any(String),
633
- name: "my_model",
634
- tags: ["my_model"],
635
- metadata: {
636
- a: "b",
637
- },
638
- },
639
- {
640
- event: "on_llm_stream",
641
- data: {
642
- chunk: {
643
- text: "!",
644
- },
645
- },
646
- run_id: expect.any(String),
647
- name: "my_model",
648
- tags: ["my_model"],
649
- metadata: {
650
- a: "b",
651
- },
652
- },
653
- {
654
- event: "on_llm_end",
655
- data: {
656
- output: {
657
- generations: [
658
- [
659
- {
660
- text: "hey!",
661
- generationInfo: {},
662
- },
663
- ],
664
- ],
665
- llmOutput: {},
666
- },
667
- },
668
- run_id: expect.any(String),
669
- name: "my_model",
670
- tags: ["my_model"],
671
- metadata: {
672
- a: "b",
673
- },
674
- },
675
- ]);
676
- });
677
- test("Runnable streamEvents method with chat model chain", async () => {
678
- const template = ChatPromptTemplate.fromMessages([
679
- ["system", "You are Godzilla"],
680
- ["human", "{question}"],
681
- ]).withConfig({
682
- runName: "my_template",
683
- tags: ["my_template"],
684
- });
685
- const model = new FakeListChatModel({
686
- responses: ["ROAR"],
687
- }).withConfig({
688
- metadata: { a: "b" },
689
- tags: ["my_model"],
690
- runName: "my_model",
691
- });
692
- const chain = template.pipe(model).withConfig({
693
- metadata: { foo: "bar" },
694
- tags: ["my_chain"],
695
- runName: "my_chain",
696
- });
697
- const events = [];
698
- const eventStream = await chain.streamEvents({ question: "hello" }, { version: "v2" });
699
- for await (const event of eventStream) {
700
- events.push(event);
701
- }
702
- expect(events).toEqual([
703
- {
704
- run_id: expect.any(String),
705
- event: "on_chain_start",
706
- name: "my_chain",
707
- tags: ["my_chain"],
708
- metadata: {
709
- foo: "bar",
710
- },
711
- data: {
712
- input: {
713
- question: "hello",
714
- },
715
- },
716
- },
717
- {
718
- data: { input: { question: "hello" } },
719
- event: "on_prompt_start",
720
- metadata: { foo: "bar" },
721
- name: "my_template",
722
- run_id: expect.any(String),
723
- tags: expect.arrayContaining(["my_chain", "seq:step:1", "my_template"]),
724
- },
725
- {
726
- event: "on_prompt_end",
727
- name: "my_template",
728
- run_id: expect.any(String),
729
- tags: expect.arrayContaining(["seq:step:1", "my_template", "my_chain"]),
730
- metadata: {
731
- foo: "bar",
732
- },
733
- data: {
734
- input: {
735
- question: "hello",
736
- },
737
- output: await template.invoke({ question: "hello" }),
738
- },
739
- },
740
- {
741
- event: "on_chat_model_start",
742
- name: "my_model",
743
- run_id: expect.any(String),
744
- tags: expect.arrayContaining(["seq:step:2", "my_model", "my_chain"]),
745
- metadata: {
746
- foo: "bar",
747
- a: "b",
748
- ls_model_type: "chat",
749
- ls_stop: undefined,
750
- },
751
- data: {
752
- input: {
753
- messages: [
754
- [new SystemMessage("You are Godzilla"), new HumanMessage("hello")],
755
- ],
756
- },
757
- },
758
- },
759
- {
760
- event: "on_chat_model_stream",
761
- run_id: expect.any(String),
762
- tags: expect.arrayContaining(["my_chain", "my_model", "seq:step:2"]),
763
- metadata: {
764
- a: "b",
765
- foo: "bar",
766
- ls_model_type: "chat",
767
- ls_stop: undefined,
768
- },
769
- name: "my_model",
770
- data: { chunk: new AIMessageChunk("R") },
771
- },
772
- {
773
- event: "on_chain_stream",
774
- run_id: expect.any(String),
775
- tags: ["my_chain"],
776
- metadata: {
777
- foo: "bar",
778
- },
779
- name: "my_chain",
780
- data: { chunk: new AIMessageChunk("R") },
781
- },
782
- {
783
- event: "on_chat_model_stream",
784
- run_id: expect.any(String),
785
- tags: expect.arrayContaining(["my_chain", "my_model", "seq:step:2"]),
786
- metadata: {
787
- a: "b",
788
- foo: "bar",
789
- ls_model_type: "chat",
790
- ls_stop: undefined,
791
- },
792
- name: "my_model",
793
- data: { chunk: new AIMessageChunk("O") },
794
- },
795
- {
796
- event: "on_chain_stream",
797
- run_id: expect.any(String),
798
- tags: ["my_chain"],
799
- metadata: {
800
- foo: "bar",
801
- },
802
- name: "my_chain",
803
- data: { chunk: new AIMessageChunk("O") },
804
- },
805
- {
806
- event: "on_chat_model_stream",
807
- run_id: expect.any(String),
808
- tags: expect.arrayContaining(["my_chain", "my_model", "seq:step:2"]),
809
- metadata: {
810
- a: "b",
811
- foo: "bar",
812
- ls_model_type: "chat",
813
- ls_stop: undefined,
814
- },
815
- name: "my_model",
816
- data: { chunk: new AIMessageChunk("A") },
817
- },
818
- {
819
- event: "on_chain_stream",
820
- run_id: expect.any(String),
821
- tags: ["my_chain"],
822
- metadata: {
823
- foo: "bar",
824
- },
825
- name: "my_chain",
826
- data: { chunk: new AIMessageChunk("A") },
827
- },
828
- {
829
- event: "on_chat_model_stream",
830
- run_id: expect.any(String),
831
- tags: expect.arrayContaining(["my_chain", "my_model", "seq:step:2"]),
832
- metadata: {
833
- a: "b",
834
- foo: "bar",
835
- ls_model_type: "chat",
836
- ls_stop: undefined,
837
- },
838
- name: "my_model",
839
- data: { chunk: new AIMessageChunk("R") },
840
- },
841
- {
842
- event: "on_chain_stream",
843
- run_id: expect.any(String),
844
- tags: ["my_chain"],
845
- metadata: {
846
- foo: "bar",
847
- },
848
- name: "my_chain",
849
- data: { chunk: new AIMessageChunk("R") },
850
- },
851
- {
852
- event: "on_chat_model_end",
853
- name: "my_model",
854
- run_id: expect.any(String),
855
- tags: expect.arrayContaining(["seq:step:2", "my_model", "my_chain"]),
856
- metadata: {
857
- foo: "bar",
858
- a: "b",
859
- ls_model_type: "chat",
860
- ls_stop: undefined,
861
- },
862
- data: {
863
- input: {
864
- messages: [
865
- [new SystemMessage("You are Godzilla"), new HumanMessage("hello")],
866
- ],
867
- },
868
- output: new AIMessageChunk("ROAR"),
869
- },
870
- },
871
- {
872
- event: "on_chain_end",
873
- name: "my_chain",
874
- run_id: expect.any(String),
875
- tags: ["my_chain"],
876
- metadata: {
877
- foo: "bar",
878
- },
879
- data: {
880
- output: new AIMessageChunk("ROAR"),
881
- },
882
- },
883
- ]);
884
- });
885
- test("Chat model that supports streaming, but is invoked, should still emit on_stream events", async () => {
886
- const template = ChatPromptTemplate.fromMessages([
887
- ["system", "You are Godzilla"],
888
- ["human", "{question}"],
889
- ]).withConfig({
890
- runName: "my_template",
891
- tags: ["my_template"],
892
- });
893
- const model = new FakeListChatModel({
894
- responses: ["ROAR"],
895
- }).withConfig({
896
- metadata: { a: "b" },
897
- tags: ["my_model"],
898
- runName: "my_model",
899
- });
900
- const chain = template
901
- .pipe(async (val, config) => {
902
- const result = await model.invoke(val, config);
903
- return result;
904
- })
905
- .withConfig({
906
- metadata: { foo: "bar" },
907
- tags: ["my_chain"],
908
- runName: "my_chain",
909
- });
910
- const events = [];
911
- const eventStream = await chain.streamEvents({ question: "hello" }, { version: "v2" });
912
- for await (const event of eventStream) {
913
- events.push(event);
914
- }
915
- expect(events).toEqual([
916
- {
917
- run_id: expect.any(String),
918
- event: "on_chain_start",
919
- name: "my_chain",
920
- tags: ["my_chain"],
921
- metadata: {
922
- foo: "bar",
923
- },
924
- data: {
925
- input: {
926
- question: "hello",
927
- },
928
- },
929
- },
930
- {
931
- data: { input: { question: "hello" } },
932
- event: "on_prompt_start",
933
- metadata: { foo: "bar" },
934
- name: "my_template",
935
- run_id: expect.any(String),
936
- tags: expect.arrayContaining(["my_chain", "seq:step:1", "my_template"]),
937
- },
938
- {
939
- event: "on_prompt_end",
940
- name: "my_template",
941
- run_id: expect.any(String),
942
- tags: expect.arrayContaining(["seq:step:1", "my_template", "my_chain"]),
943
- metadata: {
944
- foo: "bar",
945
- },
946
- data: {
947
- input: {
948
- question: "hello",
949
- },
950
- output: await template.invoke({ question: "hello" }),
951
- },
952
- },
953
- {
954
- event: "on_chain_start",
955
- data: {},
956
- name: "RunnableLambda",
957
- tags: ["seq:step:2", "my_chain"],
958
- run_id: expect.any(String),
959
- metadata: {
960
- foo: "bar",
961
- },
962
- },
963
- {
964
- event: "on_chat_model_start",
965
- name: "my_model",
966
- run_id: expect.any(String),
967
- tags: expect.arrayContaining(["my_model", "my_chain"]),
968
- metadata: {
969
- foo: "bar",
970
- a: "b",
971
- ls_model_type: "chat",
972
- ls_stop: undefined,
973
- },
974
- data: {
975
- input: {
976
- messages: [
977
- [new SystemMessage("You are Godzilla"), new HumanMessage("hello")],
978
- ],
979
- },
980
- },
981
- },
982
- {
983
- event: "on_chat_model_stream",
984
- run_id: expect.any(String),
985
- tags: expect.arrayContaining(["my_chain", "my_model"]),
986
- metadata: {
987
- a: "b",
988
- foo: "bar",
989
- ls_model_type: "chat",
990
- ls_stop: undefined,
991
- },
992
- name: "my_model",
993
- data: { chunk: new AIMessageChunk("R") },
994
- },
995
- {
996
- event: "on_chat_model_stream",
997
- run_id: expect.any(String),
998
- tags: expect.arrayContaining(["my_chain", "my_model"]),
999
- metadata: {
1000
- a: "b",
1001
- foo: "bar",
1002
- ls_model_type: "chat",
1003
- ls_stop: undefined,
1004
- },
1005
- name: "my_model",
1006
- data: { chunk: new AIMessageChunk("O") },
1007
- },
1008
- {
1009
- event: "on_chat_model_stream",
1010
- run_id: expect.any(String),
1011
- tags: expect.arrayContaining(["my_chain", "my_model"]),
1012
- metadata: {
1013
- a: "b",
1014
- foo: "bar",
1015
- ls_model_type: "chat",
1016
- ls_stop: undefined,
1017
- },
1018
- name: "my_model",
1019
- data: { chunk: new AIMessageChunk("A") },
1020
- },
1021
- {
1022
- event: "on_chat_model_stream",
1023
- run_id: expect.any(String),
1024
- tags: expect.arrayContaining(["my_chain", "my_model"]),
1025
- metadata: {
1026
- a: "b",
1027
- foo: "bar",
1028
- ls_model_type: "chat",
1029
- ls_stop: undefined,
1030
- },
1031
- name: "my_model",
1032
- data: { chunk: new AIMessageChunk("R") },
1033
- },
1034
- {
1035
- event: "on_chat_model_end",
1036
- name: "my_model",
1037
- run_id: expect.any(String),
1038
- tags: expect.arrayContaining(["my_model", "my_chain"]),
1039
- metadata: {
1040
- foo: "bar",
1041
- a: "b",
1042
- ls_model_type: "chat",
1043
- ls_stop: undefined,
1044
- },
1045
- data: {
1046
- input: {
1047
- messages: [
1048
- [new SystemMessage("You are Godzilla"), new HumanMessage("hello")],
1049
- ],
1050
- },
1051
- output: new AIMessageChunk("ROAR"),
1052
- },
1053
- },
1054
- {
1055
- event: "on_chain_stream",
1056
- run_id: expect.any(String),
1057
- tags: expect.arrayContaining(["seq:step:2", "my_chain"]),
1058
- metadata: {
1059
- foo: "bar",
1060
- },
1061
- name: "RunnableLambda",
1062
- data: { chunk: new AIMessageChunk("ROAR") },
1063
- },
1064
- {
1065
- event: "on_chain_stream",
1066
- run_id: expect.any(String),
1067
- tags: ["my_chain"],
1068
- metadata: {
1069
- foo: "bar",
1070
- },
1071
- name: "my_chain",
1072
- data: { chunk: new AIMessageChunk("ROAR") },
1073
- },
1074
- {
1075
- event: "on_chain_end",
1076
- name: "RunnableLambda",
1077
- run_id: expect.any(String),
1078
- tags: expect.arrayContaining(["seq:step:2", "my_chain"]),
1079
- metadata: {
1080
- foo: "bar",
1081
- },
1082
- data: {
1083
- input: await template.invoke({ question: "hello" }),
1084
- output: new AIMessageChunk("ROAR"),
1085
- },
1086
- },
1087
- {
1088
- event: "on_chain_end",
1089
- name: "my_chain",
1090
- run_id: expect.any(String),
1091
- tags: ["my_chain"],
1092
- metadata: {
1093
- foo: "bar",
1094
- },
1095
- data: {
1096
- output: new AIMessageChunk("ROAR"),
1097
- },
1098
- },
1099
- ]);
1100
- });
1101
- test("Chat model that doesn't support streaming, but is invoked, should emit one on_stream event", async () => {
1102
- const template = ChatPromptTemplate.fromMessages([
1103
- ["system", "You are Godzilla"],
1104
- ["human", "{question}"],
1105
- ]).withConfig({
1106
- runName: "my_template",
1107
- tags: ["my_template"],
1108
- });
1109
- const model = new FakeChatModel({}).withConfig({
1110
- metadata: { a: "b" },
1111
- tags: ["my_model"],
1112
- runName: "my_model",
1113
- });
1114
- const chain = template
1115
- .pipe(async (val, config) => {
1116
- const result = await model.invoke(val, config);
1117
- return result;
1118
- })
1119
- .withConfig({
1120
- metadata: { foo: "bar" },
1121
- tags: ["my_chain"],
1122
- runName: "my_chain",
1123
- });
1124
- const events = [];
1125
- const eventStream = await chain.streamEvents({ question: "hello" }, { version: "v2" });
1126
- for await (const event of eventStream) {
1127
- events.push(event);
1128
- }
1129
- expect(events).toEqual([
1130
- {
1131
- run_id: expect.any(String),
1132
- event: "on_chain_start",
1133
- name: "my_chain",
1134
- tags: ["my_chain"],
1135
- metadata: {
1136
- foo: "bar",
1137
- },
1138
- data: {
1139
- input: {
1140
- question: "hello",
1141
- },
1142
- },
1143
- },
1144
- {
1145
- data: { input: { question: "hello" } },
1146
- event: "on_prompt_start",
1147
- metadata: { foo: "bar" },
1148
- name: "my_template",
1149
- run_id: expect.any(String),
1150
- tags: expect.arrayContaining(["my_chain", "seq:step:1", "my_template"]),
1151
- },
1152
- {
1153
- event: "on_prompt_end",
1154
- name: "my_template",
1155
- run_id: expect.any(String),
1156
- tags: expect.arrayContaining(["seq:step:1", "my_template", "my_chain"]),
1157
- metadata: {
1158
- foo: "bar",
1159
- },
1160
- data: {
1161
- input: {
1162
- question: "hello",
1163
- },
1164
- output: await template.invoke({ question: "hello" }),
1165
- },
1166
- },
1167
- {
1168
- event: "on_chain_start",
1169
- data: {},
1170
- name: "RunnableLambda",
1171
- tags: ["seq:step:2", "my_chain"],
1172
- run_id: expect.any(String),
1173
- metadata: {
1174
- foo: "bar",
1175
- },
1176
- },
1177
- {
1178
- event: "on_chat_model_start",
1179
- name: "my_model",
1180
- run_id: expect.any(String),
1181
- tags: expect.arrayContaining(["my_model", "my_chain"]),
1182
- metadata: {
1183
- foo: "bar",
1184
- a: "b",
1185
- ls_model_type: "chat",
1186
- ls_stop: undefined,
1187
- },
1188
- data: {
1189
- input: {
1190
- messages: [
1191
- [new SystemMessage("You are Godzilla"), new HumanMessage("hello")],
1192
- ],
1193
- },
1194
- },
1195
- },
1196
- {
1197
- event: "on_chat_model_stream",
1198
- run_id: expect.any(String),
1199
- tags: expect.arrayContaining(["my_chain", "my_model"]),
1200
- metadata: {
1201
- a: "b",
1202
- foo: "bar",
1203
- ls_model_type: "chat",
1204
- ls_stop: undefined,
1205
- },
1206
- name: "my_model",
1207
- data: { chunk: new AIMessageChunk("You are Godzilla\nhello") },
1208
- },
1209
- {
1210
- event: "on_chat_model_end",
1211
- name: "my_model",
1212
- run_id: expect.any(String),
1213
- tags: expect.arrayContaining(["my_model", "my_chain"]),
1214
- metadata: {
1215
- foo: "bar",
1216
- a: "b",
1217
- ls_model_type: "chat",
1218
- ls_stop: undefined,
1219
- },
1220
- data: {
1221
- input: {
1222
- messages: [
1223
- [new SystemMessage("You are Godzilla"), new HumanMessage("hello")],
1224
- ],
1225
- },
1226
- output: new AIMessage("You are Godzilla\nhello"),
1227
- },
1228
- },
1229
- {
1230
- event: "on_chain_stream",
1231
- run_id: expect.any(String),
1232
- tags: expect.arrayContaining(["seq:step:2", "my_chain"]),
1233
- metadata: {
1234
- foo: "bar",
1235
- },
1236
- name: "RunnableLambda",
1237
- data: { chunk: new AIMessage("You are Godzilla\nhello") },
1238
- },
1239
- {
1240
- event: "on_chain_stream",
1241
- run_id: expect.any(String),
1242
- tags: ["my_chain"],
1243
- metadata: {
1244
- foo: "bar",
1245
- },
1246
- name: "my_chain",
1247
- data: { chunk: new AIMessage("You are Godzilla\nhello") },
1248
- },
1249
- {
1250
- event: "on_chain_end",
1251
- name: "RunnableLambda",
1252
- run_id: expect.any(String),
1253
- tags: expect.arrayContaining(["seq:step:2", "my_chain"]),
1254
- metadata: {
1255
- foo: "bar",
1256
- },
1257
- data: {
1258
- input: await template.invoke({ question: "hello" }),
1259
- output: new AIMessage("You are Godzilla\nhello"),
1260
- },
1261
- },
1262
- {
1263
- event: "on_chain_end",
1264
- name: "my_chain",
1265
- run_id: expect.any(String),
1266
- tags: ["my_chain"],
1267
- metadata: {
1268
- foo: "bar",
1269
- },
1270
- data: {
1271
- output: new AIMessage("You are Godzilla\nhello"),
1272
- },
1273
- },
1274
- ]);
1275
- });
1276
- test("LLM that supports streaming, but is invoked, should still emit on_stream events", async () => {
1277
- const template = PromptTemplate.fromTemplate(`You are Godzilla\n{question}`).withConfig({
1278
- runName: "my_template",
1279
- tags: ["my_template"],
1280
- });
1281
- const model = new FakeStreamingLLM({
1282
- responses: ["ROAR"],
1283
- }).withConfig({
1284
- metadata: { a: "b" },
1285
- tags: ["my_model"],
1286
- runName: "my_model",
1287
- });
1288
- const chain = template
1289
- .pipe(async (val, config) => {
1290
- const result = await model.invoke(val, config);
1291
- return result;
1292
- })
1293
- .withConfig({
1294
- metadata: { foo: "bar" },
1295
- tags: ["my_chain"],
1296
- runName: "my_chain",
1297
- });
1298
- const events = [];
1299
- const eventStream = await chain.streamEvents({ question: "hello" }, { version: "v2" });
1300
- for await (const event of eventStream) {
1301
- events.push(event);
1302
- }
1303
- expect(events).toEqual([
1304
- {
1305
- event: "on_chain_start",
1306
- data: {
1307
- input: {
1308
- question: "hello",
1309
- },
1310
- },
1311
- name: "my_chain",
1312
- tags: ["my_chain"],
1313
- run_id: expect.any(String),
1314
- metadata: {
1315
- foo: "bar",
1316
- },
1317
- },
1318
- {
1319
- event: "on_prompt_start",
1320
- data: {
1321
- input: {
1322
- question: "hello",
1323
- },
1324
- },
1325
- name: "my_template",
1326
- tags: ["seq:step:1", "my_template", "my_chain"],
1327
- run_id: expect.any(String),
1328
- metadata: {
1329
- foo: "bar",
1330
- },
1331
- },
1332
- {
1333
- event: "on_prompt_end",
1334
- data: {
1335
- output: await template.invoke({ question: "hello" }),
1336
- input: {
1337
- question: "hello",
1338
- },
1339
- },
1340
- run_id: expect.any(String),
1341
- name: "my_template",
1342
- tags: ["seq:step:1", "my_template", "my_chain"],
1343
- metadata: {
1344
- foo: "bar",
1345
- },
1346
- },
1347
- {
1348
- event: "on_chain_start",
1349
- data: {},
1350
- name: "RunnableLambda",
1351
- tags: ["seq:step:2", "my_chain"],
1352
- run_id: expect.any(String),
1353
- metadata: {
1354
- foo: "bar",
1355
- },
1356
- },
1357
- {
1358
- event: "on_llm_start",
1359
- data: {
1360
- input: {
1361
- prompts: ["You are Godzilla\nhello"],
1362
- },
1363
- },
1364
- name: "my_model",
1365
- tags: ["my_model", "my_chain"],
1366
- run_id: expect.any(String),
1367
- metadata: {
1368
- foo: "bar",
1369
- a: "b",
1370
- },
1371
- },
1372
- {
1373
- event: "on_llm_stream",
1374
- data: {
1375
- chunk: new GenerationChunk({
1376
- text: "R",
1377
- }),
1378
- },
1379
- run_id: expect.any(String),
1380
- name: "my_model",
1381
- tags: ["my_model", "my_chain"],
1382
- metadata: {
1383
- foo: "bar",
1384
- a: "b",
1385
- },
1386
- },
1387
- {
1388
- event: "on_llm_stream",
1389
- data: {
1390
- chunk: new GenerationChunk({
1391
- text: "O",
1392
- }),
1393
- },
1394
- run_id: expect.any(String),
1395
- name: "my_model",
1396
- tags: ["my_model", "my_chain"],
1397
- metadata: {
1398
- foo: "bar",
1399
- a: "b",
1400
- },
1401
- },
1402
- {
1403
- event: "on_llm_stream",
1404
- data: {
1405
- chunk: new GenerationChunk({
1406
- text: "A",
1407
- }),
1408
- },
1409
- run_id: expect.any(String),
1410
- name: "my_model",
1411
- tags: ["my_model", "my_chain"],
1412
- metadata: {
1413
- foo: "bar",
1414
- a: "b",
1415
- },
1416
- },
1417
- {
1418
- event: "on_llm_stream",
1419
- data: {
1420
- chunk: new GenerationChunk({
1421
- text: "R",
1422
- }),
1423
- },
1424
- run_id: expect.any(String),
1425
- name: "my_model",
1426
- tags: ["my_model", "my_chain"],
1427
- metadata: {
1428
- foo: "bar",
1429
- a: "b",
1430
- },
1431
- },
1432
- {
1433
- event: "on_llm_end",
1434
- data: {
1435
- output: {
1436
- generations: [
1437
- [
1438
- {
1439
- text: "ROAR",
1440
- generationInfo: {},
1441
- },
1442
- ],
1443
- ],
1444
- llmOutput: {},
1445
- },
1446
- input: {
1447
- prompts: ["You are Godzilla\nhello"],
1448
- },
1449
- },
1450
- run_id: expect.any(String),
1451
- name: "my_model",
1452
- tags: ["my_model", "my_chain"],
1453
- metadata: {
1454
- foo: "bar",
1455
- a: "b",
1456
- },
1457
- },
1458
- {
1459
- event: "on_chain_stream",
1460
- run_id: expect.any(String),
1461
- name: "RunnableLambda",
1462
- tags: ["seq:step:2", "my_chain"],
1463
- metadata: {
1464
- foo: "bar",
1465
- },
1466
- data: {
1467
- chunk: "ROAR",
1468
- },
1469
- },
1470
- {
1471
- event: "on_chain_stream",
1472
- run_id: expect.any(String),
1473
- name: "my_chain",
1474
- tags: ["my_chain"],
1475
- metadata: {
1476
- foo: "bar",
1477
- },
1478
- data: {
1479
- chunk: "ROAR",
1480
- },
1481
- },
1482
- {
1483
- event: "on_chain_end",
1484
- data: {
1485
- output: "ROAR",
1486
- input: await template.invoke({ question: "hello" }),
1487
- },
1488
- run_id: expect.any(String),
1489
- name: "RunnableLambda",
1490
- tags: ["seq:step:2", "my_chain"],
1491
- metadata: {
1492
- foo: "bar",
1493
- },
1494
- },
1495
- {
1496
- event: "on_chain_end",
1497
- data: {
1498
- output: "ROAR",
1499
- },
1500
- run_id: expect.any(String),
1501
- name: "my_chain",
1502
- tags: ["my_chain"],
1503
- metadata: {
1504
- foo: "bar",
1505
- },
1506
- },
1507
- ]);
1508
- });
1509
- test("LLM that doesn't support streaming, but is invoked, should emit one on_stream event", async () => {
1510
- const template = PromptTemplate.fromTemplate(`You are Godzilla\n{question}`).withConfig({
1511
- runName: "my_template",
1512
- tags: ["my_template"],
1513
- });
1514
- const model = new FakeLLM({}).withConfig({
1515
- metadata: { a: "b" },
1516
- tags: ["my_model"],
1517
- runName: "my_model",
1518
- });
1519
- const chain = template
1520
- .pipe(async (val, config) => {
1521
- const result = await model.invoke(val, config);
1522
- return result;
1523
- })
1524
- .withConfig({
1525
- metadata: { foo: "bar" },
1526
- tags: ["my_chain"],
1527
- runName: "my_chain",
1528
- });
1529
- const events = [];
1530
- const eventStream = await chain.streamEvents({ question: "hello" }, { version: "v2" });
1531
- for await (const event of eventStream) {
1532
- events.push(event);
1533
- }
1534
- expect(events).toEqual([
1535
- {
1536
- event: "on_chain_start",
1537
- data: {
1538
- input: {
1539
- question: "hello",
1540
- },
1541
- },
1542
- name: "my_chain",
1543
- tags: ["my_chain"],
1544
- run_id: expect.any(String),
1545
- metadata: {
1546
- foo: "bar",
1547
- },
1548
- },
1549
- {
1550
- event: "on_prompt_start",
1551
- data: {
1552
- input: {
1553
- question: "hello",
1554
- },
1555
- },
1556
- name: "my_template",
1557
- tags: ["seq:step:1", "my_template", "my_chain"],
1558
- run_id: expect.any(String),
1559
- metadata: {
1560
- foo: "bar",
1561
- },
1562
- },
1563
- {
1564
- event: "on_prompt_end",
1565
- data: {
1566
- output: await template.invoke({ question: "hello" }),
1567
- input: {
1568
- question: "hello",
1569
- },
1570
- },
1571
- run_id: expect.any(String),
1572
- name: "my_template",
1573
- tags: ["seq:step:1", "my_template", "my_chain"],
1574
- metadata: {
1575
- foo: "bar",
1576
- },
1577
- },
1578
- {
1579
- event: "on_chain_start",
1580
- data: {},
1581
- name: "RunnableLambda",
1582
- tags: ["seq:step:2", "my_chain"],
1583
- run_id: expect.any(String),
1584
- metadata: {
1585
- foo: "bar",
1586
- },
1587
- },
1588
- {
1589
- event: "on_llm_start",
1590
- data: {
1591
- input: {
1592
- prompts: ["You are Godzilla\nhello"],
1593
- },
1594
- },
1595
- name: "my_model",
1596
- tags: ["my_model", "my_chain"],
1597
- run_id: expect.any(String),
1598
- metadata: {
1599
- foo: "bar",
1600
- a: "b",
1601
- },
1602
- },
1603
- {
1604
- event: "on_llm_stream",
1605
- data: {
1606
- chunk: new GenerationChunk({
1607
- text: "You are Godzilla\nhello",
1608
- }),
1609
- },
1610
- run_id: expect.any(String),
1611
- name: "my_model",
1612
- tags: ["my_model", "my_chain"],
1613
- metadata: {
1614
- foo: "bar",
1615
- a: "b",
1616
- },
1617
- },
1618
- {
1619
- event: "on_llm_end",
1620
- data: {
1621
- output: {
1622
- generations: [
1623
- [
1624
- {
1625
- text: "You are Godzilla\nhello",
1626
- generationInfo: undefined,
1627
- },
1628
- ],
1629
- ],
1630
- llmOutput: {},
1631
- },
1632
- input: {
1633
- prompts: ["You are Godzilla\nhello"],
1634
- },
1635
- },
1636
- run_id: expect.any(String),
1637
- name: "my_model",
1638
- tags: ["my_model", "my_chain"],
1639
- metadata: {
1640
- foo: "bar",
1641
- a: "b",
1642
- },
1643
- },
1644
- {
1645
- event: "on_chain_stream",
1646
- run_id: expect.any(String),
1647
- name: "RunnableLambda",
1648
- tags: ["seq:step:2", "my_chain"],
1649
- metadata: {
1650
- foo: "bar",
1651
- },
1652
- data: {
1653
- chunk: "You are Godzilla\nhello",
1654
- },
1655
- },
1656
- {
1657
- event: "on_chain_stream",
1658
- run_id: expect.any(String),
1659
- name: "my_chain",
1660
- tags: ["my_chain"],
1661
- metadata: {
1662
- foo: "bar",
1663
- },
1664
- data: {
1665
- chunk: "You are Godzilla\nhello",
1666
- },
1667
- },
1668
- {
1669
- event: "on_chain_end",
1670
- data: {
1671
- output: "You are Godzilla\nhello",
1672
- input: await template.invoke({ question: "hello" }),
1673
- },
1674
- run_id: expect.any(String),
1675
- name: "RunnableLambda",
1676
- tags: ["seq:step:2", "my_chain"],
1677
- metadata: {
1678
- foo: "bar",
1679
- },
1680
- },
1681
- {
1682
- event: "on_chain_end",
1683
- data: {
1684
- output: "You are Godzilla\nhello",
1685
- },
1686
- run_id: expect.any(String),
1687
- name: "my_chain",
1688
- tags: ["my_chain"],
1689
- metadata: {
1690
- foo: "bar",
1691
- },
1692
- },
1693
- ]);
1694
- });
1695
- test("Runnable streamEvents method with simple tools", async () => {
1696
- const tool = new DynamicTool({
1697
- func: async () => "hello",
1698
- name: "parameterless",
1699
- description: "A tool that does nothing",
1700
- });
1701
- const events = [];
1702
- const eventStream = await tool.streamEvents({}, { version: "v2" });
1703
- for await (const event of eventStream) {
1704
- events.push(event);
1705
- }
1706
- expect(events).toEqual([
1707
- {
1708
- data: { input: {} },
1709
- event: "on_tool_start",
1710
- metadata: {},
1711
- name: "parameterless",
1712
- run_id: expect.any(String),
1713
- tags: [],
1714
- },
1715
- {
1716
- data: { output: "hello" },
1717
- event: "on_tool_end",
1718
- metadata: {},
1719
- name: "parameterless",
1720
- run_id: expect.any(String),
1721
- tags: [],
1722
- },
1723
- ]);
1724
- const toolWithParams = new DynamicStructuredTool({
1725
- func: async (params) => JSON.stringify({ x: params.x, y: params.y }),
1726
- schema: z.object({
1727
- x: z.number(),
1728
- y: z.string(),
1729
- }),
1730
- name: "with_parameters",
1731
- description: "A tool that does nothing",
1732
- });
1733
- const events2 = [];
1734
- const eventStream2 = await toolWithParams.streamEvents({ x: 1, y: "2" }, { version: "v2" });
1735
- for await (const event of eventStream2) {
1736
- events2.push(event);
1737
- }
1738
- expect(events2).toEqual([
1739
- {
1740
- data: { input: { x: 1, y: "2" } },
1741
- event: "on_tool_start",
1742
- metadata: {},
1743
- name: "with_parameters",
1744
- run_id: expect.any(String),
1745
- tags: [],
1746
- },
1747
- {
1748
- data: { output: JSON.stringify({ x: 1, y: "2" }) },
1749
- event: "on_tool_end",
1750
- metadata: {},
1751
- name: "with_parameters",
1752
- run_id: expect.any(String),
1753
- tags: [],
1754
- },
1755
- ]);
1756
- });
1757
- test("Runnable streamEvents method with a custom event", async () => {
1758
- const lambda = RunnableLambda.from(async (params, config) => {
1759
- await dispatchCustomEvent("testEvent", { someval: "test" }, config);
1760
- await dispatchCustomEvent("testEvent", { someval: "test2" }, config);
1761
- return JSON.stringify({ x: params.x, y: params.y });
1762
- });
1763
- const events = [];
1764
- const eventStream = await lambda.streamEvents({ x: 1, y: "2" }, { version: "v2" });
1765
- for await (const event of eventStream) {
1766
- events.push(event);
1767
- }
1768
- expect(events).toEqual([
1769
- {
1770
- event: "on_chain_start",
1771
- data: { input: { x: 1, y: "2" } },
1772
- name: "RunnableLambda",
1773
- tags: [],
1774
- run_id: expect.any(String),
1775
- metadata: {},
1776
- },
1777
- {
1778
- event: "on_custom_event",
1779
- run_id: expect.any(String),
1780
- name: "testEvent",
1781
- tags: [],
1782
- metadata: {},
1783
- data: { someval: "test" },
1784
- },
1785
- {
1786
- event: "on_custom_event",
1787
- run_id: expect.any(String),
1788
- name: "testEvent",
1789
- tags: [],
1790
- metadata: {},
1791
- data: { someval: "test2" },
1792
- },
1793
- {
1794
- event: "on_chain_stream",
1795
- run_id: expect.any(String),
1796
- name: "RunnableLambda",
1797
- tags: [],
1798
- metadata: {},
1799
- data: { chunk: '{"x":1,"y":"2"}' },
1800
- },
1801
- {
1802
- event: "on_chain_end",
1803
- data: { output: '{"x":1,"y":"2"}' },
1804
- run_id: expect.any(String),
1805
- name: "RunnableLambda",
1806
- tags: [],
1807
- metadata: {},
1808
- },
1809
- ]);
1810
- });
1811
- test("Custom event inside a custom tool", async () => {
1812
- const customTool = tool(async (params, config) => {
1813
- await dispatchCustomEvent("testEvent", { someval: "test" }, config);
1814
- await dispatchCustomEvent("testEvent", { someval: "test2" }, config);
1815
- return JSON.stringify({ x: params.x, y: params.y });
1816
- }, {
1817
- schema: z.object({ x: z.number(), y: z.string() }),
1818
- name: "testtool",
1819
- });
1820
- const events = [];
1821
- const eventStream = await customTool.streamEvents({ x: 1, y: "2" }, { version: "v2" });
1822
- for await (const event of eventStream) {
1823
- events.push(event);
1824
- }
1825
- expect(events).toEqual([
1826
- {
1827
- event: "on_tool_start",
1828
- data: { input: { x: 1, y: "2" } },
1829
- name: "testtool",
1830
- tags: [],
1831
- run_id: expect.any(String),
1832
- metadata: {},
1833
- },
1834
- {
1835
- event: "on_custom_event",
1836
- run_id: expect.any(String),
1837
- name: "testEvent",
1838
- tags: [],
1839
- metadata: {},
1840
- data: { someval: "test" },
1841
- },
1842
- {
1843
- event: "on_custom_event",
1844
- run_id: expect.any(String),
1845
- name: "testEvent",
1846
- tags: [],
1847
- metadata: {},
1848
- data: { someval: "test2" },
1849
- },
1850
- {
1851
- event: "on_tool_end",
1852
- data: { output: '{"x":1,"y":"2"}' },
1853
- run_id: expect.any(String),
1854
- name: "testtool",
1855
- tags: [],
1856
- metadata: {},
1857
- },
1858
- ]);
1859
- });
1860
- test("Runnable streamEvents method with tools that return objects", async () => {
1861
- const adderFunc = (_params) => {
1862
- return JSON.stringify({ sum: 3 });
1863
- };
1864
- const parameterlessTool = tool(adderFunc, {
1865
- name: "parameterless",
1866
- });
1867
- const events = [];
1868
- const eventStream = parameterlessTool.streamEvents({}, { version: "v2" });
1869
- for await (const event of eventStream) {
1870
- events.push(event);
1871
- }
1872
- expect(events).toEqual([
1873
- {
1874
- data: { input: {} },
1875
- event: "on_tool_start",
1876
- metadata: {},
1877
- name: "parameterless",
1878
- run_id: expect.any(String),
1879
- tags: [],
1880
- },
1881
- {
1882
- data: {
1883
- output: JSON.stringify({ sum: 3 }),
1884
- },
1885
- event: "on_tool_end",
1886
- metadata: {},
1887
- name: "parameterless",
1888
- run_id: expect.any(String),
1889
- tags: [],
1890
- },
1891
- ]);
1892
- const adderTool = tool(adderFunc, {
1893
- name: "with_parameters",
1894
- description: "A tool that does nothing",
1895
- schema: z.object({
1896
- x: z.number(),
1897
- y: z.number(),
1898
- }),
1899
- });
1900
- const events2 = [];
1901
- const eventStream2 = adderTool.streamEvents({ x: 1, y: 2 }, { version: "v2" });
1902
- for await (const event of eventStream2) {
1903
- events2.push(event);
1904
- }
1905
- expect(events2).toEqual([
1906
- {
1907
- data: { input: { x: 1, y: 2 } },
1908
- event: "on_tool_start",
1909
- metadata: {},
1910
- name: "with_parameters",
1911
- run_id: expect.any(String),
1912
- tags: [],
1913
- },
1914
- {
1915
- data: { output: JSON.stringify({ sum: 3 }) },
1916
- event: "on_tool_end",
1917
- metadata: {},
1918
- name: "with_parameters",
1919
- run_id: expect.any(String),
1920
- tags: [],
1921
- },
1922
- ]);
1923
- });
1924
- test("Runnable streamEvents method with a retriever", async () => {
1925
- const retriever = new FakeRetriever({
1926
- output: [
1927
- new Document({ pageContent: "hello world!", metadata: { foo: "bar" } }),
1928
- new Document({
1929
- pageContent: "goodbye world!",
1930
- metadata: { food: "spare" },
1931
- }),
1932
- ],
1933
- });
1934
- const events = [];
1935
- const eventStream = await retriever.streamEvents("hello", {
1936
- version: "v2",
1937
- });
1938
- for await (const event of eventStream) {
1939
- events.push(event);
1940
- }
1941
- expect(events).toEqual([
1942
- {
1943
- data: {
1944
- input: "hello",
1945
- },
1946
- event: "on_retriever_start",
1947
- metadata: {},
1948
- name: "FakeRetriever",
1949
- run_id: expect.any(String),
1950
- tags: [],
1951
- },
1952
- {
1953
- data: {
1954
- output: [
1955
- new Document({
1956
- pageContent: "hello world!",
1957
- metadata: { foo: "bar" },
1958
- }),
1959
- new Document({
1960
- pageContent: "goodbye world!",
1961
- metadata: { food: "spare" },
1962
- }),
1963
- ],
1964
- },
1965
- event: "on_retriever_end",
1966
- metadata: {},
1967
- name: "FakeRetriever",
1968
- run_id: expect.any(String),
1969
- tags: [],
1970
- },
1971
- ]);
1972
- });
1973
- test("Runnable streamEvents method with text/event-stream encoding", async () => {
1974
- const chain = RunnableLambda.from(reverse).withConfig({
1975
- runName: "reverse",
1976
- });
1977
- const events = [];
1978
- const eventStream = await chain.streamEvents("hello", {
1979
- version: "v2",
1980
- encoding: "text/event-stream",
1981
- runId: "1234",
1982
- });
1983
- for await (const event of eventStream) {
1984
- events.push(event);
1985
- }
1986
- const decoder = new TextDecoder();
1987
- expect(events.length).toEqual(4);
1988
- const dataEvents = events
1989
- .slice(0, 3)
1990
- .map((event) => decoder.decode(event).split("event: data\ndata: ")[1]);
1991
- const expectedPayloads = [
1992
- {
1993
- data: { input: "hello" },
1994
- event: "on_chain_start",
1995
- metadata: {},
1996
- name: "reverse",
1997
- run_id: "1234",
1998
- tags: [],
1999
- },
2000
- {
2001
- data: { chunk: "olleh" },
2002
- event: "on_chain_stream",
2003
- metadata: {},
2004
- name: "reverse",
2005
- run_id: "1234",
2006
- tags: [],
2007
- },
2008
- {
2009
- data: { output: "olleh" },
2010
- event: "on_chain_end",
2011
- metadata: {},
2012
- name: "reverse",
2013
- run_id: "1234",
2014
- tags: [],
2015
- },
2016
- ];
2017
- for (let i = 0; i < dataEvents.length; i += 1) {
2018
- expect(dataEvents[i].endsWith("\n\n")).toBe(true);
2019
- expect(JSON.parse(dataEvents[i].replace("\n\n", ""))).toEqual(expectedPayloads[i]);
2020
- }
2021
- expect(decoder.decode(events[3])).toEqual("event: end\n\n");
2022
- });