@langchain/core 0.2.16 → 0.2.18-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/callbacks/manager.cjs +71 -23
  2. package/dist/callbacks/manager.js +71 -23
  3. package/dist/callbacks/tests/callbacks.test.js +3 -0
  4. package/dist/language_models/chat_models.d.ts +18 -1
  5. package/dist/messages/ai.cjs +17 -0
  6. package/dist/messages/ai.d.ts +2 -0
  7. package/dist/messages/ai.js +17 -0
  8. package/dist/messages/base.cjs +50 -0
  9. package/dist/messages/base.d.ts +4 -1
  10. package/dist/messages/base.js +50 -0
  11. package/dist/messages/chat.cjs +12 -0
  12. package/dist/messages/chat.d.ts +2 -0
  13. package/dist/messages/chat.js +12 -0
  14. package/dist/messages/index.cjs +1 -0
  15. package/dist/messages/index.d.ts +1 -0
  16. package/dist/messages/index.js +1 -0
  17. package/dist/messages/modifier.cjs +35 -0
  18. package/dist/messages/modifier.d.ts +19 -0
  19. package/dist/messages/modifier.js +31 -0
  20. package/dist/messages/tool.cjs +14 -0
  21. package/dist/messages/tool.d.ts +2 -0
  22. package/dist/messages/tool.js +14 -0
  23. package/dist/messages/transformers.cjs +5 -0
  24. package/dist/messages/transformers.d.ts +3 -2
  25. package/dist/messages/transformers.js +5 -0
  26. package/dist/runnables/base.cjs +35 -4
  27. package/dist/runnables/base.d.ts +52 -5
  28. package/dist/runnables/base.js +35 -4
  29. package/dist/runnables/config.cjs +4 -7
  30. package/dist/runnables/config.d.ts +3 -17
  31. package/dist/runnables/config.js +5 -8
  32. package/dist/runnables/graph.d.ts +1 -1
  33. package/dist/runnables/iter.cjs +2 -4
  34. package/dist/runnables/iter.js +2 -4
  35. package/dist/runnables/tests/runnable_stream_events_v2.test.js +52 -48
  36. package/dist/runnables/tests/runnable_tools.test.js +38 -0
  37. package/dist/runnables/types.d.ts +14 -1
  38. package/dist/singletons/index.cjs +35 -5
  39. package/dist/singletons/index.d.ts +2 -0
  40. package/dist/singletons/index.js +34 -4
  41. package/dist/singletons/tests/async_local_storage.test.js +2 -3
  42. package/dist/tools/index.cjs +17 -45
  43. package/dist/tools/index.d.ts +19 -28
  44. package/dist/tools/index.js +15 -42
  45. package/dist/tools/tests/tools.test.js +11 -0
  46. package/dist/tools/utils.cjs +28 -0
  47. package/dist/tools/utils.d.ts +11 -0
  48. package/dist/tools/utils.js +23 -0
  49. package/dist/tracers/base.cjs +67 -13
  50. package/dist/tracers/base.d.ts +176 -1
  51. package/dist/tracers/base.js +65 -12
  52. package/dist/tracers/event_stream.cjs +15 -2
  53. package/dist/tracers/event_stream.js +15 -2
  54. package/dist/tracers/tests/langsmith_interop.test.d.ts +1 -0
  55. package/dist/tracers/tests/langsmith_interop.test.js +551 -0
  56. package/dist/tracers/tracer_langchain.cjs +73 -31
  57. package/dist/tracers/tracer_langchain.d.ts +3 -1
  58. package/dist/tracers/tracer_langchain.js +73 -31
  59. package/dist/types/zod.d.ts +1 -1
  60. package/dist/utils/stream.cjs +8 -9
  61. package/dist/utils/stream.js +8 -9
  62. package/package.json +2 -2
@@ -9,8 +9,9 @@ const env_js_1 = require("../utils/env.cjs");
9
9
  const tracer_langchain_js_1 = require("../tracers/tracer_langchain.cjs");
10
10
  const promises_js_1 = require("./promises.cjs");
11
11
  const callbacks_js_1 = require("../utils/callbacks.cjs");
