pub struct FileBasedStorage { /* private fields */ }Expand description
基于文件的持久化存储
文件结构:
memory/
├── data.json # KV 存储 (MemoryValue items)
├── MEMORY.md # 长期记忆
├── sessions/ # 会话历史
│ ├── <session_id>.json # 单个会话的消息历史
├── 2024-01-15.md # 每日笔记 (YYYY-MM-DD.md)
└── ...§特性
- 持久化到磁盘
- 线程安全 (Arc<RwLock
>) - 原子文件写入 (临时文件 + rename)
- 懒加载 (启动时从文件加载到内存)
Implementations§
Source§impl FileBasedStorage
impl FileBasedStorage
Sourcepub async fn new(
base_dir: impl AsRef<Path>,
) -> Result<FileBasedStorage, AgentError>
pub async fn new( base_dir: impl AsRef<Path>, ) -> Result<FileBasedStorage, AgentError>
Sourcepub async fn read_today_file(&self) -> Result<String, AgentError>
pub async fn read_today_file(&self) -> Result<String, AgentError>
读取今日笔记内容
Sourcepub async fn append_today_file(&self, content: &str) -> Result<(), AgentError>
pub async fn append_today_file(&self, content: &str) -> Result<(), AgentError>
追加内容到今日笔记
Sourcepub async fn read_long_term_file(&self) -> Result<String, AgentError>
pub async fn read_long_term_file(&self) -> Result<String, AgentError>
读取长期记忆 (MEMORY.md)
Sourcepub async fn write_long_term_file(
&self,
content: &str,
) -> Result<(), AgentError>
pub async fn write_long_term_file( &self, content: &str, ) -> Result<(), AgentError>
写入长期记忆 (MEMORY.md)
Sourcepub async fn get_recent_memories_files(
&self,
days: u32,
) -> Result<String, AgentError>
pub async fn get_recent_memories_files( &self, days: u32, ) -> Result<String, AgentError>
获取最近 N 天的记忆
Sourcepub async fn get_memory_context(&self) -> Result<String, AgentError>
pub async fn get_memory_context(&self) -> Result<String, AgentError>
获取记忆上下文
Sourcepub async fn read_today(&self) -> Result<String, AgentError>
pub async fn read_today(&self) -> Result<String, AgentError>
读取今日笔记
Sourcepub async fn append_today(&self, content: &str) -> Result<(), AgentError>
pub async fn append_today(&self, content: &str) -> Result<(), AgentError>
追加今日笔记
Sourcepub async fn read_long_term(&self) -> Result<String, AgentError>
pub async fn read_long_term(&self) -> Result<String, AgentError>
读取长期记忆
Sourcepub async fn write_long_term(&self, content: &str) -> Result<(), AgentError>
pub async fn write_long_term(&self, content: &str) -> Result<(), AgentError>
写入长期记忆
Sourcepub async fn get_recent_memories(&self, days: u32) -> Result<String, AgentError>
pub async fn get_recent_memories(&self, days: u32) -> Result<String, AgentError>
获取最近记忆
Trait Implementations§
Source§impl Memory for FileBasedStorage
impl Memory for FileBasedStorage
Source§fn store<'life0, 'life1, 'async_trait>(
&'life0 mut self,
key: &'life1 str,
value: MemoryValue,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
FileBasedStorage: 'async_trait,
fn store<'life0, 'life1, 'async_trait>(
&'life0 mut self,
key: &'life1 str,
value: MemoryValue,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
FileBasedStorage: 'async_trait,
存储记忆项
Source§fn retrieve<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<MemoryValue>, AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
FileBasedStorage: 'async_trait,
fn retrieve<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<MemoryValue>, AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
FileBasedStorage: 'async_trait,
检索记忆项
Source§fn remove<'life0, 'life1, 'async_trait>(
&'life0 mut self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool, AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
FileBasedStorage: 'async_trait,
fn remove<'life0, 'life1, 'async_trait>(
&'life0 mut self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool, AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
FileBasedStorage: 'async_trait,
删除记忆项
Source§fn search<'life0, 'life1, 'async_trait>(
&'life0 self,
query: &'life1 str,
limit: usize,
) -> Pin<Box<dyn Future<Output = Result<Vec<MemoryItem>, AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
FileBasedStorage: 'async_trait,
fn search<'life0, 'life1, 'async_trait>(
&'life0 self,
query: &'life1 str,
limit: usize,
) -> Pin<Box<dyn Future<Output = Result<Vec<MemoryItem>, AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
FileBasedStorage: 'async_trait,
语义搜索
Source§fn clear<'life0, 'async_trait>(
&'life0 mut self,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
FileBasedStorage: 'async_trait,
fn clear<'life0, 'async_trait>(
&'life0 mut self,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
FileBasedStorage: 'async_trait,
清空所有记忆
Source§fn get_history<'life0, 'life1, 'async_trait>(
&'life0 self,
session_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<Message>, AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
FileBasedStorage: 'async_trait,
fn get_history<'life0, 'life1, 'async_trait>(
&'life0 self,
session_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<Message>, AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
FileBasedStorage: 'async_trait,
获取对话历史
Source§fn add_to_history<'life0, 'life1, 'async_trait>(
&'life0 mut self,
session_id: &'life1 str,
message: Message,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
FileBasedStorage: 'async_trait,
fn add_to_history<'life0, 'life1, 'async_trait>(
&'life0 mut self,
session_id: &'life1 str,
message: Message,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
FileBasedStorage: 'async_trait,
添加对话消息
Source§fn clear_history<'life0, 'life1, 'async_trait>(
&'life0 mut self,
session_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
FileBasedStorage: 'async_trait,
fn clear_history<'life0, 'life1, 'async_trait>(
&'life0 mut self,
session_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<(), AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
FileBasedStorage: 'async_trait,
清空对话历史
Source§fn stats<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<MemoryStats, AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
FileBasedStorage: 'async_trait,
fn stats<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<MemoryStats, AgentError>> + Send + 'async_trait>>where
'life0: 'async_trait,
FileBasedStorage: 'async_trait,
获取记忆统计
Source§fn memory_type(&self) -> &str
fn memory_type(&self) -> &str
记忆类型名称
Auto Trait Implementations§
impl Freeze for FileBasedStorage
impl !RefUnwindSafe for FileBasedStorage
impl Send for FileBasedStorage
impl Sync for FileBasedStorage
impl Unpin for FileBasedStorage
impl UnsafeUnpin for FileBasedStorage
impl !UnwindSafe for FileBasedStorage
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Message for T
impl<T> Message for T
Source§fn from_boxed(m: BoxedMessage) -> Result<Self, BoxedDowncastErr>
fn from_boxed(m: BoxedMessage) -> Result<Self, BoxedDowncastErr>
Convert a BoxedMessage to this concrete type
Source§fn box_message(self, pid: &ActorId) -> Result<BoxedMessage, BoxedDowncastErr>
fn box_message(self, pid: &ActorId) -> Result<BoxedMessage, BoxedDowncastErr>
Convert this message to a BoxedMessage