import { BaseChannel } from "./base.cjs"; import { OverwriteValue } from "../constants.cjs"; import { CheckpointPendingWrite, DeltaSnapshot } from "@langchain/langgraph-checkpoint"; //#region src/channels/delta.d.ts /** * A batch reducer for use with {@link DeltaChannel}. * * Receives the current accumulated value and a batch of writes in one call, * returning the new accumulated value: * `reducer(state, [write1, write2, ...]) -> newState`. * * Reducers must be deterministic and batching-invariant (associative across * folds): applying two consecutive write batches separately must produce the * same state as applying their concatenation once: * * ```text * reducer(reducer(state, xs), ys) === reducer(state, xs.concat(ys)) * ``` * * This lets LangGraph replay checkpointed writes in larger batches than they * were originally produced without changing reconstructed state. If your * reducer is not associative, use {@link BinaryOperatorAggregate} instead — * `DeltaChannel` is not a drop-in replacement for every reducer. */ type DeltaReducer = (state: ValueType, writes: UpdateType[]) => ValueType; type OverwriteOrValue = OverwriteValue | UpdateType; /** * Reducer channel that stores only a sentinel in checkpoint blobs and * reconstructs state by replaying ancestor writes through the reducer. * * `DeltaChannel` avoids re-serializing the full accumulated value at every * step. Instead of writing the value into `channel_values`, the channel is * omitted entirely and its state is reconstructed on read by walking the * ancestor chain and replaying the per-step writes through the reducer (see * {@link BaseCheckpointSaver.getDeltaChannelHistory}). * * Snapshot cadence is driven by two counters: a per-channel update count and * the total supersteps since the last snapshot. A full {@link DeltaSnapshot} * blob is written when EITHER the update count reaches `snapshotFrequency` OR * the supersteps count reaches the system-wide * `DELTA_MAX_SUPERSTEPS_SINCE_SNAPSHOT` bound (default 5000), bounding replay * depth even for channels that stop receiving writes. * * @remarks Beta. The API and on-disk representation may change in future * releases. Threads written with `DeltaChannel` today are expected to remain * readable, but the surrounding contract (`getDeltaChannelHistory`, the * `DeltaSnapshot` blob shape, the `counters_since_delta_snapshot` metadata * field) is not yet stable. * * @example * ```typescript * import { Annotation } from "@langchain/langgraph"; * import { DeltaChannel, messagesDeltaReducer } from "@langchain/langgraph"; * * const State = Annotation.Root({ * messages: Annotation({ * reducer: () => [], // ignored; DeltaChannel is supplied below * }), * }); * ``` */ declare class DeltaChannel extends BaseChannel, undefined> { lc_graph_name: string; /** `undefined` represents the Python `MISSING` sentinel (empty channel). */ value: ValueType | undefined; reducer: DeltaReducer; snapshotFrequency: number; initialValueFactory: () => ValueType; constructor(reducer: DeltaReducer, options?: { snapshotFrequency?: number; initialValueFactory?: () => ValueType; }); fromCheckpoint(checkpoint?: undefined | DeltaSnapshot | ValueType): this; /** * Apply ancestor writes oldest-to-newest via a single reducer call. * * If any write is an Overwrite, the last one in the sequence acts as the * reset point: its value becomes the new base and only writes after it are * passed to the reducer. */ replayWrites(writes: CheckpointPendingWrite[]): void; update(values: OverwriteOrValue[]): boolean; get(): ValueType; /** * Always returns `undefined` (the Python `MISSING` sentinel). Snapshot * decisions live in `createCheckpoint`, which has the channel version and * writes a {@link DeltaSnapshot} directly into `channel_values`. For * non-snapshot steps the channel does not appear in `channel_values`; * reconstruction walks ancestor writes via the saver's * `getDeltaChannelHistory`. */ checkpoint(): undefined; isAvailable(): boolean; equals(other: BaseChannel): boolean; } //#endregion export { DeltaChannel, DeltaReducer }; //# sourceMappingURL=delta.d.cts.map