@langchain/core
Version:
Core LangChain.js abstractions and schemas
1 lines • 29.3 kB
Source Map (JSON)
{"version":3,"file":"event_stream.cjs","names":["BaseTracer","IterableReadableStream","GenerationChunk","AIMessageChunk"],"sources":["../../src/tracers/event_stream.ts"],"sourcesContent":["import { BaseTracer, type Run } from \"./base.js\";\nimport {\n BaseCallbackHandler,\n BaseCallbackHandlerInput,\n CallbackHandlerPrefersStreaming,\n} from \"../callbacks/base.js\";\nimport { IterableReadableStream } from \"../utils/stream.js\";\nimport { AIMessageChunk } from \"../messages/ai.js\";\nimport { ChatGeneration, Generation, GenerationChunk } from \"../outputs.js\";\nimport { BaseMessage } from \"../messages/base.js\";\n\n/**\n * Data associated with a StreamEvent.\n */\nexport type StreamEventData = {\n /**\n * The input passed to the runnable that generated the event.\n * Inputs will sometimes be available at the *START* of the runnable, and\n * sometimes at the *END* of the runnable.\n * If a runnable is able to stream its inputs, then its input by definition\n * won't be known until the *END* of the runnable when it has finished streaming\n * its inputs.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n input?: any;\n\n /**\n * The output of the runnable that generated the event.\n * Outputs will only be available at the *END* of the runnable.\n * For most runnables, this field can be inferred from the `chunk` field,\n * though there might be some exceptions for special cased runnables (e.g., like\n * chat models), which may return more information.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n output?: any;\n\n /**\n * A streaming chunk from the output that generated the event.\n * chunks support addition in general, and adding them up should result\n * in the output of the runnable that generated the event.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n chunk?: any;\n\n /**\n * Error message if the runnable that generated the event failed.\n * This field will only be present if the runnable failed.\n */\n error?: string;\n};\n\n/**\n * A streaming event.\n *\n * Schema of a streaming event which is produced from the streamEvents method.\n */\nexport type StreamEvent = {\n /**\n * Event names are of the format: on_[runnable_type]_(start|stream|end).\n *\n * Runnable types are one of:\n * - llm - used by non chat models\n * - chat_model - used by chat models\n * - prompt -- e.g., ChatPromptTemplate\n * - tool -- LangChain tools\n * - chain - most Runnables are of this type\n *\n * Further, the events are categorized as one of:\n * - start - when the runnable starts\n * - stream - when the runnable is streaming\n * - end - when the runnable ends\n *\n * start, stream and end are associated with slightly different `data` payload.\n *\n * Please see the documentation for `EventData` for more details.\n */\n event: string;\n /** The name of the runnable that generated the event. */\n name: string;\n /**\n * An randomly generated ID to keep track of the execution of the given runnable.\n *\n * Each child runnable that gets invoked as part of the execution of a parent runnable\n * is assigned its own unique ID.\n */\n run_id: string;\n /**\n * Tags associated with the runnable that generated this event.\n * Tags are always inherited from parent runnables.\n */\n tags?: string[];\n /** Metadata associated with the runnable that generated this event. */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n metadata: Record<string, any>;\n /**\n * Event data.\n *\n * The contents of the event data depend on the event type.\n */\n data: StreamEventData;\n};\n\ntype RunInfo = {\n name: string;\n tags: string[];\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n metadata: Record<string, any>;\n runType: string;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n inputs?: Record<string, any>;\n};\n\nexport interface EventStreamCallbackHandlerInput extends BaseCallbackHandlerInput {\n autoClose?: boolean;\n includeNames?: string[];\n includeTypes?: string[];\n includeTags?: string[];\n excludeNames?: string[];\n excludeTypes?: string[];\n excludeTags?: string[];\n}\n\nfunction assignName({\n name,\n serialized,\n}: {\n name?: string;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n serialized?: Record<string, any>;\n}): string {\n if (name !== undefined) {\n return name;\n }\n if (serialized?.name !== undefined) {\n return serialized.name;\n } else if (serialized?.id !== undefined && Array.isArray(serialized?.id)) {\n return serialized.id[serialized.id.length - 1];\n }\n return \"Unnamed\";\n}\n\nexport const isStreamEventsHandler = (\n handler: BaseCallbackHandler\n): handler is EventStreamCallbackHandler =>\n handler.name === \"event_stream_tracer\";\n\n/**\n * Class that extends the `BaseTracer` class from the\n * `langchain.callbacks.tracers.base` module. It represents a callback\n * handler that logs the execution of runs and emits `RunLog` instances to a\n * `RunLogStream`.\n */\nexport class EventStreamCallbackHandler\n extends BaseTracer\n implements CallbackHandlerPrefersStreaming\n{\n protected autoClose = true;\n\n protected includeNames?: string[];\n\n protected includeTypes?: string[];\n\n protected includeTags?: string[];\n\n protected excludeNames?: string[];\n\n protected excludeTypes?: string[];\n\n protected excludeTags?: string[];\n\n private runInfoMap: Map<string, RunInfo> = new Map();\n\n private tappedPromises: Map<string, Promise<void>> = new Map();\n\n protected transformStream: TransformStream;\n\n public writer: WritableStreamDefaultWriter;\n\n public receiveStream: IterableReadableStream<StreamEvent>;\n\n private readableStreamClosed = false;\n\n name = \"event_stream_tracer\";\n\n lc_prefer_streaming = true;\n\n constructor(fields?: EventStreamCallbackHandlerInput) {\n super({ _awaitHandler: true, ...fields });\n this.autoClose = fields?.autoClose ?? true;\n this.includeNames = fields?.includeNames;\n this.includeTypes = fields?.includeTypes;\n this.includeTags = fields?.includeTags;\n this.excludeNames = fields?.excludeNames;\n this.excludeTypes = fields?.excludeTypes;\n this.excludeTags = fields?.excludeTags;\n this.transformStream = new TransformStream({\n flush: () => {\n this.readableStreamClosed = true;\n },\n });\n this.writer = this.transformStream.writable.getWriter();\n this.receiveStream = IterableReadableStream.fromReadableStream(\n this.transformStream.readable\n );\n }\n\n [Symbol.asyncIterator]() {\n return this.receiveStream;\n }\n\n protected async persistRun(_run: Run): Promise<void> {\n // This is a legacy method only called once for an entire run tree\n // and is therefore not useful here\n }\n\n _includeRun(run: RunInfo): boolean {\n const runTags = run.tags ?? [];\n let include =\n this.includeNames === undefined &&\n this.includeTags === undefined &&\n this.includeTypes === undefined;\n if (this.includeNames !== undefined) {\n include = include || this.includeNames.includes(run.name);\n }\n if (this.includeTypes !== undefined) {\n include = include || this.includeTypes.includes(run.runType);\n }\n if (this.includeTags !== undefined) {\n include =\n include ||\n runTags.find((tag) => this.includeTags?.includes(tag)) !== undefined;\n }\n if (this.excludeNames !== undefined) {\n include = include && !this.excludeNames.includes(run.name);\n }\n if (this.excludeTypes !== undefined) {\n include = include && !this.excludeTypes.includes(run.runType);\n }\n if (this.excludeTags !== undefined) {\n include =\n include && runTags.every((tag) => !this.excludeTags?.includes(tag));\n }\n return include;\n }\n\n async *tapOutputIterable<T>(\n runId: string,\n outputStream: AsyncGenerator<T>\n ): AsyncGenerator<T> {\n const firstChunk = await outputStream.next();\n if (firstChunk.done) {\n return;\n }\n const runInfo = this.runInfoMap.get(runId);\n // Run has finished, don't issue any stream events.\n // An example of this is for runnables that use the default\n // implementation of .stream(), which delegates to .invoke()\n // and calls .onChainEnd() before passing it to the iterator.\n if (runInfo === undefined) {\n yield firstChunk.value;\n return;\n }\n // Match format from handlers below\n function _formatOutputChunk(eventType: string, data: unknown) {\n if (eventType === \"llm\" && typeof data === \"string\") {\n return new GenerationChunk({ text: data });\n }\n return data;\n }\n let tappedPromise = this.tappedPromises.get(runId);\n // if we are the first to tap, issue stream events\n if (tappedPromise === undefined) {\n let tappedPromiseResolver: (() => void) | undefined;\n tappedPromise = new Promise((resolve) => {\n tappedPromiseResolver = resolve;\n });\n this.tappedPromises.set(runId, tappedPromise);\n try {\n const event: StreamEvent = {\n event: `on_${runInfo.runType}_stream`,\n run_id: runId,\n name: runInfo.name,\n tags: runInfo.tags,\n metadata: runInfo.metadata,\n data: {},\n };\n await this.send(\n {\n ...event,\n data: {\n chunk: _formatOutputChunk(runInfo.runType, firstChunk.value),\n },\n },\n runInfo\n );\n yield firstChunk.value;\n for await (const chunk of outputStream) {\n // Don't yield tool and retriever stream events\n if (runInfo.runType !== \"tool\" && runInfo.runType !== \"retriever\") {\n await this.send(\n {\n ...event,\n data: {\n chunk: _formatOutputChunk(runInfo.runType, chunk),\n },\n },\n runInfo\n );\n }\n yield chunk;\n }\n } finally {\n tappedPromiseResolver?.();\n // Don't delete from the promises map to keep track of which runs have been tapped.\n }\n } else {\n // otherwise just pass through\n yield firstChunk.value;\n for await (const chunk of outputStream) {\n yield chunk;\n }\n }\n }\n\n async send(payload: StreamEvent, run: RunInfo) {\n if (this.readableStreamClosed) return;\n if (this._includeRun(run)) {\n await this.writer.write(payload);\n }\n }\n\n async sendEndEvent(payload: StreamEvent, run: RunInfo) {\n const tappedPromise = this.tappedPromises.get(payload.run_id);\n if (tappedPromise !== undefined) {\n // oxlint-disable-next-line no-void\n void tappedPromise.then(() => {\n // oxlint-disable-next-line no-void\n void this.send(payload, run);\n });\n } else {\n await this.send(payload, run);\n }\n }\n\n async onLLMStart(run: Run): Promise<void> {\n const runName = assignName(run);\n const runType = run.inputs.messages !== undefined ? \"chat_model\" : \"llm\";\n const runInfo = {\n tags: run.tags ?? [],\n metadata: run.extra?.metadata ?? {},\n name: runName,\n runType,\n inputs: run.inputs,\n };\n this.runInfoMap.set(run.id, runInfo);\n const eventName = `on_${runType}_start`;\n await this.send(\n {\n event: eventName,\n data: {\n input: run.inputs,\n },\n name: runName,\n tags: run.tags ?? [],\n run_id: run.id,\n metadata: run.extra?.metadata ?? {},\n },\n runInfo\n );\n }\n\n async onLLMNewToken(\n run: Run,\n token: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n kwargs?: { chunk: any }\n ): Promise<void> {\n const runInfo = this.runInfoMap.get(run.id);\n let chunk;\n let eventName;\n if (runInfo === undefined) {\n throw new Error(`onLLMNewToken: Run ID ${run.id} not found in run map.`);\n }\n // Top-level streaming events are covered by tapOutputIterable\n if (this.runInfoMap.size === 1) {\n return;\n }\n if (runInfo.runType === \"chat_model\") {\n eventName = \"on_chat_model_stream\";\n if (kwargs?.chunk === undefined) {\n chunk = new AIMessageChunk({ content: token, id: `run-${run.id}` });\n } else {\n chunk = kwargs.chunk.message;\n }\n } else if (runInfo.runType === \"llm\") {\n eventName = \"on_llm_stream\";\n if (kwargs?.chunk === undefined) {\n chunk = new GenerationChunk({ text: token });\n } else {\n chunk = kwargs.chunk;\n }\n } else {\n throw new Error(`Unexpected run type ${runInfo.runType}`);\n }\n await this.send(\n {\n event: eventName,\n data: {\n chunk,\n },\n run_id: run.id,\n name: runInfo.name,\n tags: runInfo.tags,\n metadata: runInfo.metadata,\n },\n runInfo\n );\n }\n\n async onLLMEnd(run: Run): Promise<void> {\n const runInfo = this.runInfoMap.get(run.id);\n this.runInfoMap.delete(run.id);\n let eventName: string;\n if (runInfo === undefined) {\n throw new Error(`onLLMEnd: Run ID ${run.id} not found in run map.`);\n }\n const generations: ChatGeneration[][] | Generation[][] | undefined =\n run.outputs?.generations;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n let output: BaseMessage | Record<string, any> | undefined;\n if (runInfo.runType === \"chat_model\") {\n for (const generation of generations ?? []) {\n if (output !== undefined) {\n break;\n }\n output = (generation[0] as ChatGeneration | undefined)?.message;\n }\n eventName = \"on_chat_model_end\";\n } else if (runInfo.runType === \"llm\") {\n output = {\n generations: generations?.map((generation) => {\n return generation.map((chunk) => {\n return {\n text: chunk.text,\n generationInfo: chunk.generationInfo,\n };\n });\n }),\n llmOutput: run.outputs?.llmOutput ?? {},\n };\n eventName = \"on_llm_end\";\n } else {\n throw new Error(`onLLMEnd: Unexpected run type: ${runInfo.runType}`);\n }\n await this.sendEndEvent(\n {\n event: eventName,\n data: {\n output,\n input: runInfo.inputs,\n },\n run_id: run.id,\n name: runInfo.name,\n tags: runInfo.tags,\n metadata: runInfo.metadata,\n },\n runInfo\n );\n }\n\n async onChainStart(run: Run): Promise<void> {\n const runName = assignName(run);\n const runType = run.run_type ?? \"chain\";\n const runInfo: RunInfo = {\n tags: run.tags ?? [],\n metadata: run.extra?.metadata ?? {},\n name: runName,\n runType: run.run_type,\n };\n let eventData: StreamEventData = {};\n // Workaround Runnable core code not sending input when transform streaming.\n if (run.inputs.input === \"\" && Object.keys(run.inputs).length === 1) {\n eventData = {};\n runInfo.inputs = {};\n } else if (run.inputs.input !== undefined) {\n eventData.input = run.inputs.input;\n runInfo.inputs = run.inputs.input;\n } else {\n eventData.input = run.inputs;\n runInfo.inputs = run.inputs;\n }\n this.runInfoMap.set(run.id, runInfo);\n await this.send(\n {\n event: `on_${runType}_start`,\n data: eventData,\n name: runName,\n tags: run.tags ?? [],\n run_id: run.id,\n metadata: run.extra?.metadata ?? {},\n },\n runInfo\n );\n }\n\n async onChainEnd(run: Run): Promise<void> {\n const runInfo = this.runInfoMap.get(run.id);\n this.runInfoMap.delete(run.id);\n if (runInfo === undefined) {\n throw new Error(`onChainEnd: Run ID ${run.id} not found in run map.`);\n }\n const eventName = `on_${run.run_type}_end`;\n const inputs = run.inputs ?? runInfo.inputs ?? {};\n const outputs = run.outputs?.output ?? run.outputs;\n const data: StreamEventData = {\n output: outputs,\n input: inputs,\n };\n if (inputs.input && Object.keys(inputs).length === 1) {\n data.input = inputs.input;\n runInfo.inputs = inputs.input;\n }\n await this.sendEndEvent(\n {\n event: eventName,\n data,\n run_id: run.id,\n name: runInfo.name,\n tags: runInfo.tags,\n metadata: runInfo.metadata ?? {},\n },\n runInfo\n );\n }\n\n async onToolStart(run: Run): Promise<void> {\n const runName = assignName(run);\n const runInfo = {\n tags: run.tags ?? [],\n metadata: run.extra?.metadata ?? {},\n name: runName,\n runType: \"tool\",\n inputs: run.inputs ?? {},\n };\n this.runInfoMap.set(run.id, runInfo);\n await this.send(\n {\n event: \"on_tool_start\",\n data: {\n input: run.inputs ?? {},\n },\n name: runName,\n run_id: run.id,\n tags: run.tags ?? [],\n metadata: run.extra?.metadata ?? {},\n },\n runInfo\n );\n }\n\n async onToolEnd(run: Run): Promise<void> {\n const runInfo = this.runInfoMap.get(run.id);\n this.runInfoMap.delete(run.id);\n if (runInfo === undefined) {\n throw new Error(`onToolEnd: Run ID ${run.id} not found in run map.`);\n }\n if (runInfo.inputs === undefined) {\n throw new Error(\n `onToolEnd: Run ID ${run.id} is a tool call, and is expected to have traced inputs.`\n );\n }\n const output =\n run.outputs?.output === undefined ? run.outputs : run.outputs.output;\n await this.sendEndEvent(\n {\n event: \"on_tool_end\",\n data: {\n output,\n input: runInfo.inputs,\n },\n run_id: run.id,\n name: runInfo.name,\n tags: runInfo.tags,\n metadata: runInfo.metadata,\n },\n runInfo\n );\n }\n\n async onToolError(run: Run): Promise<void> {\n const runInfo = this.runInfoMap.get(run.id);\n this.runInfoMap.delete(run.id);\n if (runInfo === undefined) {\n throw new Error(`onToolEnd: Run ID ${run.id} not found in run map.`);\n }\n if (runInfo.inputs === undefined) {\n throw new Error(\n `onToolEnd: Run ID ${run.id} is a tool call, and is expected to have traced inputs.`\n );\n }\n\n await this.sendEndEvent(\n {\n event: \"on_tool_error\",\n data: {\n input: runInfo.inputs,\n error: run.error,\n },\n run_id: run.id,\n name: runInfo.name,\n tags: runInfo.tags,\n metadata: runInfo.metadata,\n },\n runInfo\n );\n }\n\n async onRetrieverStart(run: Run): Promise<void> {\n const runName = assignName(run);\n const runType = \"retriever\";\n const runInfo = {\n tags: run.tags ?? [],\n metadata: run.extra?.metadata ?? {},\n name: runName,\n runType,\n inputs: {\n query: run.inputs.query,\n },\n };\n this.runInfoMap.set(run.id, runInfo);\n await this.send(\n {\n event: \"on_retriever_start\",\n data: {\n input: {\n query: run.inputs.query,\n },\n },\n name: runName,\n tags: run.tags ?? [],\n run_id: run.id,\n metadata: run.extra?.metadata ?? {},\n },\n runInfo\n );\n }\n\n async onRetrieverEnd(run: Run): Promise<void> {\n const runInfo = this.runInfoMap.get(run.id);\n this.runInfoMap.delete(run.id);\n if (runInfo === undefined) {\n throw new Error(`onRetrieverEnd: Run ID ${run.id} not found in run map.`);\n }\n await this.sendEndEvent(\n {\n event: \"on_retriever_end\",\n data: {\n output: run.outputs?.documents ?? run.outputs,\n input: runInfo.inputs,\n },\n run_id: run.id,\n name: runInfo.name,\n tags: runInfo.tags,\n metadata: runInfo.metadata,\n },\n runInfo\n );\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n async handleCustomEvent(eventName: string, data: any, runId: string) {\n const runInfo = this.runInfoMap.get(runId);\n if (runInfo === undefined) {\n throw new Error(\n `handleCustomEvent: Run ID ${runId} not found in run map.`\n );\n }\n await this.send(\n {\n event: \"on_custom_event\",\n run_id: runId,\n name: eventName,\n tags: runInfo.tags,\n metadata: runInfo.metadata,\n data,\n },\n runInfo\n );\n }\n\n async finish() {\n const pendingPromises = [...this.tappedPromises.values()];\n // oxlint-disable-next-line no-void\n void Promise.all(pendingPromises).finally(() => {\n // oxlint-disable-next-line no-void\n void this.writer.close();\n });\n }\n}\n"],"mappings":"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"}