"""记忆数据访问。""" from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession from app.models.memory import Memory async def get_memory(session: AsyncSession, memory_id: str) -> Memory | None: return await session.get(Memory, memory_id) async def list_memories( session: AsyncSession, character_id: str, *, memory_type: str | None = None, source: str | None = None, page: int, page_size: int, active_only: bool = True, ) -> tuple[list[Memory], int]: conditions = [Memory.character_id == character_id] if active_only: conditions.append(Memory.status == "active") conditions.append(Memory.deleted_at.is_(None)) if memory_type is not None: conditions.append(Memory.type == memory_type) if source is not None: conditions.append(Memory.source == source) total_result = await session.execute( select(func.count()).select_from(Memory).where(*conditions) ) total = int(total_result.scalar_one()) result = await session.execute( select(Memory) .where(*conditions) .order_by(Memory.importance.desc(), Memory.updated_at.desc()) .offset((page - 1) * page_size) .limit(page_size) ) return list(result.scalars().all()), total async def list_injectable_memories( session: AsyncSession, character_id: str, *, limit: int ) -> list[Memory]: result = await session.execute( select(Memory) .where( Memory.character_id == character_id, Memory.status == "active", Memory.deleted_at.is_(None), ) .order_by(Memory.importance.desc(), Memory.updated_at.desc()) .limit(limit) ) return list(result.scalars().all()) async def get_memories_by_ids( session: AsyncSession, memory_ids: list[str] ) -> list[Memory]: """按 ID 列表批量获取记忆(按重要性降序排序,而非 ID 传入顺序)。""" result = await session.execute( select(Memory).where( Memory.id.in_(memory_ids), Memory.status == "active", Memory.deleted_at.is_(None), ) .order_by(Memory.importance.desc(), Memory.updated_at.desc()) ) return list(result.scalars().all())