UNPKG

@langchain/core

Version:
234 lines (233 loc) 8.52 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ConsoleCallbackHandler = void 0; const ansi_styles_1 = __importDefault(require("ansi-styles")); const base_js_1 = require("./base.cjs"); function wrap(style, text) { return `${style.open}${text}${style.close}`; } function tryJsonStringify(obj, fallback) { try { return JSON.stringify(obj, null, 2); } catch (err) { return fallback; } } function formatKVMapItem(value) { if (typeof value === "string") { return value.trim(); } if (value === null || value === undefined) { return value; } return tryJsonStringify(value, value.toString()); } function elapsed(run) { if (!run.end_time) return ""; const elapsed = run.end_time - run.start_time; if (elapsed < 1000) { return `${elapsed}ms`; } return `${(elapsed / 1000).toFixed(2)}s`; } const { color } = ansi_styles_1.default; /** * A tracer that logs all events to the console. It extends from the * `BaseTracer` class and overrides its methods to provide custom logging * functionality. * @example * ```typescript * * const llm = new ChatAnthropic({ * temperature: 0, * tags: ["example", "callbacks", "constructor"], * callbacks: [new ConsoleCallbackHandler()], * }); * * ``` */ class ConsoleCallbackHandler extends base_js_1.BaseTracer { constructor() { super(...arguments); Object.defineProperty(this, "name", { enumerable: true, configurable: true, writable: true, value: "console_callback_handler" }); } /** * Method used to persist the run. In this case, it simply returns a * resolved promise as there's no persistence logic. * @param _run The run to persist. * @returns A resolved promise. */ persistRun(_run) { return Promise.resolve(); } // utility methods /** * Method used to get all the parent runs of a given run. * @param run The run whose parents are to be retrieved. * @returns An array of parent runs. */ getParents(run) { const parents = []; let currentRun = run; while (currentRun.parent_run_id) { const parent = this.runMap.get(currentRun.parent_run_id); if (parent) { parents.push(parent); currentRun = parent; } else { break; } } return parents; } /** * Method used to get a string representation of the run's lineage, which * is used in logging. * @param run The run whose lineage is to be retrieved. * @returns A string representation of the run's lineage. */ getBreadcrumbs(run) { const parents = this.getParents(run).reverse(); const string = [...parents, run] .map((parent, i, arr) => { const name = `${parent.execution_order}:${parent.run_type}:${parent.name}`; return i === arr.length - 1 ? wrap(ansi_styles_1.default.bold, name) : name; }) .join(" > "); return wrap(color.grey, string); } // logging methods /** * Method used to log the start of a chain run. * @param run The chain run that has started. * @returns void */ onChainStart(run) { const crumbs = this.getBreadcrumbs(run); console.log(`${wrap(color.green, "[chain/start]")} [${crumbs}] Entering Chain run with input: ${tryJsonStringify(run.inputs, "[inputs]")}`); } /** * Method used to log the end of a chain run. * @param run The chain run that has ended. * @returns void */ onChainEnd(run) { const crumbs = this.getBreadcrumbs(run); console.log(`${wrap(color.cyan, "[chain/end]")} [${crumbs}] [${elapsed(run)}] Exiting Chain run with output: ${tryJsonStringify(run.outputs, "[outputs]")}`); } /** * Method used to log any errors of a chain run. * @param run The chain run that has errored. * @returns void */ onChainError(run) { const crumbs = this.getBreadcrumbs(run); console.log(`${wrap(color.red, "[chain/error]")} [${crumbs}] [${elapsed(run)}] Chain run errored with error: ${tryJsonStringify(run.error, "[error]")}`); } /** * Method used to log the start of an LLM run. * @param run The LLM run that has started. * @returns void */ onLLMStart(run) { const crumbs = this.getBreadcrumbs(run); const inputs = "prompts" in run.inputs ? { prompts: run.inputs.prompts.map((p) => p.trim()) } : run.inputs; console.log(`${wrap(color.green, "[llm/start]")} [${crumbs}] Entering LLM run with input: ${tryJsonStringify(inputs, "[inputs]")}`); } /** * Method used to log the end of an LLM run. * @param run The LLM run that has ended. * @returns void */ onLLMEnd(run) { const crumbs = this.getBreadcrumbs(run); console.log(`${wrap(color.cyan, "[llm/end]")} [${crumbs}] [${elapsed(run)}] Exiting LLM run with output: ${tryJsonStringify(run.outputs, "[response]")}`); } /** * Method used to log any errors of an LLM run. * @param run The LLM run that has errored. * @returns void */ onLLMError(run) { const crumbs = this.getBreadcrumbs(run); console.log(`${wrap(color.red, "[llm/error]")} [${crumbs}] [${elapsed(run)}] LLM run errored with error: ${tryJsonStringify(run.error, "[error]")}`); } /** * Method used to log the start of a tool run. * @param run The tool run that has started. * @returns void */ onToolStart(run) { const crumbs = this.getBreadcrumbs(run); console.log(`${wrap(color.green, "[tool/start]")} [${crumbs}] Entering Tool run with input: "${formatKVMapItem(run.inputs.input)}"`); } /** * Method used to log the end of a tool run. * @param run The tool run that has ended. * @returns void */ onToolEnd(run) { const crumbs = this.getBreadcrumbs(run); console.log(`${wrap(color.cyan, "[tool/end]")} [${crumbs}] [${elapsed(run)}] Exiting Tool run with output: "${formatKVMapItem(run.outputs?.output)}"`); } /** * Method used to log any errors of a tool run. * @param run The tool run that has errored. * @returns void */ onToolError(run) { const crumbs = this.getBreadcrumbs(run); console.log(`${wrap(color.red, "[tool/error]")} [${crumbs}] [${elapsed(run)}] Tool run errored with error: ${tryJsonStringify(run.error, "[error]")}`); } /** * Method used to log the start of a retriever run. * @param run The retriever run that has started. * @returns void */ onRetrieverStart(run) { const crumbs = this.getBreadcrumbs(run); console.log(`${wrap(color.green, "[retriever/start]")} [${crumbs}] Entering Retriever run with input: ${tryJsonStringify(run.inputs, "[inputs]")}`); } /** * Method used to log the end of a retriever run. * @param run The retriever run that has ended. * @returns void */ onRetrieverEnd(run) { const crumbs = this.getBreadcrumbs(run); console.log(`${wrap(color.cyan, "[retriever/end]")} [${crumbs}] [${elapsed(run)}] Exiting Retriever run with output: ${tryJsonStringify(run.outputs, "[outputs]")}`); } /** * Method used to log any errors of a retriever run. * @param run The retriever run that has errored. * @returns void */ onRetrieverError(run) { const crumbs = this.getBreadcrumbs(run); console.log(`${wrap(color.red, "[retriever/error]")} [${crumbs}] [${elapsed(run)}] Retriever run errored with error: ${tryJsonStringify(run.error, "[error]")}`); } /** * Method used to log the action selected by the agent. * @param run The run in which the agent action occurred. * @returns void */ onAgentAction(run) { const agentRun = run; const crumbs = this.getBreadcrumbs(run); console.log(`${wrap(color.blue, "[agent/action]")} [${crumbs}] Agent selected action: ${tryJsonStringify(agentRun.actions[agentRun.actions.length - 1], "[action]")}`); } } exports.ConsoleCallbackHandler = ConsoleCallbackHandler;