12
+ const base_js_2 = require("../tracers/base.cjs");
12
13
  if (
13
- /* #__PURE__ */ (0, env_js_1.getEnvironmentVariable)("LANGCHAIN_TRACING_V2") === "true" &&
14
+ /* #__PURE__ */ (0, callbacks_js_1.isTracingEnabled)() &&
14
15
  /* #__PURE__ */ (0, env_js_1.getEnvironmentVariable)("LANGCHAIN_CALLBACKS_BACKGROUND") !==
15
16
  "true") {
16
17
  /* #__PURE__ */ console.warn([
@@ -417,8 +418,17 @@ class CallbackManager extends BaseCallbackManager {
417
418
  return Promise.all(prompts.map(async (prompt, idx) => {
418
419
  // Can't have duplicate runs with the same run ID (if provided)
419
420
  const runId_ = idx === 0 && runId ? runId : (0, uuid_1.v4)();
420
- await Promise.all(this.handlers.map((handler) => (0, promises_js_1.consumeCallback)(async () => {
421
- if (!handler.ignoreLLM) {
421
+ await Promise.all(this.handlers.map((handler) => {
422
+ if (handler.ignoreLLM) {
423
+ return;
424
+ }
425
+ if ((0, base_js_2.isBaseTracer)(handler)) {
426
+ // Create and add run to the run map.
427
+ // We do this synchronously to avoid race conditions
428
+ // when callbacks are backgrounded.
429
+ handler._createRunForLLMStart(llm, [prompt], runId_, this._parentRunId, extraParams, this.tags, this.metadata, runName);
430
+ }
431
+ return (0, promises_js_1.consumeCallback)(async () => {
422
432
  try {
423
433
  await handler.handleLLMStart?.(llm, [prompt], runId_, this._parentRunId, extraParams, this.tags, this.metadata, runName);
424
434
  }
@@ -428,8 +438,8 @@ class CallbackManager extends BaseCallbackManager {
428
438
  throw err;
429
439
  }
430
440
  }
431
- }
432
- }, handler.awaitHandlers)));
441
+ }, handler.awaitHandlers);
442
+ }));
433
443
  return new CallbackManagerForLLMRun(runId_, this.handlers, this.inheritableHandlers, this.tags, this.inheritableTags, this.metadata, this.inheritableMetadata, this._parentRunId);
434
444
  }));
435
445
  }
@@ -437,8 +447,17 @@ class CallbackManager extends BaseCallbackManager {
437
447
  return Promise.all(messages.map(async (messageGroup, idx) => {
438
448
  // Can't have duplicate runs with the same run ID (if provided)
439
449
  const runId_ = idx === 0 && runId ? runId : (0, uuid_1.v4)();
440
- await Promise.all(this.handlers.map((handler) => (0, promises_js_1.consumeCallback)(async () => {
441
- if (!handler.ignoreLLM) {
450
+ await Promise.all(this.handlers.map((handler) => {
451
+ if (handler.ignoreLLM) {
452
+ return;
453
+ }
454
+ if ((0, base_js_2.isBaseTracer)(handler)) {
455
+ // Create and add run to the run map.
456
+ // We do this synchronously to avoid race conditions
457
+ // when callbacks are backgrounded.
458
+ handler._createRunForChatModelStart(llm, [messageGroup], runId_, this._parentRunId, extraParams, this.tags, this.metadata, runName);
459
+ }
460
+ return (0, promises_js_1.consumeCallback)(async () => {
442
461
  try {
443
462
  if (handler.handleChatModelStart) {
444
463
  await handler.handleChatModelStart?.(llm, [messageGroup], runId_, this._parentRunId, extraParams, this.tags, this.metadata, runName);
@@ -454,14 +473,23 @@ class CallbackManager extends BaseCallbackManager {
454
473
  throw err;
455
474
  }
456
475
  }
457
- }
458
- }, handler.awaitHandlers)));
476
+ }, handler.awaitHandlers);
477
+ }));
459
478
  return new CallbackManagerForLLMRun(runId_, this.handlers, this.inheritableHandlers, this.tags, this.inheritableTags, this.metadata, this.inheritableMetadata, this._parentRunId);
460
479
  }));
461
480
  }
462
481
  async handleChainStart(chain, inputs, runId = (0, uuid_1.v4)(), runType = undefined, _tags = undefined, _metadata = undefined, runName = undefined) {
463
- await Promise.all(this.handlers.map((handler) => (0, promises_js_1.consumeCallback)(async () => {
464
- if (!handler.ignoreChain) {
482
+ await Promise.all(this.handlers.map((handler) => {
483
+ if (handler.ignoreChain) {
484
+ return;
485
+ }
486
+ if ((0, base_js_2.isBaseTracer)(handler)) {
487
+ // Create and add run to the run map.
488
+ // We do this synchronously to avoid race conditions
489
+ // when callbacks are backgrounded.
490
+ handler._createRunForChainStart(chain, inputs, runId, this._parentRunId, this.tags, this.metadata, runType, runName);
491
+ }
492
+ return (0, promises_js_1.consumeCallback)(async () => {
465
493
  try {
466
494
  await handler.handleChainStart?.(chain, inputs, runId, this._parentRunId, this.tags, this.metadata, runType, runName);
467
495
  }
@@ -471,13 +499,22 @@ class CallbackManager extends BaseCallbackManager {
471
499
  throw err;
472
500
  }
473
501
  }
474
- }
475
- }, handler.awaitHandlers)));
502
+ }, handler.awaitHandlers);
503
+ }));
476
504
  return new CallbackManagerForChainRun(runId, this.handlers, this.inheritableHandlers, this.tags, this.inheritableTags, this.metadata, this.inheritableMetadata, this._parentRunId);
477
505
  }
478
506
  async handleToolStart(tool, input, runId = (0, uuid_1.v4)(), _parentRunId = undefined, _tags = undefined, _metadata = undefined, runName = undefined) {
479
- await Promise.all(this.handlers.map((handler) => (0, promises_js_1.consumeCallback)(async () => {
480
- if (!handler.ignoreAgent) {
507
+ await Promise.all(this.handlers.map((handler) => {
508
+ if (handler.ignoreAgent) {
509
+ return;
510
+ }
511
+ if ((0, base_js_2.isBaseTracer)(handler)) {
512
+ // Create and add run to the run map.
513
+ // We do this synchronously to avoid race conditions
514
+ // when callbacks are backgrounded.
515
+ handler._createRunForToolStart(tool, input, runId, this._parentRunId, this.tags, this.metadata, runName);
516
+ }
517
+ return (0, promises_js_1.consumeCallback)(async () => {
481
518
  try {
482
519
  await handler.handleToolStart?.(tool, input, runId, this._parentRunId, this.tags, this.metadata, runName);
483
520
  }
@@ -487,13 +524,22 @@ class CallbackManager extends BaseCallbackManager {
487
524
  throw err;
488
525
  }
489
526
  }
490
- }
491
- }, handler.awaitHandlers)));
527
+ }, handler.awaitHandlers);
528
+ }));
492
529
  return new CallbackManagerForToolRun(runId, this.handlers, this.inheritableHandlers, this.tags, this.inheritableTags, this.metadata, this.inheritableMetadata, this._parentRunId);
493
530
  }
494
531
  async handleRetrieverStart(retriever, query, runId = (0, uuid_1.v4)(), _parentRunId = undefined, _tags = undefined, _metadata = undefined, runName = undefined) {
495
- await Promise.all(this.handlers.map((handler) => (0, promises_js_1.consumeCallback)(async () => {
496
- if (!handler.ignoreRetriever) {
532
+ await Promise.all(this.handlers.map((handler) => {
533
+ if (handler.ignoreRetriever) {
534
+ return;
535
+ }
536
+ if ((0, base_js_2.isBaseTracer)(handler)) {
537
+ // Create and add run to the run map.
538
+ // We do this synchronously to avoid race conditions
539
+ // when callbacks are backgrounded.
540
+ handler._createRunForRetrieverStart(retriever, query, runId, this._parentRunId, this.tags, this.metadata, runName);
541
+ }
542
+ return (0, promises_js_1.consumeCallback)(async () => {
497
543
  try {
498
544
  await handler.handleRetrieverStart?.(retriever, query, runId, this._parentRunId, this.tags, this.metadata, runName);
499
545
  }
@@ -503,8 +549,8 @@ class CallbackManager extends BaseCallbackManager {
503
549
  throw err;
504
550
  }
505
551
  }
506
- }
507
- }, handler.awaitHandlers)));
552
+ }, handler.awaitHandlers);
553
+ }));
508
554
  return new CallbackManagerForRetrieverRun(runId, this.handlers, this.inheritableHandlers, this.tags, this.inheritableTags, this.metadata, this.inheritableMetadata, this._parentRunId);
509
555
  }
