@cogniformai/instructor-stream
Version:
Streaming-first structured data extraction from LLMs with real-time updates
1 lines • 16 kB
Source Map (JSON)
{"version":3,"sources":["/Users/m1mbp/WebstormProjects/instructor-stream-js/packages/instructor-stream/dist/chunk-X56VWEE2.cjs","../src/adapters/langgraph/fast-adapter.ts","../src/adapters/langgraph/stream.ts","../src/adapters/langgraph/index.ts"],"names":["isRecord","value","toBlocks","isNonEmptyString","extractText","block","fastAdapter","options","defaultNode","onMissingNode","chunk","controller","entries","fallbackNode","missingNode","index","raw","next","entryNode","upcomingNode","node","blocks","text","defaultTypeDefaults","toStreamingError","cause","message","StreamingError","streamLangGraph","spec","resolved","resolveSchema","SchemaResolutionError","validationMode","schemaStream","SchemaStream","buildMeta","adapterOptions","adaptStream","activeNodes","iterator","reader","ended","done","delta","completions","closed","result","SnapshotValidationError","baseStream","Stream","Effect","snapshot","iterableToReadableStream","source","item"],"mappings":"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","file":"/Users/m1mbp/WebstormProjects/instructor-stream-js/packages/instructor-stream/dist/chunk-X56VWEE2.cjs","sourcesContent":[null,"type LangGraphEntry = Record<string, unknown>\n\nexport interface LangGraphDelta {\n node: string\n text: string\n}\n\nexport interface FastAdapterOptions {\n defaultNode?: string\n onMissingNode?: (chunk: unknown) => void\n}\n\nconst isRecord = (value: unknown): value is LangGraphEntry =>\n typeof value === 'object' && value !== null\n\nconst toBlocks = (value: unknown): ReadonlyArray<LangGraphEntry> =>\n Array.isArray(value) ? (value as ReadonlyArray<LangGraphEntry>) : []\n\nconst isNonEmptyString = (value: unknown): value is string =>\n typeof value === 'string' && value.length > 0\n\n/**\n * Extract `{ node, text }` deltas from LangGraph SSE tuples without buffering.\n *\n * LangGraph guarantees FIFO ordering across nodes—tokens for a given node arrive\n * in order, but tokens for different nodes can interleave. The adapter preserves\n * tuple order verbatim so downstream consumers can multiplex by node while\n * maintaining per-node ordering.\n */\nconst extractText = (block: LangGraphEntry): string | undefined => {\n if (!isNonEmptyString(block.type)) return undefined\n if (block.type === 'text' && isNonEmptyString(block.text)) return block.text\n if (block.type === 'tool_call_chunk' && isNonEmptyString(block.args)) return block.args\n return undefined\n}\nexport const fastAdapter = (\n options: FastAdapterOptions = {}\n): TransformStream<unknown, LangGraphDelta> => {\n const { defaultNode = null, onMissingNode } = options\n return new TransformStream<unknown, LangGraphDelta>({\n transform(chunk, controller) {\n if (!isRecord(chunk)) return\n const entries = Array.isArray(chunk.data) ? (chunk.data as unknown[]) : []\n let fallbackNode: string | null = defaultNode\n let missingNode = false\n for (let index = 0; index < entries.length; index++) {\n const raw = entries[index]\n if (!isRecord(raw)) continue\n const next = entries[index + 1]\n const entryNode = isNonEmptyString(raw.langgraph_node) ? raw.langgraph_node : null\n const upcomingNode =\n isRecord(next) && isNonEmptyString(next.langgraph_node) ? next.langgraph_node : null\n if (entryNode) {\n fallbackNode = entryNode\n } else if (upcomingNode) {\n fallbackNode = upcomingNode\n }\n const node = entryNode ?? fallbackNode\n const blocks = toBlocks(raw.content)\n if (!blocks.length) continue\n if (!node) {\n missingNode = true\n continue\n }\n for (const block of blocks) {\n const text = extractText(block)\n if (!text) continue\n controller.enqueue({ node, text })\n }\n }\n if (missingNode && onMissingNode) {\n onMissingNode(chunk)\n }\n },\n })\n}\n","import { fastAdapter, type LangGraphDelta } from './fast-adapter.ts'\nimport { SchemaStream } from '@/utils/streaming-json-parser.ts'\nimport { resolveSchema, type SchemaSource } from '@/effect/schema.ts'\nimport {\n SchemaResolutionError,\n SnapshotValidationError,\n StreamingError,\n type StreamingPipelineError,\n} from '@/effect/errors.ts'\nimport type { CompletionMeta } from '@/effect'\nimport type { SnapshotChunk } from '@/effect/core/snapshots.ts'\nimport { Stream, Effect } from 'effect'\n\ntype LangGraphValidationMode = 'none' | 'final'\n\nexport type StreamLangGraphSpec<A> = {\n upstream: ReadableStream<unknown>\n schema: SchemaSource<A>\n validation?: LangGraphValidationMode\n onSnapshot?: (snapshot: Partial<A>, meta: CompletionMeta) => void | Promise<void>\n defaultNode?: string\n onMissingNode?: (chunk: unknown) => void\n}\n\nconst defaultTypeDefaults = {\n string: null,\n number: null,\n boolean: null,\n} as const\n\nconst toStreamingError = (cause: unknown, message: string): StreamingError =>\n cause instanceof StreamingError ? cause : new StreamingError({ message, cause })\n\nexport const streamLangGraph = <A>(spec: StreamLangGraphSpec<A>) => {\n const resolved = resolveSchema(spec.schema)\n if (!resolved.zod) {\n throw new SchemaResolutionError({\n message: `Schema '${resolved.name}' must provide a Zod schema for LangGraph streaming`,\n })\n }\n\n const validationMode: LangGraphValidationMode = spec.validation ?? 'none'\n const schemaStream = new SchemaStream(resolved.zod, {\n snapshotMode: 'object',\n autoJSONMode: 'off',\n typeDefaults: { ...defaultTypeDefaults },\n })\n\n const buildMeta = (node: string): CompletionMeta => ({\n _activePath: schemaStream.getActivePath(),\n _completedPaths: schemaStream.getCompletedPaths(),\n _isValid: validationMode === 'none',\n _type: node,\n })\n\n const adapterOptions: Parameters<typeof fastAdapter>[0] = {}\n if (spec.defaultNode !== undefined) {\n adapterOptions.defaultNode = spec.defaultNode\n }\n if (spec.onMissingNode !== undefined) {\n adapterOptions.onMissingNode = spec.onMissingNode\n }\n const adaptStream = spec.upstream.pipeThrough(fastAdapter(adapterOptions))\n const activeNodes = new Set<string>()\n\n const iterator = (async function* (): AsyncGenerator<SnapshotChunk<A>, void, unknown> {\n const reader = adaptStream.getReader()\n let ended = false\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) {\n ended = true\n break\n }\n if (!value) continue\n const delta = value as LangGraphDelta\n const { completions, closed } = schemaStream.ingest([delta.node], delta.text)\n if (completions.length === 0) {\n if (closed) {\n schemaStream.releaseContext([delta.node])\n activeNodes.delete(delta.node)\n }\n continue\n }\n activeNodes.add(delta.node)\n yield {\n data: [schemaStream.current() as Partial<A>],\n _meta: buildMeta(delta.node),\n }\n if (closed) {\n schemaStream.releaseContext([delta.node])\n activeNodes.delete(delta.node)\n }\n }\n\n if (validationMode === 'final') {\n const result = await resolved.zod?.safeParseAsync(schemaStream.current())\n if (!result?.success) {\n throw new SnapshotValidationError({\n reason: `Final validation failed for schema '${resolved.name}'`,\n issues: result?.error?.issues,\n })\n }\n }\n } finally {\n if (!ended) {\n try {\n await reader.cancel()\n } catch {\n // ignore cancellation errors\n }\n }\n try {\n reader.releaseLock()\n } catch {\n // ignore release failures\n }\n for (const node of activeNodes) {\n schemaStream.releaseContext([node])\n }\n }\n })()\n\n const baseStream = Stream.fromAsyncIterable<SnapshotChunk<A>, StreamingPipelineError>(\n iterator,\n (cause) => {\n if (\n cause instanceof SnapshotValidationError ||\n cause instanceof StreamingError ||\n cause instanceof SchemaResolutionError\n ) {\n return cause\n }\n return toStreamingError(cause, 'LangGraph stream failed')\n }\n )\n\n if (!spec.onSnapshot) {\n return baseStream\n }\n\n return Stream.mapEffect(baseStream, (chunk) =>\n Effect.tryPromise({\n try: async () => {\n const snapshot = chunk.data[0]\n await spec.onSnapshot?.(snapshot ?? {}, chunk._meta)\n return chunk\n },\n catch: (cause) => toStreamingError(cause, 'LangGraph onSnapshot handler failed'),\n })\n )\n}\n","import { fastAdapter, type FastAdapterOptions, type LangGraphDelta } from './fast-adapter.ts'\nimport { streamLangGraph, type StreamLangGraphSpec } from './stream.ts'\n\n/**\n * Convert an (async) iterable of envelope objects into a WHATWG ReadableStream.\n * LangGraph runtimes commonly expose async generators; this helper makes them\n * compatible with `streamLangGraph`.\n */\nexport function iterableToReadableStream<T>(\n source: AsyncIterable<T> | Iterable<T>\n): ReadableStream<T> {\n const iterator =\n Symbol.asyncIterator in source ?\n (source as AsyncIterable<T>)[Symbol.asyncIterator]()\n : (async function* () {\n for (const item of source as Iterable<T>) {\n yield item\n }\n })()\n\n return new ReadableStream<T>({\n async pull(controller) {\n const { value, done } = await iterator.next()\n if (done) {\n controller.close()\n } else {\n controller.enqueue(value as T)\n }\n },\n async cancel() {\n if (typeof iterator.return === 'function') {\n await iterator.return()\n }\n },\n })\n}\n\nexport { fastAdapter, streamLangGraph }\nexport type { FastAdapterOptions, LangGraphDelta, StreamLangGraphSpec }\n"]}