Added some comands to manipulate memory

This commit is contained in:
2026-07-24 21:36:27 +03:00
parent d1e9a8e934
commit d6b68929ca
+62 -29
View File
@@ -80,6 +80,25 @@ async fn init_db(db_url: &str) -> Result<Pool<Sqlite>, Box<dyn std::error::Error
Ok(pool)
}
async fn clear_session_data(pool: &Pool<Sqlite>, session_id: &str) -> Result<(), sqlx::Error> {
let mut tx = pool.begin().await?;
// Удаляем сообщения сессии
sqlx::query("DELETE FROM messages WHERE session_id = ?")
.bind(session_id)
.execute(&mut *tx)
.await?;
// Удаляем сжатую память (summary)
sqlx::query("DELETE FROM session_summaries WHERE session_id = ?")
.bind(session_id)
.execute(&mut *tx)
.await?;
tx.commit().await?;
Ok(())
}
async fn summarize_context(
client: &reqwest::Client,
api_url: &str,
@@ -118,8 +137,8 @@ async fn summarize_context(
- Сохраняй ТОЛЬКО то, что сообщил сам Пользователь, либо явные решения/итоги, к которым пришли.
- Пиши максимально кратко, сжато, в виде маркированного списка.
- Если новые сообщения не содержат новых фактов о пользователе или его задаче — оставь существующую память без изменений.
НЕ ЗАПИСЫВАЙ:
НЕ ЗАПИСЫВАЙ:
О чем пользователь спрашивал или интересовался (например: НЕ пиши "Спрашивал про точки Лагранжа" или "Интересуется столицами"). Записывай только утвердительные факты о самом пользователе или данные.
"#,
);
@@ -317,7 +336,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!(" History: последние {} сообщений", history_limit);
println!(" Config: {}", args.config);
println!("==================================================");
println!("Введите сообщение. Служебные команды: /summary, /clear, exit\n");
println!("Введите сообщение. Служебные команды: /summary, /flush, /help, /exit\n");
let stdin = tokio::io::stdin();
let mut reader = BufReader::new(stdin);
@@ -339,33 +358,47 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
continue;
}
// --- Служебные команды CLI ---
if trimmed_input.eq_ignore_ascii_case("exit") || trimmed_input.eq_ignore_ascii_case("quit")
{
println!("Завершение работы.");
break;
}
if trimmed_input == "/summary" {
match get_session_summary(&db_pool, &session_id).await {
Ok(Some(s)) => println!("\n[Текущий Summary]:\n{}\n", s),
Ok(None) => println!("\n[Текущий Summary]: (пусто)\n"),
Err(e) => eprintln!("[Ошибка чтения summary]: {}\n", e),
// Обработка встроенных команд
if trimmed_input.starts_with('/') {
match trimmed_input {
"/flush" => {
if let Err(e) = clear_session_data(&db_pool, &session_id).await {
println!("[System]: Ошибка при очистке базы: {}", e);
} else {
println!("[System]: История диалога и память сессии успешно очищены.");
}
continue;
}
"/summary" => {
match get_session_summary(&db_pool, &session_id).await {
Ok(Some(summary)) => println!(
"\n--- ТЕКУЩАЯ ПАМЯТЬ СЕССИИ ---\n{}\n-----------------------------",
summary
),
Ok(None) => println!("[System]: Память сессии пока пуста."),
Err(e) => println!("[System]: Ошибка при получении summary: {}", e),
}
continue;
}
"/help" => {
println!("\n--- ДОСТУПНЫЕ КОМАНДЫ ---");
println!(" /help - Показать это справочное сообщение");
println!(" /summary - Посмотреть текущую сжатую память (профиль)");
println!(" /flush - Полностью очистить историю и память сессии");
println!(" /exit - Завершить работу агента");
println!(" /quit - Завершить работу агента");
println!("-------------------------\n");
continue;
}
"/exit" | "/quit" => {
println!("[System]: Завершение сеанса. До связи!");
break;
}
_ => {
println!("[System]: Неизвестная команда. Введите /help для списка команд.");
continue;
}
}
continue;
}
if trimmed_input == "/clear" {
let _ = sqlx::query("DELETE FROM messages WHERE session_id = ?")
.bind(&session_id)
.execute(&db_pool)
.await;
let _ = sqlx::query("DELETE FROM session_summaries WHERE session_id = ?")
.bind(&session_id)
.execute(&db_pool)
.await;
println!("\n[Память сессии '{}' очищена]\n", session_id);
continue;
}
// 1. Сохраняем запрос юзера в историю
@@ -438,4 +471,4 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
}
Ok(())
}
}