@langchain/langgraph 0.2.8 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/constants.cjs +12 -2
  2. package/dist/constants.d.ts +7 -1
  3. package/dist/constants.js +11 -1
  4. package/dist/errors.cjs +5 -4
  5. package/dist/errors.d.ts +1 -1
  6. package/dist/errors.js +5 -4
  7. package/dist/graph/graph.cjs +7 -2
  8. package/dist/graph/graph.js +8 -3
  9. package/dist/graph/message.cjs +2 -0
  10. package/dist/graph/message.js +2 -0
  11. package/dist/graph/state.cjs +8 -3
  12. package/dist/graph/state.d.ts +1 -1
  13. package/dist/graph/state.js +9 -4
  14. package/dist/managed/shared_value.cjs +1 -1
  15. package/dist/managed/shared_value.js +1 -1
  16. package/dist/pregel/algo.cjs +119 -54
  17. package/dist/pregel/algo.d.ts +5 -2
  18. package/dist/pregel/algo.js +117 -53
  19. package/dist/pregel/debug.cjs +15 -18
  20. package/dist/pregel/debug.d.ts +3 -2
  21. package/dist/pregel/debug.js +16 -19
  22. package/dist/pregel/index.cjs +295 -110
  23. package/dist/pregel/index.d.ts +16 -4
  24. package/dist/pregel/index.js +292 -110
  25. package/dist/pregel/io.cjs +15 -8
  26. package/dist/pregel/io.d.ts +2 -2
  27. package/dist/pregel/io.js +15 -8
  28. package/dist/pregel/loop.cjs +256 -111
  29. package/dist/pregel/loop.d.ts +21 -5
  30. package/dist/pregel/loop.js +256 -109
  31. package/dist/pregel/read.cjs +9 -2
  32. package/dist/pregel/read.d.ts +2 -1
  33. package/dist/pregel/read.js +9 -2
  34. package/dist/pregel/retry.d.ts +1 -1
  35. package/dist/pregel/types.d.ts +5 -1
  36. package/dist/pregel/utils/config.cjs +72 -0
  37. package/dist/pregel/utils/config.d.ts +2 -0
  38. package/dist/pregel/utils/config.js +68 -0
  39. package/dist/pregel/{utils.cjs → utils/index.cjs} +33 -10
  40. package/dist/pregel/{utils.d.ts → utils/index.d.ts} +4 -7
  41. package/dist/pregel/{utils.js → utils/index.js} +30 -8
  42. package/dist/utils.cjs +5 -3
  43. package/dist/utils.js +5 -3
  44. package/dist/web.d.ts +2 -1
  45. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import { Runnable, RunnableBinding, RunnableBindingArgs, RunnableConfig, RunnableLike } from "@langchain/core/runnables";
2
2
  import { RunnableCallable } from "../utils.js";
