要約で長期メモリに移したメッセージをDBから物理削除していたため、
一度要約されると人間も内容を確認できなくなっていた。削除をやめ、
messages に archived_at(要約に取り込まれた時刻)と memory_id
(どの要約に取り込まれたか)を持たせる。
モデルからは従来どおり見えない:
- get_context_messages() がアーカイブ済みを除外する
- maybe_summarize() の閾値判定も現役メッセージだけを数える
(ここを除外し忘れると件数が減らず再要約が繰り返される)
- backfill_tags() もアーカイブ済みは対象外にする
人間からは確認できる:
- GET /chat/sessions/{id}/messages がアーカイブ済みも archived_at
付きで返す。export/import もアーカイブ状態を保持する
- チャット画面では半透明で表示し、最後のアーカイブ済みメッセージの
直後に「ここから先がモデルに渡る」区切り線を出す
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
from sqlalchemy import create_engine, text
|
|
from sqlalchemy.orm import sessionmaker, DeclarativeBase
|
|
from app.core.config import DATABASE_URL
|
|
|
|
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
|
|
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
|
|
|
|
|
class Base(DeclarativeBase):
|
|
pass
|
|
|
|
|
|
def get_db():
|
|
db = SessionLocal()
|
|
try:
|
|
yield db
|
|
finally:
|
|
db.close()
|
|
|
|
|
|
# 既存DBに後から追加されたカラム: (テーブル名, カラム名, 型)
|
|
_ADDED_COLUMNS = [
|
|
("note_pages", "section", "VARCHAR"),
|
|
("knowledge_entries", "headline", "VARCHAR"),
|
|
("messages", "archived_at", "DATETIME"),
|
|
("messages", "memory_id", "INTEGER"),
|
|
]
|
|
|
|
|
|
def _add_missing_columns() -> None:
|
|
"""マイグレーションフレームワークを使っていないため、既存DBに後から追加されたカラムを
|
|
ここで簡易的に補う。create_all() は既存テーブルへのカラム追加は行わないので必要。"""
|
|
with engine.connect() as conn:
|
|
for table, column, column_type in _ADDED_COLUMNS:
|
|
existing = {row[1] for row in conn.execute(text(f"PRAGMA table_info({table})"))}
|
|
if existing and column not in existing:
|
|
conn.execute(text(f"ALTER TABLE {table} ADD COLUMN {column} {column_type}"))
|
|
conn.commit()
|
|
|
|
|
|
def init_db():
|
|
from app.db import models # noqa: F401
|
|
Base.metadata.create_all(bind=engine)
|
|
_add_missing_columns()
|