@langchain/core
Version:
Core LangChain.js abstractions and schemas
234 lines (233 loc) • 8.52 kB
JavaScript
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;
;