Added some comands to manipulate memory
This commit is contained in:
+58
-25
@@ -80,6 +80,25 @@ async fn init_db(db_url: &str) -> Result<Pool<Sqlite>, Box<dyn std::error::Error
|
|||||||
Ok(pool)
|
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(
|
async fn summarize_context(
|
||||||
client: &reqwest::Client,
|
client: &reqwest::Client,
|
||||||
api_url: &str,
|
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!(" History: последние {} сообщений", history_limit);
|
||||||
println!(" Config: {}", args.config);
|
println!(" Config: {}", args.config);
|
||||||
println!("==================================================");
|
println!("==================================================");
|
||||||
println!("Введите сообщение. Служебные команды: /summary, /clear, exit\n");
|
println!("Введите сообщение. Служебные команды: /summary, /flush, /help, /exit\n");
|
||||||
|
|
||||||
let stdin = tokio::io::stdin();
|
let stdin = tokio::io::stdin();
|
||||||
let mut reader = BufReader::new(stdin);
|
let mut reader = BufReader::new(stdin);
|
||||||
@@ -339,33 +358,47 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Служебные команды CLI ---
|
// Обработка встроенных команд
|
||||||
if trimmed_input.eq_ignore_ascii_case("exit") || trimmed_input.eq_ignore_ascii_case("quit")
|
if trimmed_input.starts_with('/') {
|
||||||
{
|
match trimmed_input {
|
||||||
println!("Завершение работы.");
|
"/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;
|
break;
|
||||||
}
|
}
|
||||||
|
_ => {
|
||||||
if trimmed_input == "/summary" {
|
println!("[System]: Неизвестная команда. Введите /help для списка команд.");
|
||||||
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),
|
|
||||||
}
|
|
||||||
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. Сохраняем запрос юзера в историю
|
// 1. Сохраняем запрос юзера в историю
|
||||||
|
|||||||
Reference in New Issue
Block a user