Archive summarized messages instead of deleting them
要約で長期メモリに移したメッセージを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>
This commit is contained in:
@@ -42,6 +42,8 @@ class MessageResponse(BaseModel):
|
||||
role: str
|
||||
content: str
|
||||
created_at: datetime
|
||||
# 要約に取り込まれ、LLMには渡らなくなったメッセージ。人間の履歴確認用に残してある。
|
||||
archived_at: datetime | None = None
|
||||
tags: list[str] = []
|
||||
|
||||
class Config:
|
||||
@@ -52,6 +54,7 @@ class ImportMessage(BaseModel):
|
||||
role: str
|
||||
content: str
|
||||
created_at: datetime | None = None
|
||||
archived_at: datetime | None = None
|
||||
tags: list[str] = []
|
||||
|
||||
|
||||
@@ -83,6 +86,7 @@ def get_messages(session_id: str, db: DBSession = Depends(get_db)):
|
||||
role=m.role,
|
||||
content=m.content,
|
||||
created_at=m.created_at,
|
||||
archived_at=m.archived_at,
|
||||
tags=[t.tag for t in m.tags],
|
||||
)
|
||||
for m in session.messages
|
||||
@@ -110,6 +114,7 @@ def export_session(session_id: str, db: DBSession = Depends(get_db)):
|
||||
"role": m.role,
|
||||
"content": m.content,
|
||||
"created_at": m.created_at.isoformat(),
|
||||
"archived_at": m.archived_at.isoformat() if m.archived_at else None,
|
||||
"tags": [t.tag for t in m.tags],
|
||||
}
|
||||
for m in session.messages
|
||||
@@ -143,7 +148,7 @@ def import_session(req: ImportRequest, db: DBSession = Depends(get_db)):
|
||||
db.flush()
|
||||
|
||||
for m in req.messages:
|
||||
msg = Message(session_id=session.id, role=m.role, content=m.content)
|
||||
msg = Message(session_id=session.id, role=m.role, content=m.content, archived_at=m.archived_at)
|
||||
if m.created_at:
|
||||
msg.created_at = m.created_at
|
||||
db.add(msg)
|
||||
|
||||
Reference in New Issue
Block a user