use langchainrust::sessions::{MemorySessionStore, SessionManager};
use langchainrust::{ConversationBufferWindowMemory, MessageType, OpenAIChat, OpenAIConfig};
use std::sync::Arc;
use tokio::sync::Mutex;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let api_key = std::env::var("OPENAI_API_KEY").expect("请设置 OPENAI_API_KEY 环境变量");
let base_url = std::env::var("OPENAI_BASE_URL")
.unwrap_or_else(|_| "https://api.openai.com/v1".to_string());
let llm = OpenAIChat::new(OpenAIConfig {
api_key,
base_url,
model: "gpt-4o-mini".to_string(),
..Default::default()
});
let memory = ConversationBufferWindowMemory::new(3);
let manager = SessionManager::new(Arc::new(MemorySessionStore::new()))
.with_memory(Arc::new(Mutex::new(memory)));
let id = manager.create_session().await?;
println!("会话已创建: {id}\n");
let questions = [
"请记住我叫张三。",
"我刚才让你记住的名字是什么?",
"上一轮我提到的人叫什么?",
];
for (i, question) in questions.iter().enumerate() {
println!("用户({}): {}", i + 1, question);
let reply = manager.chat(&id, &llm, question.to_string()).await?;
println!("AI: {}\n", reply);
}
let history = manager.history(&id).await?;
println!("会话历史共 {} 条消息:", history.len());
for msg in &history {
let role = match msg.message_type {
MessageType::Human => "Human",
MessageType::AI => "AI",
MessageType::System => "System",
MessageType::Tool { .. } => "Tool",
};
println!(" [{role}] {}", msg.content);
}
Ok(())
}