base.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. """所有记忆系统必须遵守的统一接口。"""
  12. id: str
  13. descriptor: SystemDescriptor
  14. def __init__(self) -> None:
  15. self.repo = repository
  16. self.llm = llm
  17. @property
  18. def status(self) -> SystemDescriptor:
  19. return self.descriptor
  20. async def memories(self, query: str | None = None) -> list[MemoryItem]:
  21. return await self.repo.list_memories(self.id, query)
  22. async def audit(self) -> list[AuditEvent]:
  23. return await self.repo.list_audit(self.id)
  24. async def reset(self) -> None:
  25. await self.repo.reset(self.id)
  26. async def delete_memory(self, memory_id: str) -> bool:
  27. """删除记忆时同步清理向量和记录审计。"""
  28. deleted = await self.repo.delete_memory(self.id, memory_id)
  29. if deleted:
  30. await self.repo.delete_embedding(self.id, memory_id)
  31. await self._audit("DELETE/Memory", target=memory_id)
  32. return deleted
  33. async def _audit(
  34. self,
  35. operation: str,
  36. target: str | None = None,
  37. status: str = "ok",
  38. details: dict[str, Any] | None = None,
  39. ) -> AuditEvent:
  40. """写入一条适配器操作记录。"""
  41. event = AuditEvent(
  42. id=self.repo.memory_id("audit"),
  43. system=self.id,
  44. workspace_id=settings.workspace_id,
  45. operation=operation,
  46. target=target,
  47. status=status,
  48. details=details or {},
  49. created_at=utcnow(),
  50. )
  51. return await self.repo.add_audit(event)
  52. @abstractmethod
  53. async def chat(self, message: str) -> ChatResponse:
  54. raise NotImplementedError