@langchain/core 0.2.18-rc.0 → 0.2.19

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 (128) 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/messages/base.cjs +16 -1
  5. package/dist/messages/base.d.ts +9 -0
  6. package/dist/messages/base.js +14 -0
  7. package/dist/messages/tool.cjs +23 -0
  8. package/dist/messages/tool.d.ts +15 -0
  9. package/dist/messages/tool.js +24 -1
  10. package/dist/messages/utils.cjs +1 -1
  11. package/dist/messages/utils.js +1 -1
  12. package/dist/output_parsers/string.cjs +1 -0
  13. package/dist/output_parsers/string.js +1 -0
  14. package/dist/runnables/base.cjs +1 -3
  15. package/dist/runnables/base.js +1 -3
  16. package/dist/runnables/remote.cjs +3 -1
  17. package/dist/runnables/remote.js +3 -1
  18. package/dist/tools/index.cjs +15 -6
  19. package/dist/tools/index.d.ts +21 -12
  20. package/dist/tools/index.js +15 -6
  21. package/dist/utils/testing/index.cjs +161 -3
  22. package/dist/utils/testing/index.d.ts +94 -3
  23. package/dist/utils/testing/index.js +160 -3
  24. package/package.json +4 -3
  25. package/dist/caches/tests/in_memory_cache.test.d.ts +0 -1
  26. package/dist/caches/tests/in_memory_cache.test.js +0 -33
  27. package/dist/callbacks/tests/callbacks.test.d.ts +0 -1
  28. package/dist/callbacks/tests/callbacks.test.js +0 -495
  29. package/dist/callbacks/tests/manager.int.test.d.ts +0 -1
  30. package/dist/callbacks/tests/manager.int.test.js +0 -29
  31. package/dist/callbacks/tests/run_collector.test.d.ts +0 -1
  32. package/dist/callbacks/tests/run_collector.test.js +0 -58
  33. package/dist/language_models/tests/chat_models.test.d.ts +0 -1
  34. package/dist/language_models/tests/chat_models.test.js +0 -204
  35. package/dist/language_models/tests/count_tokens.test.d.ts +0 -1
  36. package/dist/language_models/tests/count_tokens.test.js +0 -19
  37. package/dist/language_models/tests/llms.test.d.ts +0 -1
  38. package/dist/language_models/tests/llms.test.js +0 -52
  39. package/dist/messages/tests/base_message.test.d.ts +0 -1
  40. package/dist/messages/tests/base_message.test.js +0 -245
  41. package/dist/messages/tests/message_utils.test.d.ts +0 -1
  42. package/dist/messages/tests/message_utils.test.js +0 -434
  43. package/dist/output_parsers/openai_tools/tests/json_output_tools_parser.test.d.ts +0 -1
  44. package/dist/output_parsers/openai_tools/tests/json_output_tools_parser.test.js +0 -81
  45. package/dist/output_parsers/tests/json.test.d.ts +0 -1
  46. package/dist/output_parsers/tests/json.test.js +0 -427
  47. package/dist/output_parsers/tests/output_parser.test.d.ts +0 -1
  48. package/dist/output_parsers/tests/output_parser.test.js +0 -78
  49. package/dist/output_parsers/tests/string.test.d.ts +0 -1
  50. package/dist/output_parsers/tests/string.test.js +0 -68
  51. package/dist/output_parsers/tests/structured.test.d.ts +0 -1
  52. package/dist/output_parsers/tests/structured.test.js +0 -166
  53. package/dist/output_parsers/tests/xml.test.d.ts +0 -1
  54. package/dist/output_parsers/tests/xml.test.js +0 -81
  55. package/dist/prompts/tests/chat.mustache.test.d.ts +0 -1
  56. package/dist/prompts/tests/chat.mustache.test.js +0 -129
  57. package/dist/prompts/tests/chat.test.d.ts +0 -1
  58. package/dist/prompts/tests/chat.test.js +0 -557
  59. package/dist/prompts/tests/few_shot.test.d.ts +0 -1
  60. package/dist/prompts/tests/few_shot.test.js +0 -224
  61. package/dist/prompts/tests/pipeline.test.d.ts +0 -1
  62. package/dist/prompts/tests/pipeline.test.js +0 -101
  63. package/dist/prompts/tests/prompt.mustache.test.d.ts +0 -1
  64. package/dist/prompts/tests/prompt.mustache.test.js +0 -105
  65. package/dist/prompts/tests/prompt.test.d.ts +0 -1
  66. package/dist/prompts/tests/prompt.test.js +0 -78
  67. package/dist/prompts/tests/structured.test.d.ts +0 -1
  68. package/dist/prompts/tests/structured.test.js +0 -37
  69. package/dist/prompts/tests/template.test.d.ts +0 -1
  70. package/dist/prompts/tests/template.test.js +0 -24
  71. package/dist/runnables/tests/runnable.test.d.ts +0 -1
  72. package/dist/runnables/tests/runnable.test.js +0 -491
  73. package/dist/runnables/tests/runnable_binding.test.d.ts +0 -1
  74. package/dist/runnables/tests/runnable_binding.test.js +0 -46
  75. package/dist/runnables/tests/runnable_branch.test.d.ts +0 -1
  76. package/dist/runnables/tests/runnable_branch.test.js +0 -116
  77. package/dist/runnables/tests/runnable_graph.test.d.ts +0 -1
  78. package/dist/runnables/tests/runnable_graph.test.js +0 -100
  79. package/dist/runnables/tests/runnable_history.test.d.ts +0 -1
  80. package/dist/runnables/tests/runnable_history.test.js +0 -177
  81. package/dist/runnables/tests/runnable_interface.test.d.ts +0 -1
  82. package/dist/runnables/tests/runnable_interface.test.js +0 -209
  83. package/dist/runnables/tests/runnable_map.test.d.ts +0 -1
  84. package/dist/runnables/tests/runnable_map.test.js +0 -238
  85. package/dist/runnables/tests/runnable_passthrough.test.d.ts +0 -1
  86. package/dist/runnables/tests/runnable_passthrough.test.js +0 -96
  87. package/dist/runnables/tests/runnable_remote.int.test.d.ts +0 -1
  88. package/dist/runnables/tests/runnable_remote.int.test.js +0 -138
  89. package/dist/runnables/tests/runnable_remote.test.d.ts +0 -1
  90. package/dist/runnables/tests/runnable_remote.test.js +0 -200
  91. package/dist/runnables/tests/runnable_retry.test.d.ts +0 -1
  92. package/dist/runnables/tests/runnable_retry.test.js +0 -125
  93. package/dist/runnables/tests/runnable_stream_events.test.d.ts +0 -1
  94. package/dist/runnables/tests/runnable_stream_events.test.js +0 -1013
  95. package/dist/runnables/tests/runnable_stream_events_v2.test.d.ts +0 -1
  96. package/dist/runnables/tests/runnable_stream_events_v2.test.js +0 -2022
  97. package/dist/runnables/tests/runnable_stream_log.test.d.ts +0 -1
  98. package/dist/runnables/tests/runnable_stream_log.test.js +0 -71
  99. package/dist/runnables/tests/runnable_tools.test.d.ts +0 -1
  100. package/dist/runnables/tests/runnable_tools.test.js +0 -149
  101. package/dist/runnables/tests/runnable_tracing.int.test.d.ts +0 -1
  102. package/dist/runnables/tests/runnable_tracing.int.test.js +0 -37
  103. package/dist/runnables/tests/runnable_with_fallbacks.test.d.ts +0 -1
  104. package/dist/runnables/tests/runnable_with_fallbacks.test.js +0 -36
  105. package/dist/singletons/tests/async_local_storage.test.d.ts +0 -1
  106. package/dist/singletons/tests/async_local_storage.test.js +0 -153
  107. package/dist/structured_query/tests/utils.test.d.ts +0 -1
  108. package/dist/structured_query/tests/utils.test.js +0 -47
  109. package/dist/tools/tests/tools.test.d.ts +0 -1
  110. package/dist/tools/tests/tools.test.js +0 -85
  111. package/dist/tracers/tests/langchain_tracer.int.test.d.ts +0 -1
  112. package/dist/tracers/tests/langchain_tracer.int.test.js +0 -74
  113. package/dist/tracers/tests/langsmith_interop.test.d.ts +0 -1
  114. package/dist/tracers/tests/langsmith_interop.test.js +0 -551
  115. package/dist/tracers/tests/tracer.test.d.ts +0 -1
  116. package/dist/tracers/tests/tracer.test.js +0 -378
  117. package/dist/utils/testing/tests/chatfake.test.d.ts +0 -1
  118. package/dist/utils/testing/tests/chatfake.test.js +0 -112
  119. package/dist/utils/tests/async_caller.test.d.ts +0 -1
  120. package/dist/utils/tests/async_caller.test.js +0 -27
  121. package/dist/utils/tests/enviroment.test.d.ts +0 -1
  122. package/dist/utils/tests/enviroment.test.js +0 -6
  123. package/dist/utils/tests/function_calling.test.d.ts +0 -1
  124. package/dist/utils/tests/function_calling.test.js +0 -107
  125. package/dist/utils/tests/math_utils.test.d.ts +0 -1
  126. package/dist/utils/tests/math_utils.test.js +0 -139
  127. package/dist/utils/tests/polyfill_stream.test.d.ts +0 -1
  128. 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
- });