31 lines
1.0 KiB
Python
31 lines
1.0 KiB
Python
"""会话与消息入库;仅存 public 可见内容,隔离内部信息。"""
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.models import ChatSession, Message
|
|
|
|
|
|
async def get_or_create_session(
|
|
db: AsyncSession,
|
|
external_user_id: str,
|
|
external_name: str | None = None,
|
|
) -> ChatSession:
|
|
r = await db.execute(select(ChatSession).where(ChatSession.external_user_id == external_user_id))
|
|
row = r.scalar_one_or_none()
|
|
if row:
|
|
if external_name is not None and row.external_name != external_name:
|
|
row.external_name = external_name
|
|
await db.flush()
|
|
return row
|
|
session = ChatSession(external_user_id=external_user_id, external_name=external_name or None)
|
|
db.add(session)
|
|
await db.flush()
|
|
return session
|
|
|
|
|
|
async def add_message(db: AsyncSession, session_id: int, role: str, content: str) -> Message:
|
|
msg = Message(session_id=session_id, role=role, content=content)
|
|
db.add(msg)
|
|
await db.flush()
|
|
return msg
|