UNPKG

@langchain/langgraph

Version:
1 lines 6.63 kB
{"version":3,"file":"remote-run-stream.cjs","names":["GraphRunStream","#client","#thread","#runId","#abortController","StreamMux","#iterateEvents","#iterateLifecycle","#cancelAndClose"],"sources":["../../src/pregel/remote-run-stream.ts"],"sourcesContent":["import type { Channel, Event } from \"@langchain/protocol\";\nimport type { Client, ThreadStream } from \"@langchain/langgraph-sdk\";\n\nimport { GraphRunStream, SubgraphRunStream } from \"../stream/run-stream.js\";\nimport { StreamMux } from \"../stream/mux.js\";\nimport type {\n ChatModelStreamHandle,\n InterruptPayload,\n ProtocolEvent,\n} from \"../stream/types.js\";\nimport type { LifecycleEntry } from \"../stream/transformers/index.js\";\n\nconst REMOTE_V3_CHANNELS: Channel[] = [\n \"values\",\n \"updates\",\n \"messages\",\n \"tools\",\n \"custom\",\n \"tasks\",\n \"checkpoints\",\n \"lifecycle\",\n \"input\",\n];\n\n/**\n * Adapts the SDK's remote ThreadStream to the local GraphRunStream shape.\n */\nexport class RemoteGraphRunStream<\n TValues = Record<string, unknown>,\n TExtensions extends Record<string, unknown> = Record<string, unknown>,\n> extends GraphRunStream<TValues, TExtensions> {\n readonly #client: Client;\n\n readonly #thread: ThreadStream<TExtensions>;\n\n readonly #runId: string | undefined;\n\n readonly #abortController: AbortController;\n\n constructor(params: {\n client: Client;\n thread: ThreadStream<TExtensions>;\n runId?: string;\n abortController?: AbortController;\n }) {\n const abortController = params.abortController ?? new AbortController();\n super(\n [],\n new StreamMux(),\n 0,\n 0,\n params.thread.extensions as TExtensions,\n abortController\n );\n this.#client = params.client;\n this.#thread = params.thread;\n this.#runId = params.runId;\n this.#abortController = abortController;\n }\n\n override [Symbol.asyncIterator](): AsyncIterator<ProtocolEvent> {\n return this.#iterateEvents()[Symbol.asyncIterator]();\n }\n\n override get subgraphs(): AsyncIterable<SubgraphRunStream> {\n const subgraphs = this.#thread.subgraphs as unknown;\n return subgraphs as AsyncIterable<SubgraphRunStream>;\n }\n\n override get values(): AsyncIterable<TValues> & PromiseLike<TValues> {\n return this.#thread.values as AsyncIterable<TValues> & PromiseLike<TValues>;\n }\n\n override get messages(): AsyncIterable<ChatModelStreamHandle> {\n const messages = this.#thread.messages as unknown;\n return messages as AsyncIterable<ChatModelStreamHandle>;\n }\n\n override get lifecycle(): AsyncIterable<LifecycleEntry> {\n return this.#iterateLifecycle();\n }\n\n override messagesFrom(node: string): AsyncIterable<ChatModelStreamHandle> {\n const messages = this.messages;\n return {\n async *[Symbol.asyncIterator]() {\n for await (const message of messages) {\n if (message.node === node) {\n yield message;\n }\n }\n },\n };\n }\n\n override get output(): Promise<TValues> {\n return this.#thread.output as Promise<TValues>;\n }\n\n override get interrupted(): boolean {\n return this.#thread.interrupted;\n }\n\n override get interrupts(): readonly InterruptPayload[] {\n return this.#thread.interrupts as readonly InterruptPayload[];\n }\n\n override abort(reason?: unknown): void {\n if (this.#abortController.signal.aborted) return;\n this.#abortController.abort(reason);\n void this.#cancelAndClose();\n }\n\n override get signal(): AbortSignal {\n return this.#abortController.signal;\n }\n\n get thread(): ThreadStream<TExtensions> {\n return this.#thread;\n }\n\n async #cancelAndClose(): Promise<void> {\n try {\n if (this.#runId != null) {\n await this.#client.runs.cancel(\n this.#thread.threadId,\n this.#runId,\n false\n );\n }\n } catch {\n // Best effort: closing the ThreadStream still releases client resources.\n }\n try {\n await this.#thread.close();\n } catch {\n // Best effort.\n }\n }\n\n async *#iterateEvents(): AsyncGenerator<ProtocolEvent> {\n const subscription = await this.#thread.subscribe({\n channels: REMOTE_V3_CHANNELS,\n });\n try {\n for await (const event of subscription) {\n yield event as unknown as ProtocolEvent;\n }\n } finally {\n await subscription.unsubscribe();\n }\n }\n\n async *#iterateLifecycle(): AsyncGenerator<LifecycleEntry> {\n const subscription = await this.#thread.subscribe({\n channels: [\"lifecycle\"],\n });\n try {\n for await (const event of subscription) {\n yield eventToLifecycleEntry(event);\n }\n } finally {\n await subscription.unsubscribe();\n }\n }\n}\n\nfunction eventToLifecycleEntry(event: Event): LifecycleEntry {\n return {\n ...(event.params.data as Record<string, unknown>),\n namespace: event.params.namespace,\n timestamp: event.params.timestamp,\n } as LifecycleEntry;\n}\n"],"mappings":";;;AAYA,MAAM,qBAAgC;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,IAAa,uBAAb,cAGUA,mBAAAA,eAAqC;CAC7C;CAEA;CAEA;CAEA;CAEA,YAAY,QAKT;EACD,MAAM,kBAAkB,OAAO,mBAAmB,IAAI,iBAAiB;AACvE,QACE,EAAE,EACF,IAAIK,YAAAA,WAAW,EACf,GACA,GACA,OAAO,OAAO,YACd,gBACD;AACD,QAAA,SAAe,OAAO;AACtB,QAAA,SAAe,OAAO;AACtB,QAAA,QAAc,OAAO;AACrB,QAAA,kBAAwB;;CAG1B,CAAU,OAAO,iBAA+C;AAC9D,SAAO,MAAA,eAAqB,CAAC,OAAO,gBAAgB;;CAGtD,IAAa,YAA8C;AAEzD,SADkB,MAAA,OAAa;;CAIjC,IAAa,SAAwD;AACnE,SAAO,MAAA,OAAa;;CAGtB,IAAa,WAAiD;AAE5D,SADiB,MAAA,OAAa;;CAIhC,IAAa,YAA2C;AACtD,SAAO,MAAA,kBAAwB;;CAGjC,aAAsB,MAAoD;EACxE,MAAM,WAAW,KAAK;AACtB,SAAO,EACL,QAAQ,OAAO,iBAAiB;AAC9B,cAAW,MAAM,WAAW,SAC1B,KAAI,QAAQ,SAAS,KACnB,OAAM;KAIb;;CAGH,IAAa,SAA2B;AACtC,SAAO,MAAA,OAAa;;CAGtB,IAAa,cAAuB;AAClC,SAAO,MAAA,OAAa;;CAGtB,IAAa,aAA0C;AACrD,SAAO,MAAA,OAAa;;CAGtB,MAAe,QAAwB;AACrC,MAAI,MAAA,gBAAsB,OAAO,QAAS;AAC1C,QAAA,gBAAsB,MAAM,OAAO;AAC9B,QAAA,gBAAsB;;CAG7B,IAAa,SAAsB;AACjC,SAAO,MAAA,gBAAsB;;CAG/B,IAAI,SAAoC;AACtC,SAAO,MAAA;;CAGT,OAAA,iBAAuC;AACrC,MAAI;AACF,OAAI,MAAA,SAAe,KACjB,OAAM,MAAA,OAAa,KAAK,OACtB,MAAA,OAAa,UACb,MAAA,OACA,MACD;UAEG;AAGR,MAAI;AACF,SAAM,MAAA,OAAa,OAAO;UACpB;;CAKV,QAAA,gBAAuD;EACrD,MAAM,eAAe,MAAM,MAAA,OAAa,UAAU,EAChD,UAAU,oBACX,CAAC;AACF,MAAI;AACF,cAAW,MAAM,SAAS,aACxB,OAAM;YAEA;AACR,SAAM,aAAa,aAAa;;;CAIpC,QAAA,mBAA2D;EACzD,MAAM,eAAe,MAAM,MAAA,OAAa,UAAU,EAChD,UAAU,CAAC,YAAY,EACxB,CAAC;AACF,MAAI;AACF,cAAW,MAAM,SAAS,aACxB,OAAM,sBAAsB,MAAM;YAE5B;AACR,SAAM,aAAa,aAAa;;;;AAKtC,SAAS,sBAAsB,OAA8B;AAC3D,QAAO;EACL,GAAI,MAAM,OAAO;EACjB,WAAW,MAAM,OAAO;EACxB,WAAW,MAAM,OAAO;EACzB"}