510
556
  async handleCustomEvent(eventName,
@@ -629,7 +675,8 @@ class CallbackManager extends BaseCallbackManager {
629
675
  }
630
676
  const verboseEnabled = (0, env_js_1.getEnvironmentVariable)("LANGCHAIN_VERBOSE") === "true" ||
631
677
  options?.verbose;
632
- const tracingV2Enabled = (0, callbacks_js_1.isTracingEnabled)();
678
+ const tracingV2Enabled = tracer_langchain_js_1.LangChainTracer.getTraceableRunTree()?.tracingEnabled ||
679
+ (0, callbacks_js_1.isTracingEnabled)();
633
680
  const tracingEnabled = tracingV2Enabled ||
634
681
  ((0, env_js_1.getEnvironmentVariable)("LANGCHAIN_TRACING") ?? false);
635
682
  if (verboseEnabled || tracingEnabled) {
@@ -649,7 +696,8 @@ class CallbackManager extends BaseCallbackManager {
649
696
  // handoff between langchain and langsmith/traceable
650
697
  // override the parent run ID
651
698
  callbackManager._parentRunId =
652
- tracerV2.getTraceableRunTree()?.id ?? callbackManager._parentRunId;
699
+ tracer_langchain_js_1.LangChainTracer.getTraceableRunTree()?.id ??
700
+ callbackManager._parentRunId;
653
701
  }
654
702
  }
655
703
  }
