137 lines
3.8 KiB
Python
137 lines
3.8 KiB
Python
# memory/temporary_memory.py
|
|
from typing import Any
|
|
|
|
|
|
class TemporaryMemory:
|
|
"""
|
|
Temporary runtime memory (session-only).
|
|
Resets when program restarts.
|
|
|
|
Purpose:
|
|
- Track multi-step intents
|
|
- Keep short conversation context
|
|
- Store last actions (search / open_app)
|
|
- Support follow-up questions like:
|
|
"why did he executed?"
|
|
"""
|
|
|
|
def __init__(self, max_history: int = 5):
|
|
self.max_history = max_history
|
|
self.reset()
|
|
|
|
|
|
def reset(self):
|
|
self.pending_intent: str | None = None
|
|
self.parameters: dict[str, Any] = {}
|
|
self.current_question: str | None = None
|
|
|
|
self.last_user_text: str | None = None
|
|
self.last_ai_response: str | None = None
|
|
|
|
# --- Action memory ---
|
|
self.last_search: dict | None = None
|
|
self.last_opened_app: str | None = None
|
|
|
|
# --- Conversation ---
|
|
self.conversation_history: list[dict[str, str]] = []
|
|
|
|
|
|
def set_pending_intent(self, intent: str):
|
|
self.pending_intent = intent
|
|
|
|
def clear_pending_intent(self):
|
|
self.pending_intent = None
|
|
self.parameters = {}
|
|
self.current_question = None
|
|
|
|
def has_pending_intent(self) -> bool:
|
|
return self.pending_intent is not None
|
|
|
|
|
|
def update_parameters(self, new_params: dict):
|
|
if not isinstance(new_params, dict):
|
|
return
|
|
for k, v in new_params.items():
|
|
if v not in (None, ""):
|
|
self.parameters[k] = v
|
|
|
|
def get_parameters(self) -> dict:
|
|
return self.parameters.copy()
|
|
|
|
def get_parameter(self, key: str):
|
|
return self.parameters.get(key)
|
|
|
|
def set_current_question(self, param_name: str):
|
|
self.current_question = param_name
|
|
|
|
def get_current_question(self) -> str | None:
|
|
return self.current_question
|
|
|
|
def clear_current_question(self):
|
|
self.current_question = None
|
|
|
|
def set_last_user_text(self, text: str):
|
|
self.last_user_text = text
|
|
self._add_to_history("user", text)
|
|
|
|
def set_last_ai_response(self, text: str):
|
|
self.last_ai_response = text
|
|
self._add_to_history("ai", text)
|
|
|
|
def get_last_user_text(self):
|
|
return self.last_user_text
|
|
|
|
def get_last_ai_response(self):
|
|
return self.last_ai_response
|
|
|
|
|
|
def set_last_search(self, query: str, answer: str):
|
|
self.last_search = {
|
|
"query": query,
|
|
"answer": answer
|
|
}
|
|
|
|
def get_last_search(self):
|
|
return self.last_search
|
|
|
|
def set_open_app(self, app_name: str):
|
|
self.last_opened_app = app_name
|
|
|
|
def get_last_opened_app(self):
|
|
return self.last_opened_app
|
|
|
|
def _add_to_history(self, role: str, text: str):
|
|
if role not in ("user", "ai"):
|
|
return
|
|
|
|
self.conversation_history.append({
|
|
"role": role,
|
|
"text": text
|
|
})
|
|
|
|
if len(self.conversation_history) > self.max_history:
|
|
self.conversation_history.pop(0)
|
|
|
|
def get_history_for_prompt(self) -> str:
|
|
"""
|
|
Returns compact history for LLM prompt.
|
|
"""
|
|
return "\n".join(
|
|
f"{m['role'].capitalize()}: {m['text']}"
|
|
for m in self.conversation_history
|
|
)
|
|
|
|
|
|
def get_context_summary(self) -> dict:
|
|
"""
|
|
Useful for debugging or smarter LLM prompts.
|
|
"""
|
|
return {
|
|
"pending_intent": self.pending_intent,
|
|
"parameters": self.parameters,
|
|
"last_search": self.last_search,
|
|
"last_opened_app": self.last_opened_app,
|
|
"last_user_text": self.last_user_text,
|
|
"last_ai_response": self.last_ai_response,
|
|
}
|