109 lines
3.8 KiB
JavaScript
109 lines
3.8 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.RegexParser = void 0;
|
||
|
const output_parsers_1 = require("@langchain/core/output_parsers");
|
||
|
/**
|
||
|
* Class to parse the output of an LLM call into a dictionary.
|
||
|
* @augments BaseOutputParser
|
||
|
*/
|
||
|
class RegexParser extends output_parsers_1.BaseOutputParser {
|
||
|
static lc_name() {
|
||
|
return "RegexParser";
|
||
|
}
|
||
|
get lc_attributes() {
|
||
|
return {
|
||
|
regex: this.lc_kwargs.regex,
|
||
|
};
|
||
|
}
|
||
|
constructor(fields, outputKeys, defaultOutputKey) {
|
||
|
// eslint-disable-next-line no-instanceof/no-instanceof
|
||
|
if (typeof fields === "string" || fields instanceof RegExp) {
|
||
|
// eslint-disable-next-line no-param-reassign, @typescript-eslint/no-non-null-assertion
|
||
|
fields = { regex: fields, outputKeys: outputKeys, defaultOutputKey };
|
||
|
}
|
||
|
// eslint-disable-next-line no-instanceof/no-instanceof
|
||
|
if (fields.regex instanceof RegExp) {
|
||
|
// eslint-disable-next-line no-param-reassign
|
||
|
fields.regex = {
|
||
|
pattern: fields.regex.source,
|
||
|
flags: fields.regex.flags,
|
||
|
};
|
||
|
}
|
||
|
super(fields);
|
||
|
Object.defineProperty(this, "lc_namespace", {
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
writable: true,
|
||
|
value: ["langchain", "output_parsers", "regex"]
|
||
|
});
|
||
|
Object.defineProperty(this, "lc_serializable", {
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
writable: true,
|
||
|
value: true
|
||
|
});
|
||
|
Object.defineProperty(this, "regex", {
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
writable: true,
|
||
|
value: void 0
|
||
|
});
|
||
|
Object.defineProperty(this, "outputKeys", {
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
writable: true,
|
||
|
value: void 0
|
||
|
});
|
||
|
Object.defineProperty(this, "defaultOutputKey", {
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
writable: true,
|
||
|
value: void 0
|
||
|
});
|
||
|
this.regex =
|
||
|
// eslint-disable-next-line no-nested-ternary
|
||
|
typeof fields.regex === "string"
|
||
|
? new RegExp(fields.regex)
|
||
|
: "pattern" in fields.regex
|
||
|
? new RegExp(fields.regex.pattern, fields.regex.flags)
|
||
|
: fields.regex;
|
||
|
this.outputKeys = fields.outputKeys;
|
||
|
this.defaultOutputKey = fields.defaultOutputKey;
|
||
|
}
|
||
|
_type() {
|
||
|
return "regex_parser";
|
||
|
}
|
||
|
/**
|
||
|
* Parses the given text using the regex pattern and returns a dictionary
|
||
|
* with the parsed output. If the regex pattern does not match the text
|
||
|
* and no defaultOutputKey is provided, throws an OutputParserException.
|
||
|
* @param text The text to be parsed.
|
||
|
* @returns A dictionary with the parsed output.
|
||
|
*/
|
||
|
async parse(text) {
|
||
|
const match = text.match(this.regex);
|
||
|
if (match) {
|
||
|
return this.outputKeys.reduce((acc, key, index) => {
|
||
|
acc[key] = match[index + 1];
|
||
|
return acc;
|
||
|
}, {});
|
||
|
}
|
||
|
if (this.defaultOutputKey === undefined) {
|
||
|
throw new output_parsers_1.OutputParserException(`Could not parse output: ${text}`, text);
|
||
|
}
|
||
|
return this.outputKeys.reduce((acc, key) => {
|
||
|
acc[key] = key === this.defaultOutputKey ? text : "";
|
||
|
return acc;
|
||
|
}, {});
|
||
|
}
|
||
|
/**
|
||
|
* Returns a string with instructions on how the LLM output should be
|
||
|
* formatted to match the regex pattern.
|
||
|
* @returns A string with formatting instructions.
|
||
|
*/
|
||
|
getFormatInstructions() {
|
||
|
return `Your response should match the following regex: ${this.regex}`;
|
||
|
}
|
||
|
}
|
||
|
exports.RegexParser = RegexParser;
|