@@ -6,8 +6,9 @@ import { getEnvironmentVariable } from "../utils/env.js";
6
6
  import { LangChainTracer, } from "../tracers/tracer_langchain.js";
7
7
  import { consumeCallback } from "./promises.js";
8
8
  import { isTracingEnabled } from "../utils/callbacks.js";
9
+ import { isBaseTracer } from "../tracers/base.js";
9
10
  if (
10
- /* #__PURE__ */ getEnvironmentVariable("LANGCHAIN_TRACING_V2") === "true" &&
11
+ /* #__PURE__ */ isTracingEnabled() &&
11
12
  /* #__PURE__ */ getEnvironmentVariable("LANGCHAIN_CALLBACKS_BACKGROUND") !==
12
13
  "true") {
13
14
  /* #__PURE__ */ console.warn([
@@ -407,8 +408,17 @@ export class CallbackManager extends BaseCallbackManager {
407
408
  return Promise.all(prompts.map(async (prompt, idx) => {
408
409
  // Can't have duplicate runs with the same run ID (if provided)
409
410
  const runId_ = idx === 0 && runId ? runId : uuidv4();
410
- await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
411
- if (!handler.ignoreLLM) {
411
+ await Promise.all(this.handlers.map((handler) => {
412
+ if (handler.ignoreLLM) {
413
+ return;
414
+ }
415
+ if (isBaseTracer(handler)) {
416
+ // Create and add run to the run map.
417
+ // We do this synchronously to avoid race conditions
418
+ // when callbacks are backgrounded.
419
+ handler._createRunForLLMStart(llm, [prompt], runId_, this._parentRunId, extraParams, this.tags, this.metadata, runName);
420
+ }
421
+ return consumeCallback(async () => {
412
422
  try {
413
423
  await handler.handleLLMStart?.(llm, [prompt], runId_, this._parentRunId, extraParams, this.tags, this.metadata, runName);
414
424
  }
@@ -418,8 +428,8 @@ export class CallbackManager extends BaseCallbackManager {
418
428
  throw err;
419
429
  }
420
430
  }
421
- }
422
- }, handler.awaitHandlers)));
431
+ }, handler.awaitHandlers);
432
+ }));
423
433
  return new CallbackManagerForLLMRun(runId_, this.handlers, this.inheritableHandlers, this.tags, this.inheritableTags, this.metadata, this.inheritableMetadata, this._parentRunId);
424
434
  }));
425
435
  }
@@ -427,8 +437,17 @@ export class CallbackManager extends BaseCallbackManager {
427
437
  return Promise.all(messages.map(async (messageGroup, idx) => {
428
438
  // Can't have duplicate runs with the same run ID (if provided)
429
439
  const runId_ = idx === 0 && runId ? runId : uuidv4();
430
- await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
431
- if (!handler.ignoreLLM) {
440
+ await Promise.all(this.handlers.map((handler) => {
441
+ if (handler.ignoreLLM) {
442
+ return;
443
+ }
444
+ if (isBaseTracer(handler)) {
445
+ // Create and add run to the run map.
446
+ // We do this synchronously to avoid race conditions
447
+ // when callbacks are backgrounded.
448
+ handler._createRunForChatModelStart(llm, [messageGroup], runId_, this._parentRunId, extraParams, this.tags, this.metadata, runName);
449
+ }
450
+ return consumeCallback(async () => {
432
451
  try {
433
452
  if (handler.handleChatModelStart) {
434
453
  await handler.handleChatModelStart?.(llm, [messageGroup], runId_, this._parentRunId, extraParams, this.tags, this.metadata, runName);
@@ -444,14 +463,23 @@ export class CallbackManager extends BaseCallbackManager {
444
463
  throw err;
445
464
  }
446
465
  }
447
- }
448
- }, handler.awaitHandlers)));
466
+ }, handler.awaitHandlers);
467
+ }));
449
468
  return new CallbackManagerForLLMRun(runId_, this.handlers, this.inheritableHandlers, this.tags, this.inheritableTags, this.metadata, this.inheritableMetadata, this._parentRunId);
450
469
  }));
451
470
  }
