base.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from __future__ import annotations
  2. from abc import ABC, abstractmethod
  3. from typing import Any
  4. from ..config import settings
  5. from ..db import repository, utcnow
  6. from ..llm import llm
  7. from ..schemas import AuditEvent, ChatResponse, MemoryItem, SystemDescriptor
  8. class AdapterUnavailable(RuntimeError):
  9. pass
  10. class MemoryAgent(ABC):
  11. id: str
  12. descriptor: SystemDescriptor
  13. def __init__(self) -> None:
  14. self.repo = repository
  15. self.llm = llm
  16. @property
  17. def status(self) -> SystemDescriptor:
  18. return self.descriptor
  19. async def memories(self, query: str | None = None) -> list[MemoryItem]:
  20. return await self.repo.list_memories(self.id, query)
  21. async def audit(self) -> list[AuditEvent]:
  22. return await self.repo.list_audit(self.id)
  23. async def reset(self) -> None:
  24. await self.repo.reset(self.id)
  25. async def delete_memory(self, memory_id: str) -> bool:
  26. deleted = await self.repo.delete_memory(self.id, memory_id)
  27. if deleted:
  28. await self.repo.delete_embedding(self.id, memory_id)
  29. await self._audit("DELETE/Memory", target=memory_id)
  30. return deleted
  31. async def _audit(
  32. self,
  33. operation: str,
  34. target: str | None = None,
  35. status: str = "ok",
  36. details: dict[str, Any] | None = None,
  37. ) -> AuditEvent:
  38. event = AuditEvent(
  39. id=self.repo.memory_id("audit"),
  40. system=self.id,
  41. workspace_id=settings.workspace_id,
  42. operation=operation,
  43. target=target,
  44. status=status,
  45. details=details or {},
  46. created_at=utcnow(),
  47. )
  48. return await self.repo.add_audit(event)
  49. @abstractmethod
  50. async def chat(self, message: str) -> ChatResponse:
  51. raise NotImplementedError