langchainrust/core/runnables/runnable_trait.rs
1// src/core/runnables/runnable_trait.rs
2//! Runnable trait - LCEL (LangChain Expression Language) 的基础
3//!
4//! LangChain 中的每个组件都实现 Runnable,使它们可以
5//! 链式调用、组合和互操作。
6
7use async_trait::async_trait;
8use futures_util::Stream;
9use std::pin::Pin;
10use super::RunnableConfig;
11
12/// LangChain 所有组件的基础 trait
13///
14/// 这个 trait 定义了每个组件必须实现的核心接口:
15/// - 单次执行 via `invoke`
16/// - 批量处理 via `batch`
17/// - 流式输出 via `stream`
18///
19/// # 示例
20/// ```rust
21/// use langchainrust::core::runnables::Runnable;
22/// use langchainrust::RunnableConfig;
23/// use async_trait::async_trait;
24///
25/// // 定义一个简单的 Runnable:加一
26/// struct AddOne;
27///
28/// #[async_trait]
29/// impl Runnable<i32, i32> for AddOne {
30/// type Error = std::convert::Infallible;
31///
32/// async fn invoke(&self, input: i32, _config: Option<RunnableConfig>) -> Result<i32, Self::Error> {
33/// Ok(input + 1)
34/// }
35/// }
36/// ```
37#[async_trait]
38pub trait Runnable<Input: Send + Sync + 'static, Output: Send + Sync + 'static>: Send + Sync {
39 /// 错误类型
40 type Error: std::error::Error + Send + Sync + 'static;
41
42 /// 将单个输入转换为输出
43 ///
44 /// 这是单次执行的主要方法。
45 ///
46 /// # 参数
47 /// * `input` - 要处理的输入
48 /// * `config` - 可选的执行配置
49 ///
50 /// # 返回
51 /// * `Result<Output, Self::Error>` - 执行结果
52 async fn invoke(&self, input: Input, config: Option<RunnableConfig>) -> Result<Output, Self::Error>;
53
54 /// 批量处理 - 将多个输入转换为多个输出
55 ///
56 /// 默认实现是顺序处理输入。
57 /// 可以重写此方法以实现并发执行或优化批处理。
58 ///
59 /// # 参数
60 /// * `inputs` - 输入向量
61 /// * `config` - 可选的批处理配置
62 ///
63 /// # 返回
64 /// * `Result<Vec<Output>, Self::Error>` - 结果向量
65 async fn batch(
66 &self,
67 inputs: Vec<Input>,
68 config: Option<RunnableConfig>,
69 ) -> Result<Vec<Output>, Self::Error> {
70 let mut results = Vec::with_capacity(inputs.len());
71
72 // 顺序处理每个输入
73 for input in inputs {
74 let result = self.invoke(input, config.clone()).await?;
75 results.push(result);
76 }
77
78 Ok(results)
79 }
80
81 /// 流式输出 - 用于流式响应 (LLM 等)
82 ///
83 /// 此方法启用输出的实时流式处理,
84 /// 适用于聊天模型、token 生成等场景。
85 ///
86 /// # 参数
87 /// * `input` - 要处理的输入
88 /// * `config` - 可选配置
89 ///
90 /// # 返回
91 /// * `Result<Pin<Box<dyn Stream<Item = Result<Output, Self::Error>> + Send>>, Self::Error>` - 输出流
92 async fn stream(
93 &self,
94 _input: Input,
95 _config: Option<RunnableConfig>,
96 ) -> Result<Pin<Box<dyn Stream<Item = Result<Output, Self::Error>> + Send>>, Self::Error> {
97 // 默认实现 - 不支持流式
98 // 在支持流式的类型中重写此方法
99 unimplemented!("此 Runnable 不支持流式处理")
100 }
101}