452
471
  async handleChainStart(chain, inputs, runId = uuidv4(), runType = undefined, _tags = undefined, _metadata = undefined, runName = undefined) {
453
- await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
454
- if (!handler.ignoreChain) {
472
+ await Promise.all(this.handlers.map((handler) => {
473
+ if (handler.ignoreChain) {
474
+ return;
475
+ }
476
+ if (isBaseTracer(handler)) {
477
+ // Create and add run to the run map.
478
+ // We do this synchronously to avoid race conditions
479
+ // when callbacks are backgrounded.
480
+ handler._createRunForChainStart(chain, inputs, runId, this._parentRunId, this.tags, this.metadata, runType, runName);
481
+ }
482
+ return consumeCallback(async () => {
455
483
  try {
456
484
  await handler.handleChainStart?.(chain, inputs, runId, this._parentRunId, this.tags, this.metadata, runType, runName);
457
485
  }
@@ -461,13 +489,22 @@ export class CallbackManager extends BaseCallbackManager {
461
489
  throw err;
462
490
  }
463
491
  }
464
- }
465
- }, handler.awaitHandlers)));
492
+ }, handler.awaitHandlers);
493
+ }));
466
494
  return new CallbackManagerForChainRun(runId, this.handlers, this.inheritableHandlers, this.tags, this.inheritableTags, this.metadata, this.inheritableMetadata, this._parentRunId);
467
495
  }
468
496
  async handleToolStart(tool, input, runId = uuidv4(), _parentRunId = undefined, _tags = undefined, _metadata = undefined, runName = undefined) {
469
- await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
470
- if (!handler.ignoreAgent) {
497
+ await Promise.all(this.handlers.map((handler) => {
498
+ if (handler.ignoreAgent) {
499
+ return;
500
+ }
501
+ if (isBaseTracer(handler)) {
502
+ // Create and add run to the run map.
503
+ // We do this synchronously to avoid race conditions
504
+ // when callbacks are backgrounded.
505
+ handler._createRunForToolStart(tool, input, runId, this._parentRunId, this.tags, this.metadata, runName);
506
+ }
507
+ return consumeCallback(async () => {
471
508
  try {
472
509
  await handler.handleToolStart?.(tool, input, runId, this._parentRunId, this.tags, this.metadata, runName);
473
510
  }
@@ -477,13 +514,22 @@ export class CallbackManager extends BaseCallbackManager {
477
514
  throw err;
478
515
  }
479
516
  }
480
- }
481
- }, handler.awaitHandlers)));
517
+ }, handler.awaitHandlers);
518
+ }));
482
519
  return new CallbackManagerForToolRun(runId, this.handlers, this.inheritableHandlers, this.tags, this.inheritableTags, this.metadata, this.inheritableMetadata, this._parentRunId);
483
520
  }
484
521
  async handleRetrieverStart(retriever, query, runId = uuidv4(), _parentRunId = undefined, _tags = undefined, _metadata = undefined, runName = undefined) {
485
- await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
486
- if (!handler.ignoreRetriever) {
522
+ await Promise.all(this.handlers.map((handler) => {
523
+ if (handler.ignoreRetriever) {
524
+ return;
525
+ }
526
+ if (isBaseTracer(handler)) {
527
+ // Create and add run to the run map.
528
+ // We do this synchronously to avoid race conditions
529
+ // when callbacks are backgrounded.
530
+ handler._createRunForRetrieverStart(retriever, query, runId, this._parentRunId, this.tags, this.metadata, runName);
531
+ }
532
+ return consumeCallback(async () => {
487
533
  try {
488
534
  await handler.handleRetrieverStart?.(retriever, query, runId, this._parentRunId, this.tags, this.metadata, runName);
489
535
  }
@@ -493,8 +539,8 @@ export class CallbackManager extends BaseCallbackManager {
493
539
  throw err;
494
540
  }
495
541
  }
496
- }
497
- }, handler.awaitHandlers)));
542
+ }, handler.awaitHandlers);
543
+ }));
498
544
  return new CallbackManagerForRetrieverRun(runId, this.handlers, this.inheritableHandlers, this.tags, this.inheritableTags, this.metadata, this.inheritableMetadata, this._parentRunId);
499
545
  }
