@langchain/langgraph-sdk
Version:
Client library for interacting with the LangGraph API
1 lines • 24.6 kB
Source Map (JSON)
{"version":3,"file":"subgraphs.cjs","names":["#session","#messagesIterable","MultiCursorBuffer","StreamingMessageAssembler","#startProjection","#valuesProjection","#outputPromise","#toolCallsIterable","ToolCallAssembler","toClientAssembledToolCall","#subgraphsIterable","#subagentsIterable","#ensureMediaDispatcher","#audioBuffer","#imagesBuffer","#videoBuffer","#filesBuffer","#mediaDispatcherStarted","MediaAssembler","#source","#parentNamespace","#discovered","#pendingToolStarts","#pendingToolCallHandles","#queue","#waiters","#processToolEvent","#sourcePump","#processEvent","#emit","#closed","#start"],"sources":["../../../../src/client/stream/handles/subgraphs.ts"],"sourcesContent":["import type {\n Channel,\n Event,\n LifecycleCause,\n LifecycleEvent,\n MessagesEvent,\n SubscribeParams,\n ToolsEvent,\n ValuesEvent,\n} from \"@langchain/protocol\";\nimport type { SubscriptionHandle } from \"../index.js\";\nimport { MultiCursorBuffer } from \"../multi-cursor-buffer.js\";\nimport { StreamingMessageAssembler } from \"../messages.js\";\nimport type { StreamingMessage, StreamingMessageHandle } from \"../messages.js\";\nimport { ToolCallAssembler, toClientAssembledToolCall } from \"./tools.js\";\nimport type { ClientAssembledToolCall } from \"./tools.js\";\nimport { MediaAssembler } from \"../media.js\";\nimport type {\n AudioMedia,\n FileMedia,\n ImageMedia,\n VideoMedia,\n} from \"../media.js\";\nimport type {\n EventForChannel,\n EventForChannels,\n SubscribeOptions,\n YieldForChannel,\n YieldForChannels,\n} from \"../types.js\";\nimport type { SubagentHandle } from \"./subagents.js\";\n\nconst TERMINAL_LIFECYCLE_EVENTS = new Set([\n \"completed\",\n \"failed\",\n \"interrupted\",\n]);\n\n/** Whether `event` is a terminal lifecycle event for exactly `namespace`. */\nexport function isTerminalLifecycleAt(\n event: Event,\n namespace: readonly string[]\n): boolean {\n if (event.method !== \"lifecycle\") return false;\n const eventNamespace = event.params.namespace;\n if (eventNamespace.length !== namespace.length) return false;\n if (!namespace.every((segment, i) => eventNamespace[i] === segment)) {\n return false;\n }\n const data = event.params.data as { event?: string } | undefined;\n return data?.event != null && TERMINAL_LIFECYCLE_EVENTS.has(data.event);\n}\n\n/**\n * Minimal subscription surface that {@link SubgraphHandle} and\n * {@link SubagentHandle} delegate to. Typed to match the\n * `Session.subscribe` raw-channel overloads without importing the\n * full `Session` class (avoids circular dependency).\n */\nexport interface Subscribable {\n subscribe<TChannel extends Channel>(\n channel: TChannel,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannel<TChannel>, YieldForChannel<TChannel>>\n >;\n subscribe<const TChannels extends readonly Channel[]>(\n channels: TChannels,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannels<TChannels>, YieldForChannels<TChannels>>\n >;\n subscribe(params: SubscribeParams): Promise<SubscriptionHandle<Event>>;\n}\n\n/**\n * Discovered subgraph within a streaming session.\n *\n * Mirrors the in-process `SubgraphRunStream` pattern: each subgraph\n * has `name`, `index`, `namespace`, and lazy getters for projections\n * scoped to this subgraph's namespace.\n *\n * ```ts\n * for await (const sub of session.subgraphs) {\n * for await (const msg of sub.messages) { ... }\n * const state = await sub.output;\n * }\n * ```\n */\nexport class SubgraphHandle {\n readonly name: string;\n readonly index: number;\n readonly namespace: string[];\n /**\n * Non-empty when upstream attached a `cause` to this subgraph's\n * `lifecycle.started` event. Population is product-specific and\n * performed by stream transformers on the runtime side (e.g.\n * deepagents' `SubagentTransformer` emits\n * `{ type: \"toolCall\", tool_call_id }`). Generic clients should\n * treat `cause.type` as an open enum — the protocol allows future\n * variants (`send`, `edge`, ...) to be forwarded verbatim without\n * a SDK bump.\n */\n readonly cause?: LifecycleCause;\n readonly graphName?: string;\n /**\n * Raw `tool-started` event that triggered this subgraph, when\n * `cause.type === \"toolCall\"` and the matching event has been\n * observed on the `tools` channel.\n */\n toolStartedEvent?: ToolsEvent;\n readonly #session: Subscribable;\n\n #messagesIterable?: AsyncIterable<StreamingMessage>;\n #valuesProjection?: AsyncIterable<unknown> & PromiseLike<unknown>;\n #toolCallsIterable?: AsyncIterable<ClientAssembledToolCall>;\n #subgraphsIterable?: AsyncIterable<SubgraphHandle>;\n #subagentsIterable?: AsyncIterable<SubagentHandle>;\n #outputPromise?: Promise<unknown>;\n\n #mediaDispatcherStarted = false;\n #audioBuffer?: MultiCursorBuffer<AudioMedia>;\n #imagesBuffer?: MultiCursorBuffer<ImageMedia>;\n #videoBuffer?: MultiCursorBuffer<VideoMedia>;\n #filesBuffer?: MultiCursorBuffer<FileMedia>;\n\n constructor(\n name: string,\n index: number,\n namespace: string[],\n session: Subscribable,\n options?: {\n cause?: LifecycleCause;\n graphName?: string;\n toolStartedEvent?: ToolsEvent;\n }\n ) {\n this.name = name;\n this.index = index;\n this.namespace = namespace;\n this.cause = options?.cause;\n this.graphName = options?.graphName;\n this.toolStartedEvent = options?.toolStartedEvent;\n this.#session = session;\n }\n\n get messages(): AsyncIterable<StreamingMessageHandle> {\n if (this.#messagesIterable) return this.#messagesIterable;\n const buffer = new MultiCursorBuffer<StreamingMessage>();\n this.#messagesIterable = buffer;\n const assembler = new StreamingMessageAssembler();\n void this.#startProjection(\n [\"messages\", \"lifecycle\"],\n (event) => {\n if (isTerminalLifecycleAt(event, this.namespace)) {\n assembler.abandonActive(this.namespace);\n return;\n }\n if (event.method !== \"messages\") return;\n const msg = assembler.consume(event as MessagesEvent);\n if (msg) buffer.push(msg);\n },\n () => {\n assembler.abandonActive();\n buffer.close();\n }\n );\n return buffer;\n }\n\n get values(): AsyncIterable<unknown> & PromiseLike<unknown> {\n if (this.#valuesProjection) return this.#valuesProjection;\n const buffer = new MultiCursorBuffer<unknown>();\n let lastValue: unknown;\n let resolveOutput!: (value: unknown) => void;\n const outputPromise = new Promise<unknown>((resolve) => {\n resolveOutput = resolve;\n });\n this.#outputPromise = outputPromise;\n const projection = Object.assign(buffer, {\n then: <TResult1 = unknown, TResult2 = never>(\n onfulfilled?:\n | ((value: unknown) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?:\n | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n | null\n ): Promise<TResult1 | TResult2> =>\n outputPromise.then(onfulfilled, onrejected),\n }) as AsyncIterable<unknown> & PromiseLike<unknown>;\n this.#valuesProjection = projection;\n void this.#startProjection(\n [\"values\"],\n (event) => {\n if (event.method !== \"values\") return;\n const data = (event as ValuesEvent).params.data;\n lastValue = data;\n buffer.push(data);\n },\n () => {\n resolveOutput(lastValue);\n buffer.close();\n }\n );\n return projection;\n }\n\n get toolCalls(): AsyncIterable<ClientAssembledToolCall> {\n if (this.#toolCallsIterable) return this.#toolCallsIterable;\n const buffer = new MultiCursorBuffer<ClientAssembledToolCall>();\n this.#toolCallsIterable = buffer;\n const assembler = new ToolCallAssembler();\n void this.#startProjection(\n [\"tools\"],\n (event) => {\n if (event.method !== \"tools\") return;\n const tc = assembler.consume(event as ToolsEvent);\n if (tc) buffer.push(toClientAssembledToolCall(tc));\n },\n () => buffer.close()\n );\n return buffer;\n }\n\n get subgraphs(): AsyncIterable<SubgraphHandle> {\n if (this.#subgraphsIterable) return this.#subgraphsIterable;\n const buffer = new MultiCursorBuffer<SubgraphHandle>();\n this.#subgraphsIterable = buffer;\n void (async () => {\n const rawHandle = await this.#session.subscribe({\n channels: [\"lifecycle\", \"tools\"],\n namespaces: [this.namespace],\n });\n const discovery = new SubgraphDiscoveryHandle(\n rawHandle,\n this.#session,\n this.namespace\n );\n for await (const sub of discovery) {\n buffer.push(sub);\n }\n buffer.close();\n })();\n return buffer;\n }\n\n get subagents(): AsyncIterable<SubagentHandle> {\n if (this.#subagentsIterable) return this.#subagentsIterable;\n const buffer = new MultiCursorBuffer<SubagentHandle>();\n this.#subagentsIterable = buffer;\n void (async () => {\n const rawHandle = await this.#session.subscribe({\n channels: [\"tools\", \"lifecycle\"],\n namespaces: [this.namespace],\n });\n const { SubagentDiscoveryHandle: Discovery } =\n await import(\"./subagents.js\");\n const discovery = new Discovery(rawHandle, this.#session);\n for await (const sub of discovery) {\n buffer.push(sub);\n }\n buffer.close();\n })();\n return buffer;\n }\n\n get audio(): AsyncIterable<AudioMedia> {\n this.#ensureMediaDispatcher();\n return this.#audioBuffer!;\n }\n\n get images(): AsyncIterable<ImageMedia> {\n this.#ensureMediaDispatcher();\n return this.#imagesBuffer!;\n }\n\n get video(): AsyncIterable<VideoMedia> {\n this.#ensureMediaDispatcher();\n return this.#videoBuffer!;\n }\n\n get files(): AsyncIterable<FileMedia> {\n this.#ensureMediaDispatcher();\n return this.#filesBuffer!;\n }\n\n get output(): Promise<unknown> {\n void this.values;\n return this.#outputPromise!;\n }\n\n #ensureMediaDispatcher(): void {\n if (this.#mediaDispatcherStarted) return;\n this.#mediaDispatcherStarted = true;\n const audio = new MultiCursorBuffer<AudioMedia>();\n const images = new MultiCursorBuffer<ImageMedia>();\n const video = new MultiCursorBuffer<VideoMedia>();\n const files = new MultiCursorBuffer<FileMedia>();\n this.#audioBuffer = audio;\n this.#imagesBuffer = images;\n this.#videoBuffer = video;\n this.#filesBuffer = files;\n const assembler = new MediaAssembler({\n onAudio: (m: AudioMedia) => audio.push(m),\n onImage: (m: ImageMedia) => images.push(m),\n onVideo: (m: VideoMedia) => video.push(m),\n onFile: (m: FileMedia) => files.push(m),\n });\n void this.#startProjection(\n [\"messages\"],\n (event) => {\n if (event.method !== \"messages\") return;\n assembler.consume(event as MessagesEvent);\n },\n () => {\n assembler.close();\n audio.close();\n images.close();\n video.close();\n files.close();\n }\n );\n }\n\n /**\n * Create a raw channel subscription scoped to this subgraph's namespace.\n */\n subscribe<TChannel extends Channel>(\n channel: TChannel,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannel<TChannel>, YieldForChannel<TChannel>>\n >;\n subscribe<const TChannels extends readonly Channel[]>(\n channels: TChannels,\n options?: SubscribeOptions\n ): Promise<\n SubscriptionHandle<EventForChannels<TChannels>, YieldForChannels<TChannels>>\n >;\n subscribe(params: SubscribeParams): Promise<SubscriptionHandle<Event>>;\n subscribe(\n paramsOrChannels: SubscribeParams | Channel | string | readonly Channel[],\n options: SubscribeOptions = {}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n if (\n typeof paramsOrChannels === \"object\" &&\n !Array.isArray(paramsOrChannels) &&\n \"channels\" in paramsOrChannels\n ) {\n return this.#session.subscribe({\n ...paramsOrChannels,\n namespaces: paramsOrChannels.namespaces ?? [this.namespace],\n });\n }\n\n return this.#session.subscribe(paramsOrChannels as Channel, {\n ...options,\n namespaces: options.namespaces ?? [this.namespace],\n });\n }\n\n async #startProjection(\n channels: Channel[],\n onEvent: (event: Event) => void,\n onDone: () => void\n ): Promise<void> {\n try {\n const rawHandle = await this.#session.subscribe({\n channels,\n namespaces: [this.namespace],\n });\n for await (const event of rawHandle) {\n onEvent(event);\n }\n } finally {\n onDone();\n }\n }\n}\n\n/**\n * Async iterable that yields {@link SubgraphHandle} instances as new\n * subgraph namespaces are discovered from `lifecycle` events.\n *\n * Mirrors the in-process `run.subgraphs` pattern. A new subgraph is\n * discovered when a `lifecycle` event with `event: \"started\"` is\n * received at a namespace depth of exactly `parentDepth + 1`.\n */\nexport class SubgraphDiscoveryHandle implements AsyncIterable<SubgraphHandle> {\n readonly #source: SubscriptionHandle<Event>;\n readonly #session: Subscribable;\n readonly #parentNamespace: string[];\n readonly #discovered = new Set<string>();\n readonly #pendingToolStarts = new Map<string, ToolsEvent>();\n readonly #pendingToolCallHandles = new Map<string, SubgraphHandle>();\n readonly #queue: SubgraphHandle[] = [];\n readonly #waiters: Array<(value: IteratorResult<SubgraphHandle>) => void> =\n [];\n #sourcePump?: Promise<void>;\n #closed = false;\n\n constructor(\n source: SubscriptionHandle<Event>,\n session: Subscribable,\n parentNamespace: string[] = []\n ) {\n this.#source = source;\n this.#session = session;\n this.#parentNamespace = parentNamespace;\n }\n\n #emit(handle: SubgraphHandle): void {\n const waiter = this.#waiters.shift();\n if (waiter) {\n waiter({ done: false, value: handle });\n } else {\n this.#queue.push(handle);\n }\n }\n\n #processToolEvent(event: Event): boolean {\n if (event.method !== \"tools\") return false;\n const tools = event as ToolsEvent;\n const data = tools.params.data as Record<string, unknown>;\n if (data.event !== \"tool-started\") return true;\n\n const toolCallId = data.tool_call_id as string | undefined;\n if (!toolCallId) return true;\n\n const pendingHandle = this.#pendingToolCallHandles.get(toolCallId);\n if (pendingHandle) {\n pendingHandle.toolStartedEvent = tools;\n this.#pendingToolCallHandles.delete(toolCallId);\n return true;\n }\n\n this.#pendingToolStarts.set(toolCallId, tools);\n return true;\n }\n\n #processEvent(event: Event): SubgraphHandle | undefined {\n if (this.#processToolEvent(event)) return undefined;\n if (event.method !== \"lifecycle\") return undefined;\n const lifecycle = event as LifecycleEvent;\n if (lifecycle.params.data.event !== \"started\") return undefined;\n\n const ns = event.params.namespace;\n if (ns.length !== this.#parentNamespace.length + 1) return undefined;\n\n const isChild = this.#parentNamespace.every((seg, i) => ns[i] === seg);\n if (!isChild) return undefined;\n\n const nsKey = ns.join(\"/\");\n if (this.#discovered.has(nsKey)) return undefined;\n this.#discovered.add(nsKey);\n\n const lastSegment = ns[ns.length - 1] ?? \"\";\n const colonIdx = lastSegment.lastIndexOf(\":\");\n let name: string;\n let index: number;\n if (colonIdx >= 0) {\n name = lastSegment.slice(0, colonIdx);\n const suffix = lastSegment.slice(colonIdx + 1);\n index = /^\\d+$/.test(suffix) ? Number(suffix) : 0;\n } else {\n name = lastSegment;\n index = 0;\n }\n\n const data = lifecycle.params.data as unknown as Record<string, unknown>;\n const cause =\n data.cause && typeof data.cause === \"object\"\n ? (data.cause as LifecycleCause)\n : undefined;\n let toolStartedEvent: ToolsEvent | undefined;\n if (cause?.type === \"toolCall\") {\n const toolCallId = (cause as { tool_call_id?: string }).tool_call_id;\n if (toolCallId) {\n toolStartedEvent = this.#pendingToolStarts.get(toolCallId);\n this.#pendingToolStarts.delete(toolCallId);\n }\n }\n\n const handle = new SubgraphHandle(name, index, [...ns], this.#session, {\n cause,\n graphName: data.graph_name as string | undefined,\n toolStartedEvent,\n });\n if (cause?.type === \"toolCall\" && toolStartedEvent == null) {\n const toolCallId = (cause as { tool_call_id?: string }).tool_call_id;\n if (toolCallId) this.#pendingToolCallHandles.set(toolCallId, handle);\n }\n return handle;\n }\n\n #start(): void {\n if (this.#sourcePump) return;\n this.#sourcePump = (async () => {\n for await (const event of this.#source) {\n const handle = this.#processEvent(event);\n if (!handle) continue;\n this.#emit(handle);\n }\n this.#pendingToolStarts.clear();\n this.#pendingToolCallHandles.clear();\n this.#closed = true;\n while (this.#waiters.length > 0) {\n this.#waiters.shift()?.({ done: true, value: undefined });\n }\n })();\n }\n\n async close(): Promise<void> {\n this.#closed = true;\n await this.#source.unsubscribe();\n }\n\n [Symbol.asyncIterator](): AsyncIterator<SubgraphHandle> {\n this.#start();\n return {\n next: async () => {\n if (this.#queue.length > 0) {\n return { done: false, value: this.#queue.shift()! };\n }\n if (this.#closed) {\n return { done: true, value: undefined };\n }\n return await new Promise<IteratorResult<SubgraphHandle>>((resolve) => {\n this.#waiters.push(resolve);\n });\n },\n return: async () => {\n await this.close();\n return { done: true, value: undefined };\n },\n };\n }\n}\n"],"mappings":"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"}