Skip to main content

lc_core/output_parsers/
base.rs

1use async_trait::async_trait;
2
3/// 输出解析器的统一错误类型
4#[derive(Debug, Clone, thiserror::Error)]
5pub enum OutputParserError {
6    /// 解析失败:输入格式不符合预期
7    #[error("Parse error: {0}")]
8    ParseError(String),
9    /// JSON 格式错误
10    #[error("JSON error: {0}")]
11    JsonError(String),
12    /// 类型转换错误
13    #[error("Type error: {0}")]
14    TypeError(String),
15    /// 自定义错误
16    #[error("{0}")]
17    Custom(String),
18}
19
20impl From<serde_json::Error> for OutputParserError {
21    fn from(e: serde_json::Error) -> Self {
22        OutputParserError::JsonError(e.to_string())
23    }
24}
25
26/// 输出解析器的结果类型
27pub type OutputParserResult<T> = Result<T, OutputParserError>;
28
29/// 输出解析器的核心 trait
30///
31/// 所有输出解析器必须实现此 trait。
32/// 与 `Runnable` 不同,`parse` 不接收 config 参数,
33/// 适合在 Runnable 内部调用。
34#[async_trait]
35pub trait BaseOutputParser<Output: Send + Sync + 'static>: Send + Sync {
36    /// 将原始 LLM 输出文本解析为目标类型
37    async fn parse(&self, text: &str) -> OutputParserResult<Output>;
38
39    /// 带重试的解析(默认实现:真正重试 `max_retries` 次)
40    ///
41    /// 对同一份文本反复调用 [`parse`](Self::parse),最多尝试
42    /// `max_retries + 1` 次。重试同一份文本只对非确定性解析(例如内部
43    /// 依赖网络/外部服务的解析器)有意义;确定性解析器首次失败后必然
44    /// 重复失败,最终返回最后一次错误。需要基于失败原因修正输入的
45    /// 解析器应覆写此方法。
46    async fn parse_with_retry(&self, text: &str, max_retries: usize) -> OutputParserResult<Output> {
47        let mut last_err = None;
48        for _ in 0..=max_retries {
49            match self.parse(text).await {
50                Ok(output) => return Ok(output),
51                Err(e) => last_err = Some(e),
52            }
53        }
54        Err(last_err.expect("at least one parse attempt was made"))
55    }
56
57    /// 获取格式指令(用于提示 LLM 按指定格式输出)
58    fn get_format_instructions(&self) -> String {
59        String::new()
60    }
61}