500
546
  async handleCustomEvent(eventName,
@@ -619,7 +665,8 @@ export class CallbackManager extends BaseCallbackManager {
619
665
  }
620
666
  const verboseEnabled = getEnvironmentVariable("LANGCHAIN_VERBOSE") === "true" ||
621
667
  options?.verbose;
622
- const tracingV2Enabled = isTracingEnabled();
668
+ const tracingV2Enabled = LangChainTracer.getTraceableRunTree()?.tracingEnabled ||
669
+ isTracingEnabled();
623
670
  const tracingEnabled = tracingV2Enabled ||
624
671
  (getEnvironmentVariable("LANGCHAIN_TRACING") ?? false);
625
672
  if (verboseEnabled || tracingEnabled) {
@@ -639,7 +686,8 @@ export class CallbackManager extends BaseCallbackManager {
639
686
  // handoff between langchain and langsmith/traceable
640
687
  // override the parent run ID
641
688
  callbackManager._parentRunId =
642
- tracerV2.getTraceableRunTree()?.id ?? callbackManager._parentRunId;
689
+ LangChainTracer.getTraceableRunTree()?.id ??
690
+ callbackManager._parentRunId;
643
691
  }
644
692
  }
645
693
  }
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-promise-executor-return */
1
2
  import { test, expect } from "@jest/globals";
2
3
  import * as uuid from "uuid";
3
4
  import { CallbackManager } from "../manager.js";
@@ -227,6 +228,8 @@ test("CallbackManager", async () => {
227
228
  new Document({ pageContent: "test", metadata: { test: "test" } }),
228
229
  ]);
229
230
  await retrieverCb.handleRetrieverError(new Error("test"));
