45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
"""Инжект системных оповещений в чат без role=assistant (не ломает LLM-историю)."""
|
|
|
|
from sqlalchemy import select
|
|
|
|
from app.db.base import SessionLocal
|
|
from app.db.models import ChatSession, Message
|
|
|
|
DISPLAY_ONLY_ROLES = frozenset({"notice", "character"})
|
|
|
|
|
|
def _latest_chat_session(db) -> ChatSession:
|
|
session = db.scalar(
|
|
select(ChatSession).order_by(ChatSession.updated_at.desc()).limit(1)
|
|
)
|
|
if not session:
|
|
session = ChatSession(title="Уведомления")
|
|
db.add(session)
|
|
db.commit()
|
|
db.refresh(session)
|
|
return session
|
|
|
|
|
|
def post_notice_to_latest_chat(content: str) -> int | None:
|
|
"""Сохраняет notice в последний активный чат. Возвращает session_id."""
|
|
db = SessionLocal()
|
|
try:
|
|
session = _latest_chat_session(db)
|
|
db.add(Message(session_id=session.id, role="notice", content=content))
|
|
db.commit()
|
|
return session.id
|
|
finally:
|
|
db.close()
|
|
|
|
|
|
def post_character_comment_to_latest_chat(content: str) -> int | None:
|
|
"""Реплика персонажа в UI; не попадает в контекст LLM (в отличие от assistant)."""
|
|
db = SessionLocal()
|
|
try:
|
|
session = _latest_chat_session(db)
|
|
db.add(Message(session_id=session.id, role="character", content=content))
|
|
db.commit()
|
|
return session.id
|
|
finally:
|
|
db.close()
|