-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
outputParser.ts
60 lines (52 loc) · 1.85 KB
/
outputParser.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import { OutputParserException } from "@langchain/core/output_parsers";
import { OutputParserArgs } from "../agent.js";
import { AgentActionOutputParser } from "../types.js";
import { FORMAT_INSTRUCTIONS } from "./prompt.js";
export const FINAL_ANSWER_ACTION = "Final Answer:";
/**
* A class that extends `AgentActionOutputParser` to provide a custom
* implementation for parsing the output of a ZeroShotAgent action.
*/
export class ZeroShotAgentOutputParser extends AgentActionOutputParser {
lc_namespace = ["langchain", "agents", "mrkl"];
finishToolName: string;
constructor(fields?: OutputParserArgs) {
super(fields);
this.finishToolName = fields?.finishToolName || FINAL_ANSWER_ACTION;
}
/**
* Parses the text output of an agent action, extracting the tool, tool
* input, and output.
* @param text The text output of an agent action.
* @returns An object containing the tool, tool input, and output extracted from the text, along with the original text as a log.
*/
async parse(text: string) {
if (text.includes(this.finishToolName)) {
const parts = text.split(this.finishToolName);
const output = parts[parts.length - 1].trim();
return {
returnValues: { output },
log: text,
};
}
const match = /Action:([\s\S]*?)(?:\nAction Input:([\s\S]*?))?$/.exec(text);
if (!match) {
throw new OutputParserException(`Could not parse LLM output: ${text}`);
}
return {
tool: match[1].trim(),
toolInput: match[2]
? match[2].trim().replace(/^("+)(.*?)(\1)$/, "$2")
: "",
log: text,
};
}
/**
* Returns the format instructions for parsing the output of an agent
* action in the style of the ZeroShotAgent.
* @returns The format instructions for parsing the output.
*/
getFormatInstructions(): string {
return FORMAT_INSTRUCTIONS;
}
}