langchain-react-chinese-parser
Version:
一个专门为中文大模型提供的 LangChain ReAct 输出解析器集合,支持通义千问、ChatGLM、百川、智谱GLM、文心一言、Minimax 等主流中文模型
1 lines • 45.3 kB
Source Map (JSON)
{"version":3,"sources":["../src/base/BaseChineseReActParser.ts","../src/parsers/BaichuanReActOutputParser.ts","../src/parsers/ChatGLMReActOutputParser.ts","../src/parsers/ERNIEReActOutputParser.ts","../src/parsers/QwenReActOutputParser.ts","../src/factory.ts","../src/index.ts"],"sourcesContent":["/**\n * 中文 ReAct 解析器基类\n *\n * 为所有中文大模型提供通用的解析逻辑框架\n */\n\nimport { AgentAction, AgentFinish } from '@langchain/core/agents';\nimport { BaseOutputParser, OutputParserException } from '@langchain/core/output_parsers';\nimport {\n ActionMatch,\n ChineseModelType,\n IChineseReActParser,\n LanguageKeywords,\n ParseResult,\n ParserOptions,\n} from '../types.js';\n\n/**\n * 中文 ReAct 解析器基类\n */\nexport abstract class BaseChineseReActParser\n extends BaseOutputParser<AgentAction | AgentFinish>\n implements IChineseReActParser\n{\n protected abstract modelType: ChineseModelType;\n protected abstract keywords: LanguageKeywords;\n protected options: ParserOptions;\n\n // LangChain 需要的命名空间\n abstract lc_namespace: string[];\n\n constructor(options: ParserOptions = {}) {\n super();\n this.options = {\n debug: false,\n relaxedMode: true,\n maxRetries: 3,\n ...options,\n };\n }\n\n /**\n * 解析模型输出\n */\n async parse(text: string): Promise<ParseResult> {\n const cleanText = this.preprocessText(text);\n\n if (this.options.debug) {\n console.log(`[${this.modelType}] 解析输入:`, cleanText);\n }\n\n // 1. 优先检查最终答案\n const finalAnswerMatch = this.extractFinalAnswer(cleanText);\n if (finalAnswerMatch) {\n if (this.options.debug) {\n console.log(`[${this.modelType}] 找到最终答案:`, finalAnswerMatch);\n }\n return {\n returnValues: { output: finalAnswerMatch.trim() },\n log: cleanText,\n };\n }\n\n // 2. 尝试解析动作\n const actionMatch = this.extractAction(cleanText);\n if (actionMatch) {\n if (this.options.debug) {\n console.log(`[${this.modelType}] 找到动作:`, actionMatch);\n }\n return {\n tool: actionMatch.action.trim(),\n toolInput: actionMatch.actionInput.trim(),\n log: cleanText,\n };\n }\n\n // 3. 如果解析失败,抛出异常\n const errorMessage = this.buildErrorMessage(cleanText);\n throw new OutputParserException(errorMessage, cleanText);\n }\n\n /**\n * 获取格式化指令\n */\n getFormatInstructions(): string {\n return this.buildFormatInstructions();\n }\n\n /**\n * 获取解析器类型\n */\n getType(): string {\n return `${this.modelType}_react_output_parser`;\n }\n\n /**\n * 预处理文本\n */\n protected preprocessText(text: string): string {\n return text\n .trim()\n .replace(/\\r\\n/g, '\\n') // 统一换行符\n .replace(/[ \\t]+/g, ' ') // 合并多余空格(但保留换行)\n .replace(/\\n\\s+/g, '\\n') // 清理行首空格\n .replace(/\\s*[::]\\s*/g, ': '); // 统一冒号格式,冒号后加空格\n }\n\n /**\n * 提取最终答案\n */\n protected extractFinalAnswer(text: string): string | null {\n const allKeywords = [\n ...this.keywords.chinese.finalAnswer,\n ...this.keywords.english.finalAnswer,\n ...(this.options.customKeywords?.chinese?.finalAnswer || []),\n ...(this.options.customKeywords?.english?.finalAnswer || []),\n ];\n\n for (const keyword of allKeywords) {\n // 严格匹配模式\n const strictRegex = new RegExp(`^\\\\s*${this.escapeRegex(keyword)}\\\\s*[::]\\\\s*(.*)$`, 'im');\n const strictMatch = text.match(strictRegex);\n if (strictMatch && strictMatch[1]) {\n return strictMatch[1];\n }\n\n // 多行匹配模式\n const multiLineRegex = new RegExp(\n `(?:^|\\\\n)\\\\s*${this.escapeRegex(keyword)}\\\\s*[::]\\\\s*(.*)(?:\\\\n|$)`,\n 'im',\n );\n const multiLineMatch = text.match(multiLineRegex);\n if (multiLineMatch && multiLineMatch[1]) {\n return multiLineMatch[1];\n }\n\n // 宽松匹配模式\n if (this.options.relaxedMode) {\n const relaxedPattern = \n `${this.escapeRegex(keyword)}[\\\\s]*[::][\\\\s]*([\\\\s\\\\S]*?)` +\n '(?=\\\\n\\\\s*(?:思考|动作|最终答案|Thought|Action|Final Answer)|$)';\n const relaxedRegex = new RegExp(relaxedPattern, 'i');\n const relaxedMatch = text.match(relaxedRegex);\n if (relaxedMatch && relaxedMatch[1]) {\n return relaxedMatch[1].trim();\n }\n }\n }\n\n return null;\n }\n\n /**\n * 提取动作和动作输入\n */\n protected extractAction(text: string): ActionMatch | null {\n // 尝试中文格式\n const chineseAction = this.extractActionByLanguage(text, 'chinese');\n if (chineseAction) {\n return chineseAction;\n }\n\n // 尝试英文格式\n const englishAction = this.extractActionByLanguage(text, 'english');\n if (englishAction) {\n return englishAction;\n }\n\n // 自定义格式处理在子类中实现\n return null;\n }\n\n /**\n * 按语言提取动作\n */\n protected extractActionByLanguage(\n text: string,\n language: 'chinese' | 'english',\n ): ActionMatch | null {\n const keywords = this.keywords[language];\n let action = '';\n let actionInput = '';\n let thought = '';\n\n // 提取思考(可选)\n for (const thoughtKeyword of keywords.thought) {\n const thoughtRegex = new RegExp(\n `(?:^|\\\\n)\\\\s*${this.escapeRegex(thoughtKeyword)}\\\\s*[::]\\\\s*([^\\\\n]+)`,\n 'im',\n );\n const thoughtMatch = text.match(thoughtRegex);\n if (thoughtMatch) {\n thought = thoughtMatch[1].trim();\n break;\n }\n }\n\n // 提取动作\n for (const actionKeyword of keywords.action) {\n const actionRegex = new RegExp(\n `(?:^|\\\\n)\\\\s*${this.escapeRegex(actionKeyword)}\\\\s*[::]\\\\s*([^\\\\n]+)`,\n 'im',\n );\n const actionMatch = text.match(actionRegex);\n if (actionMatch) {\n action = actionMatch[1].trim();\n break;\n }\n }\n\n // 提取动作输入\n for (const inputKeyword of keywords.actionInput) {\n const inputRegex = new RegExp(\n `(?:^|\\\\n)\\\\s*${this.escapeRegex(inputKeyword)}\\\\s*[::]\\\\s*([^\\\\n]+)`,\n 'im',\n );\n const inputMatch = text.match(inputRegex);\n if (inputMatch) {\n actionInput = inputMatch[1].trim();\n break;\n }\n }\n\n // 宽松匹配:如果找到动作但没找到动作输入\n if (action && !actionInput && this.options.relaxedMode) {\n actionInput = this.extractActionInputFallback(text, action, language);\n }\n\n return action && actionInput ? { action, actionInput, thought } : null;\n }\n\n /**\n * 兜底策略:提取动作输入\n */\n protected extractActionInputFallback(\n text: string,\n action: string,\n language: 'chinese' | 'english',\n ): string {\n // 查找动作行之后的下一行内容作为输入\n const actionKeywords = this.keywords[language].action;\n\n for (const actionKeyword of actionKeywords) {\n const regexPattern = \n `(?:^|\\\\n)\\\\s*${this.escapeRegex(actionKeyword)}\\\\s*[::]\\\\s*` +\n `${this.escapeRegex(action)}\\\\s*\\\\n([^\\\\n]+)`;\n const regex = new RegExp(regexPattern, 'im');\n const match = text.match(regex);\n if (match) {\n return match[1].trim();\n }\n }\n\n return '';\n }\n\n /**\n * 构建格式化指令\n */\n protected buildFormatInstructions(): string {\n const chineseKeywords = this.keywords.chinese;\n const englishKeywords = this.keywords.english;\n\n return `请按照以下格式回答:\n\n**使用工具时:**\n${chineseKeywords.thought[0]}: 描述你的思考过程\n${chineseKeywords.action[0]}: 工具名称\n${chineseKeywords.actionInput[0]}: 工具的输入参数\n\n**有最终答案时:**\n${chineseKeywords.thought[0]}: 描述你的思考过程\n${chineseKeywords.finalAnswer[0]}: 你的最终答案\n\n**注意事项:**\n- 每行都要以对应的关键字开头,后面跟冒号\n- 支持中英文关键字混用\n- 英文格式:${englishKeywords.thought[0]}:, ${englishKeywords.action[0]}:, ` +\n `${englishKeywords.actionInput[0]}:, ${englishKeywords.finalAnswer[0]}:\n- 中文格式:${chineseKeywords.thought[0]}:, ${chineseKeywords.action[0]}:, ` +\n `${chineseKeywords.actionInput[0]}:, ${chineseKeywords.finalAnswer[0]}:`;\n }\n\n /**\n * 构建错误消息\n */\n protected buildErrorMessage(text: string): string {\n const chineseKeywords = this.keywords.chinese;\n\n return `无法解析 ${this.modelType} 模型输出。请确保输出包含正确的关键字格式。\n\n期望格式:\n${chineseKeywords.thought[0]}: [思考过程]\n${chineseKeywords.action[0]}: [工具名称]\n${chineseKeywords.actionInput[0]}: [工具参数]\n\n或者:\n${chineseKeywords.thought[0]}: [思考过程]\n${chineseKeywords.finalAnswer[0]}: [最终答案]\n\n实际输出: ${text}`;\n }\n\n /**\n * 转义正则表达式特殊字符\n */\n protected escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n /**\n * LangChain 兼容性\n */\n _type(): string {\n return this.getType();\n }\n}\n","/**\n * 百川 ReAct 输出解析器\n *\n * 专门适配百川(Baichuan)模型的中文 ReAct 格式输出解析\n */\n\nimport { BaseChineseReActParser } from '../base/BaseChineseReActParser.js';\nimport { ChineseModelType, LanguageKeywords, ParserOptions } from '../types.js';\n\n/**\n * 百川 ReAct 输出格式解析器\n *\n * 百川模型常见格式:\n * ```\n * 思考: 需要搜索相关信息\n * 工具: search\n * 工具输入: 查询内容\n *\n * 思考: 根据搜索结果分析\n * 最终答案: 分析结果\n * ```\n */\nexport class BaichuanReActOutputParser extends BaseChineseReActParser {\n lc_namespace = ['langchain-react-chinese-parser', 'parsers', 'baichuan'];\n protected modelType: ChineseModelType = 'baichuan';\n protected keywords: LanguageKeywords = {\n chinese: {\n thought: ['思考', '分析', '推理'],\n action: ['工具', '动作', '操作', '使用'],\n actionInput: ['工具输入', '参数', '输入', '内容'],\n finalAnswer: ['最终答案', '答案', '结果'],\n observation: ['观察', '工具返回', '返回结果'],\n },\n english: {\n thought: ['thought', 'think', 'reasoning'],\n action: ['tool', 'action', 'use'],\n actionInput: ['tool input', 'parameter', 'input'],\n finalAnswer: ['final answer', 'answer', 'result'],\n observation: ['observation', 'tool result'],\n },\n };\n\n constructor(options: ParserOptions = {}) {\n super(options);\n }\n\n /**\n * 百川特殊格式处理\n * 百川模型倾向于使用\"工具\"而非\"动作\"\n */\n protected extractCustomAction(text: string) {\n // 百川格式:使用[工具名]工具,输入[参数]\n const useToolPattern = /使用([^工具\\n]+)工具[,]?\\s*输入\\s*([^。\\n]*)/;\n const useToolMatch = text.match(useToolPattern);\n if (useToolMatch) {\n return {\n action: useToolMatch[1].trim(),\n actionInput: useToolMatch[2].trim(),\n thought: '使用工具',\n };\n }\n\n // 格式:调用工具[工具名]进行[操作]\n const callToolPattern = /调用工具([^进行\\n]+)进行([^。\\n]*)/;\n const callToolMatch = text.match(callToolPattern);\n if (callToolMatch) {\n return {\n action: callToolMatch[1].trim(),\n actionInput: callToolMatch[2].trim(),\n thought: '调用工具',\n };\n }\n\n // 处理省略\"工具\"字样的情况\n const directToolPattern = /(?:^|\\n)\\s*([a-zA-Z_]+)\\s*[::]\\s*([^\\n]+)/im;\n const directToolMatch = text.match(directToolPattern);\n if (directToolMatch && this.isToolName(directToolMatch[1])) {\n return {\n action: directToolMatch[1].trim(),\n actionInput: directToolMatch[2].trim(),\n thought: '直接调用工具',\n };\n }\n\n return null;\n }\n\n /**\n * 判断是否为工具名称\n */\n private isToolName(name: string): boolean {\n // 常见工具名称模式\n const commonTools = [\n 'search',\n 'calculator',\n 'weather',\n 'translate',\n 'file',\n 'web',\n 'database',\n 'api',\n 'code',\n ];\n\n return (\n commonTools.some(tool => name.toLowerCase().includes(tool)) ||\n /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)\n ); // 符合变量命名规范\n }\n\n /**\n * 重写格式化指令\n */\n protected buildFormatInstructions(): string {\n const base = super.buildFormatInstructions();\n\n return `${base}\n\n**百川特殊格式支持:**\n- 使用[工具名]工具,输入[参数]\n- 调用工具[工具名]进行[操作]\n- 推荐使用\"工具\"而非\"动作\"关键字\n- 支持直接工具名调用:tool_name: parameter`;\n }\n}\n","/**\n * ChatGLM ReAct 输出解析器\n *\n * 专门适配 ChatGLM 模型的中文 ReAct 格式输出解析\n */\n\nimport { BaseChineseReActParser } from '../base/BaseChineseReActParser.js';\nimport { ChineseModelType, LanguageKeywords, ParserOptions } from '../types.js';\n\n/**\n * ChatGLM ReAct 输出格式解析器\n *\n * ChatGLM 常见格式:\n * ```\n * 思考:我需要查找相关信息\n * 动作:search\n * 动作输入:天气查询\n *\n * 思考:基于搜索结果,我可以给出答案\n * 最终答案:今天天气晴朗\n * ```\n */\nexport class ChatGLMReActOutputParser extends BaseChineseReActParser {\n lc_namespace = ['langchain-react-chinese-parser', 'parsers', 'chatglm'];\n protected modelType: ChineseModelType = 'chatglm';\n protected keywords: LanguageKeywords = {\n chinese: {\n thought: ['思考', '分析', '理解', '考虑'],\n action: ['动作', '行动', '工具', '操作'],\n actionInput: ['动作输入', '工具输入', '输入', '参数'],\n finalAnswer: ['最终答案', '答案', '结论', '回答'],\n observation: ['观察', '观察结果', '结果'],\n },\n english: {\n thought: ['thought', 'thinking', 'analysis'],\n action: ['action', 'tool', 'operation'],\n actionInput: ['action input', 'tool input', 'input'],\n finalAnswer: ['final answer', 'answer', 'conclusion'],\n observation: ['observation', 'result'],\n },\n };\n\n constructor(options: ParserOptions = {}) {\n super(options);\n }\n\n /**\n * ChatGLM 特殊格式处理\n * ChatGLM 经常合并思考和动作,或使用冒号变体\n */\n protected extractCustomAction(text: string) {\n // ChatGLM 常用格式:使用工具:[工具名] 查询:[参数]\n const toolQueryPattern = /使用工具[::]([^,\\n]+)[\\s]*查询[::]([^。\\n]*)/;\n const toolQueryMatch = text.match(toolQueryPattern);\n if (toolQueryMatch) {\n return {\n action: toolQueryMatch[1].trim(),\n actionInput: toolQueryMatch[2].trim(),\n thought: '需要使用工具查询',\n };\n }\n\n // 格式:调用[工具名],参数为[参数]\n const callToolPattern = /调用([^,\\n]+)[,]?\\s*参数为\\s*([^。\\n]*)/;\n const callToolMatch = text.match(callToolPattern);\n if (callToolMatch) {\n return {\n action: callToolMatch[1].trim(),\n actionInput: callToolMatch[2].trim(),\n thought: '调用工具',\n };\n }\n\n // 处理只有冒号的情况(ChatGLM 有时省略中文冒号)\n const colonOnlyPattern =\n /(?:^|\\n)\\s*(动作|工具|操作)\\s*:\\s*([^\\n]+)\\s*\\n\\s*(?:输入|参数)\\s*:\\s*([^\\n]+)/im;\n const colonOnlyMatch = text.match(colonOnlyPattern);\n if (colonOnlyMatch) {\n return {\n action: colonOnlyMatch[2].trim(),\n actionInput: colonOnlyMatch[3].trim(),\n thought: '执行操作',\n };\n }\n\n return null;\n }\n\n /**\n * ChatGLM 倾向于使用中文冒号,重写预处理逻辑\n */\n protected preprocessText(text: string): string {\n return text\n .trim()\n .replace(/\\r\\n/g, '\\n')\n .replace(/:/g, ':') // ChatGLM 特殊处理:统一冒号\n .replace(/\\s+/g, ' ')\n .replace(/\\n\\s+/g, '\\n');\n }\n\n /**\n * 重写格式化指令\n */\n protected buildFormatInstructions(): string {\n const base = super.buildFormatInstructions();\n\n return `${base}\n\n**ChatGLM 特殊格式支持:**\n- 使用工具:[工具名] 查询:[参数]\n- 调用[工具名],参数为[参数]\n- 支持中文冒号:和英文冒号:混用\n- 推荐使用中文冒号:格式`;\n }\n}\n","/**\n * 文心一言 ReAct 输出解析器\n *\n * 专门适配文心一言(ERNIE)模型的中文 ReAct 格式输出解析\n */\n\nimport { BaseChineseReActParser } from '../base/BaseChineseReActParser.js';\nimport { ChineseModelType, LanguageKeywords, ParserOptions } from '../types.js';\n\n/**\n * 文心一言 ReAct 输出格式解析器\n *\n * ERNIE 模型常见格式:\n * ```\n * 思考:需要查询相关信息\n * 调用工具:search\n * 输入:查询内容\n *\n * 思考:基于查询结果进行分析\n * 最终答案:分析结果\n * ```\n */\nexport class ERNIEReActOutputParser extends BaseChineseReActParser {\n lc_namespace = ['langchain-react-chinese-parser', 'parsers', 'ernie'];\n protected modelType: ChineseModelType = 'ernie';\n protected keywords: LanguageKeywords = {\n chinese: {\n thought: ['思考', '分析', '判断', '考虑'],\n action: ['调用工具', '使用工具', '执行', '操作'],\n actionInput: ['输入', '参数', '内容', '查询'],\n finalAnswer: ['最终答案', '答案', '结论', '回复'],\n observation: ['观察', '工具结果', '返回', '输出'],\n },\n english: {\n thought: ['thought', 'analysis', 'thinking'],\n action: ['call tool', 'use tool', 'action'],\n actionInput: ['input', 'parameter', 'query'],\n finalAnswer: ['final answer', 'answer', 'conclusion'],\n observation: ['observation', 'tool result', 'output'],\n },\n };\n\n constructor(options: ParserOptions = {}) {\n super(options);\n }\n\n /**\n * ERNIE 特殊格式处理\n * ERNIE 倾向于使用\"调用工具\"和较长的关键字\n */\n protected extractCustomAction(text: string) {\n // ERNIE 格式:我需要调用[工具名]来[操作描述]\n const needCallPattern = /我需要调用([^来\\n]+)来([^。\\n]*)/;\n const needCallMatch = text.match(needCallPattern);\n if (needCallMatch) {\n return {\n action: needCallMatch[1].trim(),\n actionInput: needCallMatch[2].trim(),\n thought: '需要调用工具',\n };\n }\n\n // 格式:现在调用[工具名],参数是[参数]\n const nowCallPattern = /现在调用([^,\\n]+)[,]?\\s*参数是\\s*([^。\\n]*)/;\n const nowCallMatch = text.match(nowCallPattern);\n if (nowCallMatch) {\n return {\n action: nowCallMatch[1].trim(),\n actionInput: nowCallMatch[2].trim(),\n thought: '调用工具',\n };\n }\n\n // 处理中英文混合格式\n const mixedPattern = /(?:调用|call)\\s*([a-zA-Z_\\u4e00-\\u9fff]+)\\s*[::]\\s*([^\\n]+)/i;\n const mixedMatch = text.match(mixedPattern);\n if (mixedMatch) {\n return {\n action: mixedMatch[1].trim(),\n actionInput: mixedMatch[2].trim(),\n thought: '执行操作',\n };\n }\n\n return null;\n }\n\n /**\n * ERNIE 特殊的预处理\n * 处理 ERNIE 经常出现的多余描述文字\n */\n protected preprocessText(text: string): string {\n let cleaned = super.preprocessText(text);\n\n // 移除 ERNIE 常见的冗余表达\n cleaned = cleaned\n .replace(/好的[,,]?/g, '')\n .replace(/我来帮您[^。]*。?/g, '')\n .replace(/让我[^。]*。?/g, '')\n .replace(/根据您的要求[,,]?/g, '');\n\n return cleaned;\n }\n\n /**\n * 重写格式化指令\n */\n protected buildFormatInstructions(): string {\n const base = super.buildFormatInstructions();\n\n return `${base}\n\n**文心一言特殊格式支持:**\n- 我需要调用[工具名]来[操作描述]\n- 现在调用[工具名],参数是[参数]\n- 推荐使用\"调用工具\"关键字\n- 支持中英文混合:call [tool]: [parameter]\n- 会自动过滤常见的冗余表达`;\n }\n}\n","/**\n * 通义千问 ReAct 输出解析器\n *\n * 专门适配通义千问(Qwen)模型的中文 ReAct 格式输出解析\n */\n\nimport { BaseChineseReActParser } from '../base/BaseChineseReActParser.js';\nimport { ChineseModelType, LanguageKeywords, ParserOptions } from '../types.js';\n\n/**\n * 通义千问 ReAct 输出格式解析器\n *\n * 支持格式:\n * ```\n * 思考: 我需要搜索相关信息\n * 动作: search\n * 动作输入: 搜索内容\n *\n * 思考: 我已经找到了答案\n * 最终答案: 这是最终的答案\n * ```\n */\nexport class QwenReActOutputParser extends BaseChineseReActParser {\n lc_namespace = ['langchain-react-chinese-parser', 'parsers', 'qwen'];\n protected modelType: ChineseModelType = 'qwen';\n protected keywords: LanguageKeywords = {\n chinese: {\n thought: ['思考', '推理', '分析', '想法'],\n action: ['动作', '行动', '操作'],\n actionInput: ['动作输入', '操作输入', '输入', '参数'],\n finalAnswer: ['最终答案', '答案', '结果', '回答'],\n observation: ['观察', '结果', '返回'],\n },\n english: {\n thought: ['thought', 'thinking', 'think'],\n action: ['action', 'act'],\n actionInput: ['action input', 'action_input', 'input'],\n finalAnswer: ['final answer', 'answer', 'result'],\n observation: ['observation', 'obs'],\n },\n };\n\n constructor(options: ParserOptions = {}) {\n super(options);\n }\n\n /**\n * 通义千问特殊格式处理\n * 处理一些通义千问模型特有的输出变体\n */\n protected extractCustomAction(text: string) {\n // 通义千问有时会输出 \"我将...\" 格式\n const willDoPattern =\n /我将(?:使用|调用|执行)([^,。\\n]+)(?:工具|功能)[,。]?(?:来|去)?([^。\\n]*)/;\n const willDoMatch = text.match(willDoPattern);\n if (willDoMatch) {\n return {\n action: willDoMatch[1].trim(),\n actionInput: willDoMatch[2].trim() || 'default',\n thought: '需要使用工具',\n };\n }\n\n // 处理 \"执行:\" 格式\n const executePattern = /(?:^|\\n)\\s*执行\\s*[::]\\s*([^\\n]+)/im;\n const executeMatch = text.match(executePattern);\n if (executeMatch) {\n const parts = executeMatch[1].split(/[,,]/);\n if (parts.length >= 2) {\n return {\n action: parts[0].trim(),\n actionInput: parts.slice(1).join(',').trim(),\n thought: '执行工具',\n };\n }\n }\n\n return null;\n }\n\n /**\n * 重写格式化指令,添加通义千问特殊说明\n */\n protected buildFormatInstructions(): string {\n const base = super.buildFormatInstructions();\n\n return `${base}\n\n**通义千问特殊格式支持:**\n- 也支持:我将使用[工具名]来[参数描述]\n- 也支持:执行: [工具名], [参数]\n- 支持观察关键字:观察:, 结果:, 返回:`;\n }\n}\n","/**\n * 中文 ReAct 解析器工厂\n *\n * 提供便捷的方法创建各种中文模型的 ReAct 解析器\n */\n\nimport { AgentAction, AgentFinish } from '@langchain/core/agents';\nimport { BaseOutputParser } from '@langchain/core/output_parsers';\nimport { BaichuanReActOutputParser } from './parsers/BaichuanReActOutputParser.js';\nimport { ChatGLMReActOutputParser } from './parsers/ChatGLMReActOutputParser.js';\nimport { ERNIEReActOutputParser } from './parsers/ERNIEReActOutputParser.js';\nimport { QwenReActOutputParser } from './parsers/QwenReActOutputParser.js';\nimport { ChineseModelType, IChineseReActParser, ParserOptions } from './types.js';\n\n/**\n * 解析器工厂类\n */\nexport class ChineseReActParserFactory {\n /**\n * 创建指定类型的解析器\n */\n static createParser(\n modelType: ChineseModelType,\n options: ParserOptions = {},\n ): IChineseReActParser {\n switch (modelType) {\n case 'qwen':\n return new QwenReActOutputParser(options);\n\n case 'chatglm':\n return new ChatGLMReActOutputParser(options);\n\n case 'baichuan':\n return new BaichuanReActOutputParser(options);\n\n case 'ernie':\n return new ERNIEReActOutputParser(options);\n\n case 'glm':\n // 智谱GLM 使用与 ChatGLM 相同的解析器\n return new ChatGLMReActOutputParser(options);\n\n case 'minimax':\n // Minimax 使用通义千问的解析器(格式相似)\n return new QwenReActOutputParser(options);\n\n case 'auto':\n // 自动模式:返回支持多种格式的通用解析器\n return new UniversalChineseReActParser(options);\n\n default:\n throw new Error(`不支持的模型类型: ${modelType}`);\n }\n }\n\n /**\n * 获取所有支持的模型类型\n */\n static getSupportedModels(): ChineseModelType[] {\n return ['qwen', 'chatglm', 'baichuan', 'glm', 'ernie', 'minimax', 'auto'];\n }\n\n /**\n * 检查是否支持指定模型\n */\n static isSupported(modelType: string): boolean {\n return this.getSupportedModels().includes(modelType as ChineseModelType);\n }\n}\n\n/**\n * 通用中文 ReAct 解析器\n * 尝试多种解析策略,适配不同的中文模型输出格式\n */\nclass UniversalChineseReActParser\n extends BaseOutputParser<AgentAction | AgentFinish>\n implements IChineseReActParser\n{\n lc_namespace = ['langchain-react-chinese-parser', 'parsers', 'universal'];\n\n private parsers: IChineseReActParser[];\n private options: ParserOptions;\n\n constructor(options: ParserOptions = {}) {\n super();\n this.options = options;\n this.parsers = [\n new QwenReActOutputParser(options),\n new ChatGLMReActOutputParser(options),\n new BaichuanReActOutputParser(options),\n new ERNIEReActOutputParser(options),\n ];\n }\n\n async parse(text: string) {\n const errors: Error[] = [];\n\n // 依次尝试各个解析器\n for (const parser of this.parsers) {\n try {\n const result = await parser.parse(text);\n\n if (this.options.debug) {\n console.log(`[Universal] 成功使用 ${parser.getType()} 解析`);\n }\n\n return result;\n } catch (error) {\n errors.push(error as Error);\n\n if (this.options.debug) {\n console.log(`[Universal] ${parser.getType()} 解析失败:`, error);\n }\n }\n }\n\n // 所有解析器都失败\n throw new Error(\n `所有解析器都无法解析此输出。错误详情:\\n${errors.map(e => e.message).join('\\n\\n')}`,\n );\n }\n\n getFormatInstructions(): string {\n return `请按照以下任一格式回答:\n\n**通义千问格式:**\n思考: 描述思考过程\n动作: 工具名称 \n动作输入: 工具参数\n\n**ChatGLM格式:**\n思考:描述思考过程\n工具:工具名称\n工具输入:工具参数\n\n**百川格式:**\n思考: 描述思考过程\n工具: 工具名称\n工具输入: 工具参数\n\n**文心一言格式:**\n思考:描述思考过程\n调用工具:工具名称\n输入:工具参数\n\n**最终答案格式(任何模型):**\n思考: 描述思考过程\n最终答案: 你的答案\n\n**注意:**\n- 支持中英文关键字混用\n- 支持中文冒号:和英文冒号:\n- 工具名和参数要清晰明确`;\n }\n\n getType(): string {\n return 'universal_chinese_react_parser';\n }\n}\n\n/**\n * 便捷函数:创建解析器\n */\nexport function createChineseReActParser(\n modelType: ChineseModelType,\n options: ParserOptions = {},\n): IChineseReActParser {\n return ChineseReActParserFactory.createParser(modelType, options);\n}\n\n/**\n * 便捷函数:创建通义千问解析器\n */\nexport function createQwenParser(options: ParserOptions = {}): QwenReActOutputParser {\n return new QwenReActOutputParser(options);\n}\n\n/**\n * 便捷函数:创建 ChatGLM 解析器\n */\nexport function createChatGLMParser(options: ParserOptions = {}): ChatGLMReActOutputParser {\n return new ChatGLMReActOutputParser(options);\n}\n\n/**\n * 便捷函数:创建百川解析器\n */\nexport function createBaichuanParser(options: ParserOptions = {}): BaichuanReActOutputParser {\n return new BaichuanReActOutputParser(options);\n}\n\n/**\n * 便捷函数:创建文心一言解析器\n */\nexport function createERNIEParser(options: ParserOptions = {}): ERNIEReActOutputParser {\n return new ERNIEReActOutputParser(options);\n}\n\n/**\n * 便捷函数:创建自动解析器\n */\nexport function createAutoParser(options: ParserOptions = {}): IChineseReActParser {\n return ChineseReActParserFactory.createParser('auto', options);\n}\n","/**\n * LangChain 中文 ReAct 解析器\n *\n * 为中文大模型提供 LangChain ReAct 格式的输出解析支持\n * 支持:通义千问、ChatGLM、百川、智谱GLM、文心一言、Minimax 等主流中文模型\n *\n * @author langchain-react-chinese-parser\n * @version 1.0.0\n */\n\n// 类型定义\nexport type {\n ActionMatch,\n ChineseModelType,\n IChineseReActParser,\n KeywordMapping,\n LanguageKeywords,\n ModelParserConfig,\n ParseResult,\n ParserOptions,\n} from './types.js';\n\n// 基础解析器\nexport { BaseChineseReActParser } from './base/BaseChineseReActParser.js';\n\n// 具体模型解析器\nexport { BaichuanReActOutputParser } from './parsers/BaichuanReActOutputParser.js';\nexport { ChatGLMReActOutputParser } from './parsers/ChatGLMReActOutputParser.js';\nexport { ERNIEReActOutputParser } from './parsers/ERNIEReActOutputParser.js';\nexport { QwenReActOutputParser } from './parsers/QwenReActOutputParser.js';\n\n// 工厂类和便捷函数\nexport {\n ChineseReActParserFactory,\n createAutoParser,\n createBaichuanParser,\n createChatGLMParser,\n createChineseReActParser,\n createERNIEParser,\n createQwenParser,\n} from './factory.js';\n\n// 默认导出:便捷的创建函数\nexport { createChineseReActParser as default } from './factory.js';\n\n/**\n * 包版本信息\n */\nexport const VERSION = '1.0.0';\n\n/**\n * 支持的模型列表\n */\nexport const SUPPORTED_MODELS = [\n 'qwen', // 通义千问\n 'chatglm', // ChatGLM\n 'baichuan', // 百川\n 'glm', // 智谱GLM\n 'ernie', // 文心一言\n 'minimax', // Minimax\n 'auto', // 自动识别\n] as const;\n\n/**\n * 快速开始示例\n *\n * @example\n * ```typescript\n * import { createChineseReActParser } from 'langchain-react-chinese-parser';\n *\n * // 创建通义千问解析器\n * const parser = createChineseReActParser('qwen', { debug: true });\n *\n * // 解析模型输出\n * const result = await parser.parse(`\n * 思考: 我需要搜索相关信息\n * 动作: search\n * 动作输入: 北京天气\n * `);\n *\n * console.log(result.tool); // 'search'\n * console.log(result.toolInput); // '北京天气'\n * ```\n */\n\n/**\n * 模型对比表\n *\n * | 模型 | 推荐关键字 | 特殊格式支持 | 兼容性 |\n * |--------------|----------------------|--------------------------------|--------|\n * | 通义千问 | 思考/动作/动作输入 | \"我将使用...\" | ⭐⭐⭐⭐⭐ |\n * | ChatGLM | 思考/工具/工具输入 | \"调用[工具],参数为...\" | ⭐⭐⭐⭐⭐ |\n * | 百川 | 思考/工具/工具输入 | \"使用[工具]工具,输入...\" | ⭐⭐⭐⭐ |\n * | 智谱GLM | 思考/工具/工具输入 | 同 ChatGLM | ⭐⭐⭐⭐ |\n * | 文心一言 | 思考/调用工具/输入 | \"我需要调用[工具]来...\" | ⭐⭐⭐⭐ |\n * | Minimax | 思考/动作/动作输入 | 同通义千问 | ⭐⭐⭐ |\n * | 自动识别 | 支持所有上述格式 | 智能识别,自动匹配 | ⭐⭐⭐⭐⭐ |\n */\n"],"mappings":"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","names":["BaseOutputParser","BaseOutputParser"]}