3
- import type { RetryPolicy } from "./utils.js";
3
+ import type { RetryPolicy } from "./utils/index.js";
4
4
  export declare class ChannelRead<RunInput = any> extends RunnableCallable {
5
5
  lc_graph_name: string;
6
6
  channel: string | Array<string>;
@@ -32,6 +32,7 @@ export declare class PregelNode<RunInput = PregelNodeInputType, RunOutput = Preg
32
32
  bound: Runnable<RunInput, RunOutput>;
33
33
  kwargs: Record<string, any>;
34
34
  metadata: Record<string, unknown>;
35
+ tags: string[];
35
36
  retryPolicy?: RetryPolicy;
36
37
  constructor(fields: PregelNodeArgs<RunInput, RunOutput>);
37
38
  getWriters(): Array<Runnable>;
@@ -59,10 +59,10 @@ const defaultRunnableBound =
59
59
  /* #__PURE__ */ new RunnablePassthrough();
60
60
  export class PregelNode extends RunnableBinding {
61
61
  constructor(fields) {
62
- const { channels, triggers, mapper, writers, bound, kwargs, metadata, retryPolicy, } = fields;
62
+ const { channels, triggers, mapper, writers, bound, kwargs, metadata, retryPolicy, tags, } = fields;
63
63
  const mergedTags = [
64
64
  ...(fields.config?.tags ? fields.config.tags : []),
65
- ...(fields.tags ? fields.tags : []),
65
+ ...(tags ?? []),
66
66
  ];
67
67
  super({
68
68
  ...fields,
@@ -123,6 +123,12 @@ export class PregelNode extends RunnableBinding {
123
123
  writable: true,
124
124
  value: {}
125
125
  });
126
+ Object.defineProperty(this, "tags", {
127
+ enumerable: true,
128
+ configurable: true,
129
+ writable: true,
130
+ value: []
131
+ });
126
132
  Object.defineProperty(this, "retryPolicy", {
127
133
  enumerable: true,
128
134
  configurable: true,
@@ -136,6 +142,7 @@ export class PregelNode extends RunnableBinding {
136
142
  this.bound = bound ?? this.bound;
137
143
  this.kwargs = kwargs ?? this.kwargs;
138
144
  this.metadata = metadata ?? this.metadata;
145
+ this.tags = mergedTags;
139
146
  this.retryPolicy = retryPolicy;
140
147
  }
141
148
  getWriters() {
@@ -1,5 +1,5 @@
1
1
  import { PregelExecutableTask } from "./types.js";
2
- import type { RetryPolicy } from "./utils.js";
2
+ import type { RetryPolicy } from "./utils/index.js";
3
3
  export declare const DEFAULT_INITIAL_INTERVAL = 500;
4
4
  export declare const DEFAULT_BACKOFF_FACTOR = 2;
5
5
  export declare const DEFAULT_MAX_INTERVAL = 128000;
@@ -2,7 +2,7 @@ import type { Runnable, RunnableConfig } from "@langchain/core/runnables";
2
2
  import type { All, PendingWrite, CheckpointMetadata, BaseCheckpointSaver } from "@langchain/langgraph-checkpoint";
3
3
  import type { BaseChannel } from "../channels/base.js";
4
4
  import type { PregelNode } from "./read.js";
5
- import { RetryPolicy } from "./utils.js";
5
+ import { RetryPolicy } from "./utils/index.js";
6
6
  import { Interrupt } from "../constants.js";
7
7
  import { BaseStore } from "../store/base.js";
8
8
  import { type ManagedValueSpec } from "../managed/base.js";
@@ -46,6 +46,7 @@ export interface PregelInterface<Nn extends StrRecord<string, PregelNode>, Cc ex
46
46
  debug?: boolean;
47
47
  checkpointer?: BaseCheckpointSaver;
48
48
  retryPolicy?: RetryPolicy;
49
+ config?: RunnableConfig;
49
50
  /**
50
51
  * Memory store to use for SharedValues.
51
52
  */
@@ -57,6 +58,8 @@ export interface PregelTaskDescription {
57
58
  readonly name: string;
58
59
  readonly error?: unknown;
59
60
  readonly interrupts: Interrupt[];
61
+ readonly state?: RunnableConfig | StateSnapshot;
62
+ readonly path?: [string, ...(string | number)[]];
60
63
  }
61
64
  export interface PregelExecutableTask<N extends PropertyKey, C extends PropertyKey> {
62
65
  readonly name: N;
@@ -67,6 +70,7 @@ export interface PregelExecutableTask<N extends PropertyKey, C extends PropertyK
67
70
  readonly triggers: Array<string>;
68
71
  readonly retry_policy?: RetryPolicy;
69
72
  readonly id: string;
73
+ readonly path?: [string, ...(string | number)[]];
70
74
  }
71
75
  export interface StateSnapshot {
72
76
  /**
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ensureLangGraphConfig = void 0;
4
+ const singletons_1 = require("@langchain/core/singletons");
5
+ const COPIABLE_KEYS = ["tags", "metadata", "callbacks", "configurable"];
6
+ const CONFIG_KEYS = [
7
+ "tags",
8
+ "metadata",
9
+ "callbacks",
10
+ "runName",
11
+ "maxConcurrency",
12
+ "recursionLimit",
13
+ "configurable",
14
+ "runId",
15
+ "outputKeys",
16
+ "streamMode",
17
+ ];
18
+ const DEFAULT_RECURSION_LIMIT = 25;
19
+ function ensureLangGraphConfig(...configs) {
20
+ const empty = {
21
+ tags: [],
22
+ metadata: {},
23
+ callbacks: undefined,
24
+ recursionLimit: DEFAULT_RECURSION_LIMIT,
25
+ configurable: {},
26
+ };
27
+ const implicitConfig = singletons_1.AsyncLocalStorageProviderSingleton.getRunnableConfig();
28
+ if (implicitConfig !== undefined) {
29
+ for (const [k, v] of Object.entries(implicitConfig)) {
30
+ if (v !== undefined) {
31
+ if (COPIABLE_KEYS.includes(k)) {
32
+ let copiedValue;
33
+ if (Array.isArray(v)) {
34
+ copiedValue = [...v];
35
+ }
36
+ else if (typeof v === "object") {
37
+ copiedValue = { ...v };
38
+ }
39
+ else {
40
+ copiedValue = v;
41
+ }
42
+ empty[k] = copiedValue;
43
+ }
44
+ else {
45
+ empty[k] = v;
46
+ }
47
+ }
48
+ }
49
+ }
50
+ for (const config of configs) {
51
+ if (config === undefined) {
52
+ continue;
53
+ }
54
+ for (const [k, v] of Object.entries(config)) {
55
+ if (v !== undefined && CONFIG_KEYS.includes(k)) {
56
+ empty[k] = v;
57
+ }
58
+ }
59
+ }
60
+ for (const [key, value] of Object.entries(empty.configurable)) {
61
+ empty.metadata = empty.metadata ?? {};
62
+ if (!key.startsWith("__") &&
63
+ (typeof value === "string" ||
64
+ typeof value === "number" ||
65
+ typeof value === "boolean") &&
66
+ !(key in empty.metadata)) {
67
+ empty.metadata[key] = value;
68
+ }
69
+ }
70
+ return empty;
71
+ }
72
+ exports.ensureLangGraphConfig = ensureLangGraphConfig;
@@ -0,0 +1,2 @@
1
+ import { RunnableConfig } from "@langchain/core/runnables";
2
+ export declare function ensureLangGraphConfig(...configs: (RunnableConfig | undefined)[]): RunnableConfig;
@@ -0,0 +1,68 @@
1
+ import { AsyncLocalStorageProviderSingleton } from "@langchain/core/singletons";
2
+ const COPIABLE_KEYS = ["tags", "metadata", "callbacks", "configurable"];
3
+ const CONFIG_KEYS = [
4
+ "tags",
5
+ "metadata",
6
+ "callbacks",
7
+ "runName",
8
+ "maxConcurrency",
9
+ "recursionLimit",
10
+ "configurable",
11
+ "runId",
12
+ "outputKeys",
13
+ "streamMode",
14
+ ];
15
+ const DEFAULT_RECURSION_LIMIT = 25;
16
+ export function ensureLangGraphConfig(...configs) {
17
+ const empty = {
18
+ tags: [],
19
+ metadata: {},
20
+ callbacks: undefined,
21
+ recursionLimit: DEFAULT_RECURSION_LIMIT,
22
+ configurable: {},
23
+ };
24
+ const implicitConfig = AsyncLocalStorageProviderSingleton.getRunnableConfig();
25
+ if (implicitConfig !== undefined) {
26
+ for (const [k, v] of Object.entries(implicitConfig)) {
27
+ if (v !== undefined) {
28
+ if (COPIABLE_KEYS.includes(k)) {
29
+ let copiedValue;
30
+ if (Array.isArray(v)) {
31
+ copiedValue = [...v];
32
+ }
33
+ else if (typeof v === "object") {
34
+ copiedValue = { ...v };
35
+ }
36
+ else {
37
+ copiedValue = v;
38
+ }
39
+ empty[k] = copiedValue;
40
+ }
41
+ else {
42
+ empty[k] = v;
43
+ }
44
+ }
45
+ }
46
+ }
47
+ for (const config of configs) {
48
+ if (config === undefined) {
49
+ continue;
50
+ }
51
+ for (const [k, v] of Object.entries(config)) {
52
+ if (v !== undefined && CONFIG_KEYS.includes(k)) {
53
+ empty[k] = v;
54
+ }
55
+ }
56
+ }
57
+ for (const [key, value] of Object.entries(empty.configurable)) {
58
+ empty.metadata = empty.metadata ?? {};
59
+ if (!key.startsWith("__") &&
60
+ (typeof value === "string" ||
61
+ typeof value === "number" ||
62
+ typeof value === "boolean") &&
63
+ !(key in empty.metadata)) {
64
+ empty.metadata[key] = value;
65
+ }
66
+ }
67
+ return empty;
68
+ }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports._getIdMetadata = exports._coerceToDict = exports.getNewChannelVersions = exports.getNullChannelVersion = void 0;
3
+ exports.patchCheckpointMap = exports.patchConfigurable = exports._coerceToDict = exports.getNewChannelVersions = exports.getNullChannelVersion = void 0;
4
+ const constants_js_1 = require("../../constants.cjs");
4
5
  function getNullChannelVersion(currentVersions) {
5
6
  const versionValues = Object.values(currentVersions);
6
7
  const versionType = versionValues.length > 0 ? typeof versionValues[0] : undefined;
@@ -36,13 +37,35 @@ function _coerceToDict(value, defaultKey) {
36
37
  : { [defaultKey]: value };
37
38
  }
38
39
  exports._coerceToDict = _coerceToDict;
39
- // Order matters
40
- function _getIdMetadata(metadata) {
41
- return {
42
- langgraph_step: metadata.langgraph_step,
43
- langgraph_node: metadata.langgraph_node,
44
- langgraph_triggers: metadata.langgraph_triggers,
45
- langgraph_task_idx: metadata.langgraph_task_idx,
46
- };
40
+ function patchConfigurable(config,
41
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
+ patch) {
43
+ if (config === null) {
44
+ return { configurable: patch };
45
+ }
46
+ else if (config?.configurable === undefined) {
47
+ return { ...config, configurable: patch };
48
+ }
49
+ else {
50
+ return {
51
+ ...config,
52
+ configurable: { ...config.configurable, ...patch },
53
+ };
54
+ }
55
+ }
56
+ exports.patchConfigurable = patchConfigurable;
57
+ function patchCheckpointMap(config, metadata) {
58
+ const parents = metadata?.parents ?? {};
59
+ if (Object.keys(parents).length > 0) {
60
+ return patchConfigurable(config, {
61
+ [constants_js_1.CONFIG_KEY_CHECKPOINT_MAP]: {
62
+ ...parents,
63
+ [config.configurable?.checkpoint_ns ?? ""]: config.configurable?.checkpoint_id,
64
+ },
65
+ });
66
+ }
67
+ else {
68
+ return config;
69
+ }
47
70
  }
48
- exports._getIdMetadata = _getIdMetadata;
71
+ exports.patchCheckpointMap = patchCheckpointMap;
@@ -1,13 +1,8 @@
1
- import type { ChannelVersions } from "@langchain/langgraph-checkpoint";
1
+ import { RunnableConfig } from "@langchain/core/runnables";
2
+ import type { ChannelVersions, CheckpointMetadata } from "@langchain/langgraph-checkpoint";
2
3
  export declare function getNullChannelVersion(currentVersions: ChannelVersions): string | number | undefined;
3
4
  export declare function getNewChannelVersions(previousVersions: ChannelVersions, currentVersions: ChannelVersions): ChannelVersions;
4
5
  export declare function _coerceToDict(value: any, defaultKey: string): any;
5
- export declare function _getIdMetadata(metadata: Record<string, unknown>): {
6
- langgraph_step: unknown;
7
- langgraph_node: unknown;
8
- langgraph_triggers: unknown;
9
- langgraph_task_idx: unknown;
10
- };
11
6
  export type RetryPolicy = {
12
7
  /**
13
8
  * Amount of time that must elapse before the first retry occurs in milliseconds.
@@ -34,3 +29,5 @@ export type RetryPolicy = {
34
29
  /** A function that returns True for exceptions that should trigger a retry. */
35
30
  retryOn?: (e: any) => boolean;
36
31
  };
32
+ export declare function patchConfigurable(config: RunnableConfig | undefined, patch: Record<string, any>): RunnableConfig;
33
+ export declare function patchCheckpointMap(config: RunnableConfig, metadata?: CheckpointMetadata): RunnableConfig;
@@ -1,3 +1,4 @@
1
+ import { CONFIG_KEY_CHECKPOINT_MAP } from "../../constants.js";
1
2
  export function getNullChannelVersion(currentVersions) {
2
3
  const versionValues = Object.values(currentVersions);
3
4
  const versionType = versionValues.length > 0 ? typeof versionValues[0] : undefined;
@@ -30,12 +31,33 @@ export function _coerceToDict(value, defaultKey) {
30
31
  ? value
31
32
  : { [defaultKey]: value };
32
33
  }
33
- // Order matters
34
- export function _getIdMetadata(metadata) {
35
- return {
36
- langgraph_step: metadata.langgraph_step,
37
- langgraph_node: metadata.langgraph_node,
38
- langgraph_triggers: metadata.langgraph_triggers,
39
- langgraph_task_idx: metadata.langgraph_task_idx,
40
- };
34
+ export function patchConfigurable(config,
35
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
36
+ patch) {
37
+ if (config === null) {
38
+ return { configurable: patch };
39
+ }
40
+ else if (config?.configurable === undefined) {
41
+ return { ...config, configurable: patch };
42
+ }
43
+ else {
44
+ return {
45
+ ...config,
46
+ configurable: { ...config.configurable, ...patch },
47
+ };
48
+ }
49
+ }
50
+ export function patchCheckpointMap(config, metadata) {
51
+ const parents = metadata?.parents ?? {};
52
+ if (Object.keys(parents).length > 0) {
53
+ return patchConfigurable(config, {
54
+ [CONFIG_KEY_CHECKPOINT_MAP]: {
55
+ ...parents,
56
+ [config.configurable?.checkpoint_ns ?? ""]: config.configurable?.checkpoint_id,
57
+ },
58
+ });
59
+ }
60
+ else {
61
+ return config;
62
+ }
41
63
  }
package/dist/utils.cjs CHANGED
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.patchConfigurable = exports.gatherIteratorSync = exports.gatherIterator = exports.prefixGenerator = exports.RunnableCallable = void 0;
4
4
  const runnables_1 = require("@langchain/core/runnables");
5
5
  const singletons_1 = require("@langchain/core/singletons");
6
+ const config_js_1 = require("./pregel/utils/config.cjs");
6
7
  class RunnableCallable extends runnables_1.Runnable {
7
8
  constructor(fields) {
8
9
  super();
@@ -72,14 +73,15 @@ class RunnableCallable extends runnables_1.Runnable {
72
73
  ) {
73
74
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
74
75
  let returnValue;
76
+ const config = (0, config_js_1.ensureLangGraphConfig)(options);
75
77
  if (this.trace) {
76
- returnValue = await this._callWithConfig(this._tracedInvoke, input, (0, runnables_1.mergeConfigs)(this.config, options));
78
+ returnValue = await this._callWithConfig(this._tracedInvoke, input, (0, runnables_1.mergeConfigs)(this.config, config));
77
79
  }
78
80
  else {
79
- returnValue = await this.func(input, (0, runnables_1.mergeConfigs)(this.config, options));
81
+ returnValue = await this.func(input, (0, runnables_1.mergeConfigs)(this.config, config));
80
82
  }
81
83
  if (runnables_1.Runnable.isRunnable(returnValue) && this.recurse) {
82
- return await returnValue.invoke(input, options);
84
+ return await returnValue.invoke(input, config);
83
85
  }
84
86
  return returnValue;
85
87
  }
package/dist/utils.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { mergeConfigs, patchConfig, Runnable, } from "@langchain/core/runnables";
2
2
  import { AsyncLocalStorageProviderSingleton } from "@langchain/core/singletons";
3
+ import { ensureLangGraphConfig } from "./pregel/utils/config.js";
3
4
  export class RunnableCallable extends Runnable {
4
5
  constructor(fields) {
5
6
  super();
@@ -69,14 +70,15 @@ export class RunnableCallable extends Runnable {
69
70
  ) {
70
71
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
71
72
  let returnValue;
73
+ const config = ensureLangGraphConfig(options);
72
74
  if (this.trace) {
73
- returnValue = await this._callWithConfig(this._tracedInvoke, input, mergeConfigs(this.config, options));
75
+ returnValue = await this._callWithConfig(this._tracedInvoke, input, mergeConfigs(this.config, config));
74
76
  }
75
77
  else {
76
- returnValue = await this.func(input, mergeConfigs(this.config, options));
78
+ returnValue = await this.func(input, mergeConfigs(this.config, config));
77
79
  }
78
80
  if (Runnable.isRunnable(returnValue) && this.recurse) {
79
- return await returnValue.invoke(input, options);
81
+ return await returnValue.invoke(input, config);
80
82
  }
81
83
  return returnValue;
82
84
  }
package/dist/web.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  export { END, Graph, type StateGraphArgs, START, StateGraph, type CompiledStateGraph, MessageGraph, messagesStateReducer, type Messages, Annotation, type StateType, type UpdateType, type NodeType, type StateDefinition, type SingleReducer, type CompiledGraph, } from "./graph/index.js";
2
+ export type { StateSnapshot } from "./pregel/types.js";
2
3
  export * from "./errors.js";
3
4
  export { BaseChannel, type BinaryOperator, BinaryOperatorAggregate, type AnyValue, type WaitForNames, type DynamicBarrierValue, type LastValue, type NamedBarrierValue, type Topic, } from "./channels/index.js";
4
5
  export { type AnnotationRoot as _INTERNAL_ANNOTATION_ROOT } from "./graph/index.js";
5
- export { type RetryPolicy } from "./pregel/utils.js";
6
+ export { type RetryPolicy } from "./pregel/utils/index.js";
6
7
  export { Send } from "./constants.js";
7
8
  export { MemorySaver, type Checkpoint, type CheckpointMetadata, type CheckpointTuple, copyCheckpoint, emptyCheckpoint, BaseCheckpointSaver, } from "@langchain/langgraph-checkpoint";
8
9
  export * from "./store/index.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langchain/langgraph",
3
- "version": "0.2.8",
3
+ "version": "0.2.9",
4
4
  "description": "LangGraph",
5
5
  "type": "module",
6
6
  "engines": {