231
+ // In case background mode is on while running this test
232
+ await new Promise((resolve) => setTimeout(resolve, 100));
230
233
  for (const handler of [handler1, handler2]) {
231
234
  expect(handler.starts).toBe(5);
232
235
  expect(handler.ends).toBe(5);
@@ -8,6 +8,7 @@ import type { RunnableConfig } from "../runnables/config.js";
8
8
  import type { BaseCache } from "../caches/base.js";
9
9
  import { StructuredToolInterface } from "../tools/index.js";
10
10
  import { Runnable, RunnableToolLike } from "../runnables/base.js";
11
+ type ToolChoice = string | Record<string, any> | "auto" | "any";
11
12
  /**
12
13
  * Represents a serialized chat model.
13
14
  */
@@ -29,7 +30,23 @@ export type BaseChatModelParams = BaseLanguageModelParams;
29
30
  /**
30
31
  * Represents the call options for a base chat model.
31
32
  */
32
- export type BaseChatModelCallOptions = BaseLanguageModelCallOptions;
33
+ export type BaseChatModelCallOptions = BaseLanguageModelCallOptions & {
34
+ /**
35
+ * Specifies how the chat model should use tools.
36
+ * @default undefined
37
+ *
38
+ * Possible values:
39
+ * - "auto": The model may choose to use any of the provided tools, or none.
40
+ * - "any": The model must use one of the provided tools.
41
+ * - "none": The model must not use any tools.
42
+ * - A string (not "auto", "any", or "none"): The name of a specific tool the model must use.
43
+ * - An object: A custom schema specifying tool choice parameters. Specific to the provider.
44
+ *
45
+ * Note: Not all providers support tool_choice. An error will be thrown
46
+ * if used with an unsupported model.
47
+ */
48
+ tool_choice?: ToolChoice;
49
+ };
33
50
  /**
34
51
  * Creates a transform stream for encoding chat message chunks.
35
52
  * @deprecated Use {@link BytesOutputParser} instead
@@ -98,6 +98,14 @@ class AIMessage extends base_js_1.BaseMessage {
98
98
  _getType() {
99
99
  return "ai";
100
100
  }
101
+ get _printableFields() {
102
+ return {
103
+ ...super._printableFields,
104
+ tool_calls: this.tool_calls,
105
+ invalid_tool_calls: this.invalid_tool_calls,
106
+ usage_metadata: this.usage_metadata,
107
+ };
108
+ }
101
109
  }
102
110
  exports.AIMessage = AIMessage;
103
111
  function isAIMessage(x) {
@@ -215,6 +223,15 @@ class AIMessageChunk extends base_js_1.BaseMessageChunk {
215
223
  _getType() {
216
224
  return "ai";
217
225
  }
226
+ get _printableFields() {
227
+ return {
228
+ ...super._printableFields,
229
+ tool_calls: this.tool_calls,
230
+ tool_call_chunks: this.tool_call_chunks,
231
+ invalid_tool_calls: this.invalid_tool_calls,
232
+ usage_metadata: this.usage_metadata,
233
+ };
234
+ }
218
235
  concat(chunk) {
219
236
  const combinedFields = {
220
237
  content: (0, base_js_1.mergeContent)(this.content, chunk.content),
@@ -38,6 +38,7 @@ export declare class AIMessage extends BaseMessage {
38
38
  kwargs?: Record<string, unknown>);
39
39
  static lc_name(): string;
40
40
  _getType(): MessageType;
41
+ get _printableFields(): Record<string, unknown>;
41
42
  }
42
43
  export declare function isAIMessage(x: BaseMessage): x is AIMessage;
43
44
  export type AIMessageChunkFields = AIMessageFields & {
@@ -59,5 +60,6 @@ export declare class AIMessageChunk extends BaseMessageChunk {
59
60
  get lc_aliases(): Record<string, string>;
60
61
  static lc_name(): string;
61
62
  _getType(): MessageType;
63
+ get _printableFields(): Record<string, unknown>;
62
64
  concat(chunk: AIMessageChunk): AIMessageChunk;
63
65
  }
@@ -95,6 +95,14 @@ export class AIMessage extends BaseMessage {
95
95
  _getType() {
96
96
  return "ai";
97
97
  }
98
+ get _printableFields() {
99
+ return {
100
+ ...super._printableFields,
101
+ tool_calls: this.tool_calls,
102
+ invalid_tool_calls: this.invalid_tool_calls,
103
+ usage_metadata: this.usage_metadata,
104
+ };
105
+ }
98
106
  }
99
107
  export function isAIMessage(x) {
100
108
  return x._getType() === "ai";
@@ -210,6 +218,15 @@ export class AIMessageChunk extends BaseMessageChunk {
210
218
  _getType() {
211
219
  return "ai";
212
220
  }
221
+ get _printableFields() {
222
+ return {
223
+ ...super._printableFields,
224
+ tool_calls: this.tool_calls,
225
+ tool_call_chunks: this.tool_call_chunks,
226
+ invalid_tool_calls: this.invalid_tool_calls,
227
+ usage_metadata: this.usage_metadata,
228
+ };
229
+ }
213
230
  concat(chunk) {
214
231
  const combinedFields = {
215
232
  content: mergeContent(this.content, chunk.content),
@@ -25,6 +25,30 @@ function mergeContent(firstContent, secondContent) {
25
25
  }
26
26
  }
27
27
  exports.mergeContent = mergeContent;
28
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
+ function stringifyWithDepthLimit(obj, depthLimit) {
30
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
+ function helper(obj, currentDepth) {
32
+ if (typeof obj !== "object" || obj === null || obj === undefined) {
33
+ return obj;
34
+ }
35
+ if (currentDepth >= depthLimit) {
36
+ if (Array.isArray(obj)) {
37
+ return "[Array]";
38
+ }
39
+ return "[Object]";
40
+ }
41
+ if (Array.isArray(obj)) {
42
+ return obj.map((item) => helper(item, currentDepth + 1));
43
+ }
44
+ const result = {};
45
+ for (const key of Object.keys(obj)) {
46
+ result[key] = helper(obj[key], currentDepth + 1);
47
+ }
48
+ return result;
49
+ }
50
+ return JSON.stringify(helper(obj, 0), null, 2);
51
+ }
28
52
  /**
29
53
  * Base class for all types of messages in a conversation. It includes
30
54
  * properties like `content`, `name`, and `additional_kwargs`. It also
@@ -129,6 +153,32 @@ class BaseMessage extends serializable_js_1.Serializable {
129
153
  .kwargs,
130
154
  };
131
155
  }
156
+ static lc_name() {
157
+ return "BaseMessage";
158
+ }
159
+ // Can't be protected for silly reasons
160
+ get _printableFields() {
161
+ return {
162
+ id: this.id,
163
+ content: this.content,
164
+ name: this.name,
165
+ additional_kwargs: this.additional_kwargs,
166
+ response_metadata: this.response_metadata,
167
+ };
168
+ }
169
+ get [Symbol.toStringTag]() {
170
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
171
+ return this.constructor.lc_name();
172
+ }
173
+ // Override the default behavior of console.log
174
+ [Symbol.for("nodejs.util.inspect.custom")](depth) {
175
+ if (depth === null) {
176
+ return this;
177
+ }
178
+ const printable = stringifyWithDepthLimit(this._printableFields, Math.max(4, depth));
179
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
180
+ return `${this.constructor.lc_name()} ${printable}`;
181
+ }
132
182
  }
133
183
  exports.BaseMessage = BaseMessage;
134
184
  function isOpenAIToolCallArray(value) {
@@ -23,7 +23,7 @@ export interface StoredMessageV1 {
23
23
  role: string | undefined;
24
24
  text: string;
25
25
  }
26
- export type MessageType = "human" | "ai" | "generic" | "system" | "function" | "tool";
26
+ export type MessageType = "human" | "ai" | "generic" | "system" | "function" | "tool" | "remove";
27
27
  export type ImageDetail = "auto" | "low" | "high";
28
28
  export type MessageContentText = {
29
29
  type: "text";
@@ -123,6 +123,9 @@ export declare abstract class BaseMessage extends Serializable implements BaseMe
123
123
  /** @deprecated */
124
124
  kwargs?: Record<string, unknown>);
