{"version":3,"file":"remote.cjs","names":["updatedStreamModes: StreamMode[]","Runnable","Client","tasks: PregelTaskDescription[]","CONFIG_KEY_STREAM","isCommand","namespace: string[]","CHECKPOINT_NAMESPACE_SEPARATOR","INTERRUPT","GraphInterrupt","RemoteException","nodesMap: Record<string, DrawableNode>","DrawableGraph"],"sources":["../../src/pregel/remote.ts"],"sourcesContent":["import {\n  Client,\n  type Checkpoint,\n  type ThreadState,\n} from \"@langchain/langgraph-sdk\";\nimport {\n  Graph as DrawableGraph,\n  Node as DrawableNode,\n} from \"@langchain/core/runnables/graph\";\nimport {\n  mergeConfigs,\n  Runnable,\n  RunnableConfig,\n} from \"@langchain/core/runnables\";\nimport {\n  All,\n  CheckpointListOptions,\n  CheckpointMetadata,\n} from \"@langchain/langgraph-checkpoint\";\nimport { StreamEvent } from \"@langchain/core/tracers/log_stream\";\nimport { IterableReadableStream } from \"@langchain/core/utils/stream\";\nimport { isBaseMessage } from \"@langchain/core/messages\";\n\nimport {\n  BaseChannel,\n  GraphInterrupt,\n  LangGraphRunnableConfig,\n  RemoteException,\n} from \"../web.js\";\nimport { StrRecord } from \"./algo.js\";\nimport { PregelInputType, PregelOptions, PregelOutputType } from \"./index.js\";\nimport { PregelNode } from \"./read.js\";\nimport {\n  PregelParams,\n  PregelInterface,\n  PregelTaskDescription,\n  StateSnapshot,\n  StreamMode,\n} from \"./types.js\";\nimport {\n  CHECKPOINT_NAMESPACE_SEPARATOR,\n  CONFIG_KEY_STREAM,\n  INTERRUPT,\n  isCommand,\n} from \"../constants.js\";\n\nexport type RemoteGraphParams = Omit<\n  PregelParams<StrRecord<string, PregelNode>, StrRecord<string, BaseChannel>>,\n  \"channels\" | \"nodes\" | \"inputChannels\" | \"outputChannels\"\n> & {\n  graphId: string;\n  client?: Client;\n  url?: string;\n  apiKey?: string;\n  headers?: Record<string, string>;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _serializeInputs = (obj: any): any => {\n  if (obj === null || typeof obj !== \"object\") {\n    return obj;\n  }\n\n  if (Array.isArray(obj)) {\n    return obj.map(_serializeInputs);\n  }\n\n  // Handle BaseMessage instances by converting them to a serializable format\n  if (isBaseMessage(obj)) {\n    const dict = obj.toDict();\n    return {\n      ...dict.data,\n      role: obj.getType(),\n    };\n  }\n\n  return Object.fromEntries(\n    Object.entries(obj).map(([key, value]) => [key, _serializeInputs(value)])\n  );\n};\n\n/**\n * Return a tuple of the final list of stream modes sent to the\n * remote graph and a boolean flag indicating if only one stream mode was\n * originally requested and whether stream mode 'updates'\n * was present in the original list of stream modes.\n *\n * 'updates' mode is always added to the list of stream modes so that interrupts\n * can be detected in the remote graph.\n */\nconst getStreamModes = (\n  streamMode?: StreamMode | StreamMode[],\n  defaultStreamMode: StreamMode = \"updates\"\n) => {\n  const updatedStreamModes: StreamMode[] = [];\n  let reqUpdates = false;\n  let reqSingle = true;\n\n  if (\n    streamMode !== undefined &&\n    (typeof streamMode === \"string\" ||\n      (Array.isArray(streamMode) && streamMode.length > 0))\n  ) {\n    reqSingle = typeof streamMode === \"string\";\n    const mapped = Array.isArray(streamMode) ? streamMode : [streamMode];\n    updatedStreamModes.push(...mapped);\n  } else {\n    updatedStreamModes.push(defaultStreamMode);\n  }\n  if (updatedStreamModes.includes(\"updates\")) {\n    reqUpdates = true;\n  } else {\n    updatedStreamModes.push(\"updates\");\n  }\n  return {\n    updatedStreamModes,\n    reqUpdates,\n    reqSingle,\n  };\n};\n\n/**\n * The `RemoteGraph` class is a client implementation for calling remote\n * APIs that implement the LangGraph Server API specification.\n *\n * For example, the `RemoteGraph` class can be used to call APIs from deployments\n * on LangGraph Cloud.\n *\n * `RemoteGraph` behaves the same way as a `StateGraph` and can be used directly as\n * a node in another `StateGraph`.\n *\n * @example\n * ```ts\n * import { RemoteGraph } from \"@langchain/langgraph/remote\";\n *\n * // Can also pass a LangGraph SDK client instance directly\n * const remoteGraph = new RemoteGraph({\n *   graphId: process.env.LANGGRAPH_REMOTE_GRAPH_ID!,\n *   apiKey: process.env.LANGGRAPH_REMOTE_GRAPH_API_KEY,\n *   url: process.env.LANGGRAPH_REMOTE_GRAPH_API_URL,\n * });\n *\n * const input = {\n *   messages: [\n *     {\n *       role: \"human\",\n *       content: \"Hello world!\",\n *     },\n *   ],\n * };\n *\n * const config = {\n *   configurable: { thread_id: \"threadId1\" },\n * };\n *\n * await remoteGraph.invoke(input, config);\n * ```\n */\nexport class RemoteGraph<\n    Nn extends StrRecord<string, PregelNode> = StrRecord<string, PregelNode>,\n    Cc extends StrRecord<string, BaseChannel> = StrRecord<string, BaseChannel>,\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    ContextType extends Record<string, any> = StrRecord<string, any>\n  >\n  extends Runnable<\n    PregelInputType,\n    PregelOutputType,\n    PregelOptions<Nn, Cc, ContextType>\n  >\n  implements PregelInterface<Nn, Cc, ContextType>\n{\n  static lc_name() {\n    return \"RemoteGraph\";\n  }\n\n  lc_namespace = [\"langgraph\", \"pregel\"];\n\n  lg_is_pregel = true;\n\n  config?: RunnableConfig;\n\n  graphId: string;\n\n  protected client: Client;\n\n  protected interruptBefore?: Array<keyof Nn> | All;\n\n  protected interruptAfter?: Array<keyof Nn> | All;\n\n  constructor(params: RemoteGraphParams) {\n    super(params);\n\n    this.graphId = params.graphId;\n    this.client =\n      params.client ??\n      new Client({\n        apiUrl: params.url,\n        apiKey: params.apiKey,\n        defaultHeaders: params.headers,\n      });\n    this.config = params.config;\n    this.interruptBefore = params.interruptBefore;\n    this.interruptAfter = params.interruptAfter;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore Remove ignore when we remove support for 0.2 versions of core\n  override withConfig(config: RunnableConfig): typeof this {\n    const mergedConfig = mergeConfigs(this.config, config);\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return new (this.constructor as any)({ ...this, config: mergedConfig });\n  }\n\n  protected _sanitizeConfig(config: RunnableConfig) {\n    const reservedConfigurableKeys = new Set([\n      \"callbacks\",\n      \"checkpoint_map\",\n      \"checkpoint_id\",\n      \"checkpoint_ns\",\n    ]);\n\n    const sanitizeObj = <T>(obj: T): T => {\n      try {\n        // This will only throw if we're trying to serialize a circular reference\n        // or trying to serialize a BigInt...\n        JSON.stringify(obj);\n        return obj;\n      } catch {\n        const seen = new WeakSet();\n        return JSON.parse(\n          JSON.stringify(obj, (_, value) => {\n            if (typeof value === \"object\" && value != null) {\n              if (seen.has(value)) return \"[Circular]\";\n              seen.add(value);\n            }\n\n            if (typeof value === \"bigint\") return value.toString();\n            return value;\n          })\n        );\n      }\n    };\n\n    // Remove non-JSON serializable fields from the config\n    const sanitizedConfig = sanitizeObj(config);\n\n    // Only include configurable keys that are not reserved and\n    // not starting with \"__pregel_\" prefix\n    const newConfigurable = Object.fromEntries(\n      Object.entries(sanitizedConfig.configurable ?? {}).filter(\n        ([k]) => !reservedConfigurableKeys.has(k) && !k.startsWith(\"__pregel_\")\n      )\n    );\n\n    return {\n      tags: sanitizedConfig.tags ?? [],\n      metadata: sanitizedConfig.metadata ?? {},\n      configurable: newConfigurable,\n      recursion_limit: sanitizedConfig.recursionLimit,\n    };\n  }\n\n  protected _getConfig(checkpoint: Record<string, unknown>): RunnableConfig {\n    return {\n      configurable: {\n        thread_id: checkpoint.thread_id,\n        checkpoint_ns: checkpoint.checkpoint_ns,\n        checkpoint_id: checkpoint.checkpoint_id,\n        checkpoint_map: checkpoint.checkpoint_map ?? {},\n      },\n    };\n  }\n\n  protected _getCheckpoint(config?: RunnableConfig): Checkpoint | undefined {\n    if (config?.configurable === undefined) {\n      return undefined;\n    }\n\n    const checkpointKeys = [\n      \"thread_id\",\n      \"checkpoint_ns\",\n      \"checkpoint_id\",\n      \"checkpoint_map\",\n    ] as const;\n\n    const checkpoint = Object.fromEntries(\n      checkpointKeys\n        .map((key) => [key, config.configurable![key]])\n        .filter(([_, value]) => value !== undefined)\n    );\n\n    return Object.keys(checkpoint).length > 0 ? checkpoint : undefined;\n  }\n\n  protected _createStateSnapshot(state: ThreadState): StateSnapshot {\n    const tasks: PregelTaskDescription[] = state.tasks.map((task) => {\n      return {\n        id: task.id,\n        name: task.name,\n        error: task.error ? { message: task.error } : undefined,\n        // TODO: remove in LangGraph.js 0.4\n        interrupts: task.interrupts.map(({ id, ...rest }) => ({\n          interrupt_id: id,\n          ...rest,\n        })),\n        // eslint-disable-next-line no-nested-ternary\n        state: task.state\n          ? this._createStateSnapshot(task.state)\n          : task.checkpoint\n          ? { configurable: task.checkpoint }\n          : undefined,\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        result: (task as any).result,\n      };\n    });\n\n    return {\n      values: state.values,\n      next: state.next ? [...state.next] : [],\n      config: {\n        configurable: {\n          thread_id: state.checkpoint.thread_id,\n          checkpoint_ns: state.checkpoint.checkpoint_ns,\n          checkpoint_id: state.checkpoint.checkpoint_id,\n          checkpoint_map: state.checkpoint.checkpoint_map ?? {},\n        },\n      },\n      metadata: state.metadata\n        ? (state.metadata as CheckpointMetadata)\n        : undefined,\n      createdAt: state.created_at ?? undefined,\n      parentConfig: state.parent_checkpoint\n        ? {\n            configurable: {\n              thread_id: state.parent_checkpoint.thread_id,\n              checkpoint_ns: state.parent_checkpoint.checkpoint_ns,\n              checkpoint_id: state.parent_checkpoint.checkpoint_id,\n              checkpoint_map: state.parent_checkpoint.checkpoint_map ?? {},\n            },\n          }\n        : undefined,\n      tasks,\n    };\n  }\n\n  override async invoke(\n    input: PregelInputType,\n    options?: Partial<PregelOptions<Nn, Cc, ContextType>>\n  ): Promise<PregelOutputType> {\n    let lastValue;\n    const stream = await this.stream(input, {\n      ...options,\n      streamMode: \"values\",\n    });\n    for await (const chunk of stream) {\n      lastValue = chunk;\n    }\n    return lastValue;\n  }\n\n  override streamEvents(\n    input: PregelInputType,\n    options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n      version: \"v1\" | \"v2\";\n    }\n  ): IterableReadableStream<StreamEvent>;\n\n  override streamEvents(\n    input: PregelInputType,\n    options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n      version: \"v1\" | \"v2\";\n      encoding: never;\n    }\n  ): IterableReadableStream<never>;\n\n  override streamEvents(\n    _input: PregelInputType,\n    _options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n      version: \"v1\" | \"v2\";\n      encoding?: never;\n    }\n  ): IterableReadableStream<StreamEvent> {\n    throw new Error(\"Not implemented.\");\n  }\n\n  override async *_streamIterator(\n    input: PregelInputType,\n    options?: Partial<PregelOptions<Nn, Cc, ContextType>>\n  ): AsyncGenerator<PregelOutputType> {\n    const mergedConfig = mergeConfigs(this.config, options);\n    const sanitizedConfig = this._sanitizeConfig(mergedConfig);\n\n    const streamProtocolInstance = options?.configurable?.[CONFIG_KEY_STREAM];\n\n    const streamSubgraphs =\n      options?.subgraphs ?? streamProtocolInstance !== undefined;\n\n    const interruptBefore = options?.interruptBefore ?? this.interruptBefore;\n    const interruptAfter = options?.interruptAfter ?? this.interruptAfter;\n\n    const { updatedStreamModes, reqSingle, reqUpdates } = getStreamModes(\n      options?.streamMode\n    );\n\n    const extendedStreamModes = [\n      ...new Set([\n        ...updatedStreamModes,\n        ...(streamProtocolInstance?.modes ?? new Set()),\n      ]),\n    ].map((mode) => {\n      if (mode === \"messages\") return \"messages-tuple\";\n      return mode;\n    });\n\n    let command;\n    let serializedInput;\n    if (isCommand(input)) {\n      // TODO: Remove cast when SDK type fix gets merged\n      command = input.toJSON() as Record<string, unknown>;\n      serializedInput = undefined;\n    } else {\n      serializedInput = _serializeInputs(input);\n    }\n\n    for await (const chunk of this.client.runs.stream(\n      sanitizedConfig.configurable.thread_id as string,\n      this.graphId,\n      {\n        command,\n        input: serializedInput,\n        config: sanitizedConfig,\n        streamMode: extendedStreamModes,\n        interruptBefore: interruptBefore as string[],\n        interruptAfter: interruptAfter as string[],\n        streamSubgraphs,\n        ifNotExists: \"create\",\n        signal: mergedConfig.signal,\n      }\n    )) {\n      let mode;\n      let namespace: string[];\n      if (chunk.event.includes(CHECKPOINT_NAMESPACE_SEPARATOR)) {\n        const eventComponents = chunk.event.split(\n          CHECKPOINT_NAMESPACE_SEPARATOR\n        );\n        // eslint-disable-next-line prefer-destructuring\n        mode = eventComponents[0];\n        namespace = eventComponents.slice(1);\n      } else {\n        mode = chunk.event;\n        namespace = [];\n      }\n      const callerNamespace = options?.configurable?.checkpoint_ns;\n      if (typeof callerNamespace === \"string\") {\n        namespace = callerNamespace\n          .split(CHECKPOINT_NAMESPACE_SEPARATOR)\n          .concat(namespace);\n      }\n      if (\n        streamProtocolInstance !== undefined &&\n        streamProtocolInstance.modes?.has(chunk.event)\n      ) {\n        streamProtocolInstance.push([namespace, mode, chunk.data]);\n      }\n      if (chunk.event.startsWith(\"updates\")) {\n        if (\n          typeof chunk.data === \"object\" &&\n          chunk.data?.[INTERRUPT] !== undefined\n        ) {\n          throw new GraphInterrupt(chunk.data[INTERRUPT]);\n        }\n        if (!reqUpdates) {\n          continue;\n        }\n      } else if (chunk.event?.startsWith(\"error\")) {\n        throw new RemoteException(\n          typeof chunk.data === \"string\"\n            ? chunk.data\n            : JSON.stringify(chunk.data)\n        );\n      }\n      if (\n        !updatedStreamModes.includes(\n          chunk.event.split(CHECKPOINT_NAMESPACE_SEPARATOR)[0] as StreamMode\n        )\n      ) {\n        continue;\n      }\n      if (options?.subgraphs) {\n        if (reqSingle) {\n          yield [namespace, chunk.data];\n        } else {\n          yield [namespace, mode, chunk.data];\n        }\n      } else if (reqSingle) {\n        yield chunk.data;\n      } else {\n        yield [mode, chunk.data];\n      }\n    }\n  }\n\n  async updateState(\n    inputConfig: LangGraphRunnableConfig,\n    values: Record<string, unknown>,\n    asNode?: string\n  ): Promise<RunnableConfig> {\n    const mergedConfig = mergeConfigs(this.config, inputConfig);\n    const response = await this.client.threads.updateState(\n      mergedConfig.configurable?.thread_id,\n      { values, asNode, checkpoint: this._getCheckpoint(mergedConfig) }\n    );\n    // TODO: Fix SDK typing\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return this._getConfig((response as any).checkpoint);\n  }\n\n  async *getStateHistory(\n    config: RunnableConfig,\n    options?: CheckpointListOptions\n  ): AsyncIterableIterator<StateSnapshot> {\n    const mergedConfig = mergeConfigs(this.config, config);\n    const states = await this.client.threads.getHistory(\n      mergedConfig.configurable?.thread_id,\n      {\n        limit: options?.limit ?? 10,\n        // TODO: Fix type\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        before: this._getCheckpoint(options?.before) as any,\n        metadata: options?.filter,\n        checkpoint: this._getCheckpoint(mergedConfig),\n      }\n    );\n    for (const state of states) {\n      yield this._createStateSnapshot(state);\n    }\n  }\n\n  protected _getDrawableNodes(\n    nodes: Array<{\n      id: string | number;\n      name?: string;\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      data?: Record<string, any> | string;\n      metadata?: unknown;\n    }>\n  ): Record<string, DrawableNode> {\n    const nodesMap: Record<string, DrawableNode> = {};\n    for (const node of nodes) {\n      const nodeId = node.id;\n      nodesMap[nodeId] = {\n        id: nodeId.toString(),\n        name: typeof node.data === \"string\" ? node.data : node.data?.name ?? \"\",\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        data: (node.data as any) ?? {},\n        metadata:\n          typeof node.data !== \"string\" ? node.data?.metadata ?? {} : {},\n      };\n    }\n    return nodesMap;\n  }\n\n  async getState(\n    config: RunnableConfig,\n    options?: { subgraphs?: boolean }\n  ): Promise<StateSnapshot> {\n    const mergedConfig = mergeConfigs(this.config, config);\n\n    const state = await this.client.threads.getState(\n      mergedConfig.configurable?.thread_id,\n      this._getCheckpoint(mergedConfig),\n      options\n    );\n    return this._createStateSnapshot(state);\n  }\n\n  /** @deprecated Use getGraphAsync instead. The async method will become the default in the next minor release. */\n  override getGraph(\n    _?: RunnableConfig & { xray?: boolean | number }\n  ): DrawableGraph {\n    throw new Error(\n      `The synchronous \"getGraph\" is not supported for this graph. Call \"getGraphAsync\" instead.`\n    );\n  }\n\n  /**\n   * Returns a drawable representation of the computation graph.\n   */\n  async getGraphAsync(config?: RunnableConfig & { xray?: boolean | number }) {\n    const graph = await this.client.assistants.getGraph(this.graphId, {\n      xray: config?.xray,\n    });\n    return new DrawableGraph({\n      nodes: this._getDrawableNodes(graph.nodes),\n      edges: graph.edges,\n    });\n  }\n\n  /** @deprecated Use getSubgraphsAsync instead. The async method will become the default in the next minor release. */\n  getSubgraphs(): Generator<[string, PregelInterface<Nn, Cc, ContextType>]> {\n    throw new Error(\n      `The synchronous \"getSubgraphs\" method is not supported for this graph. Call \"getSubgraphsAsync\" instead.`\n    );\n  }\n\n  async *getSubgraphsAsync(\n    namespace?: string,\n    recurse = false\n  ): AsyncGenerator<[string, PregelInterface<Nn, Cc, ContextType>]> {\n    const subgraphs = await this.client.assistants.getSubgraphs(this.graphId, {\n      namespace,\n      recurse,\n    });\n\n    for (const [ns, graphSchema] of Object.entries(subgraphs)) {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const remoteSubgraph = new (this.constructor as any)({\n        ...this,\n        graphId: graphSchema.graph_id,\n      });\n      yield [ns, remoteSubgraph];\n    }\n  }\n}\n"],"mappings":"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"}