125
125
  toDict(): StoredMessage;
126
+ static lc_name(): string;
127
+ get _printableFields(): Record<string, unknown>;
128
+ get [Symbol.toStringTag](): any;
126
129
  }
127
130
  export type OpenAIToolCall = ToolCall & {
128
131
  index: number;
@@ -21,6 +21,30 @@ export function mergeContent(firstContent, secondContent) {
21
21
  return [...firstContent, { type: "text", text: secondContent }];
22
22
  }
23
23
  }
24
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
+ function stringifyWithDepthLimit(obj, depthLimit) {
26
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
+ function helper(obj, currentDepth) {
28
+ if (typeof obj !== "object" || obj === null || obj === undefined) {
29
+ return obj;
30
+ }
31
+ if (currentDepth >= depthLimit) {
32
+ if (Array.isArray(obj)) {
33
+ return "[Array]";
34
+ }
35
+ return "[Object]";
36
+ }
37
+ if (Array.isArray(obj)) {
38
+ return obj.map((item) => helper(item, currentDepth + 1));
39
+ }
40
+ const result = {};
41
+ for (const key of Object.keys(obj)) {
42
+ result[key] = helper(obj[key], currentDepth + 1);
43
+ }
44
+ return result;
45
+ }
46
+ return JSON.stringify(helper(obj, 0), null, 2);
47
+ }
24
48
  /**
25
49
  * Base class for all types of messages in a conversation. It includes
26
50
  * properties like `content`, `name`, and `additional_kwargs`. It also
@@ -125,6 +149,32 @@ export class BaseMessage extends Serializable {
125
149
  .kwargs,
126
150
  };
127
151
  }
152
+ static lc_name() {
153
+ return "BaseMessage";
154
+ }
155
+ // Can't be protected for silly reasons
156
+ get _printableFields() {
157
+ return {
158
+ id: this.id,
159
+ content: this.content,
160
+ name: this.name,
161
+ additional_kwargs: this.additional_kwargs,
162
+ response_metadata: this.response_metadata,
163
+ };
164
+ }
165
+ get [Symbol.toStringTag]() {
166
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
167
+ return this.constructor.lc_name();
168
+ }
169
+ // Override the default behavior of console.log
170
+ [Symbol.for("nodejs.util.inspect.custom")](depth) {
171
+ if (depth === null) {
172
+ return this;
173
+ }
174
+ const printable = stringifyWithDepthLimit(this._printableFields, Math.max(4, depth));
175
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
176
+ return `${this.constructor.lc_name()} ${printable}`;
177
+ }
128
178
  }
129
179
  export function isOpenAIToolCallArray(value) {
130
180
  return (Array.isArray(value) &&
@@ -32,6 +32,12 @@ class ChatMessage extends base_js_1.BaseMessage {
32
32
  static isInstance(message) {
33
33
  return message._getType() === "generic";
34
34
  }
35
+ get _printableFields() {
36
+ return {
37
+ ...super._printableFields,
38
+ role: this.role,
39
+ };
40
+ }
35
41
  }
36
42
  exports.ChatMessage = ChatMessage;
37
43
  /**
@@ -68,5 +74,11 @@ class ChatMessageChunk extends base_js_1.BaseMessageChunk {
68
74
  id: this.id ?? chunk.id,
69
75
  });
70
76
  }
77
+ get _printableFields() {
78
+ return {
79
+ ...super._printableFields,
80
+ role: this.role,
81
+ };
82
+ }
71
83
  }
72
84
  exports.ChatMessageChunk = ChatMessageChunk;
@@ -13,6 +13,7 @@ export declare class ChatMessage extends BaseMessage implements ChatMessageField
13
13
  constructor(fields: ChatMessageFieldsWithRole);
14
14
  _getType(): MessageType;
15
15
  static isInstance(message: BaseMessage): message is ChatMessage;
16
+ get _printableFields(): Record<string, unknown>;
16
17
  }
17
18
  /**
18
19
  * Represents a chunk of a chat message, which can be concatenated with
@@ -25,4 +26,5 @@ export declare class ChatMessageChunk extends BaseMessageChunk {
25
26
  constructor(fields: ChatMessageFieldsWithRole);
26
27
  _getType(): MessageType;
27
28
  concat(chunk: ChatMessageChunk): ChatMessageChunk;
29
+ get _printableFields(): Record<string, unknown>;
28
30
  }