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:
@@ -26,6 +26,13 @@ class Message(Base):
|
||||
role: Mapped[str] = mapped_column(String) # "user" | "assistant" | "system"
|
||||
content: Mapped[str] = mapped_column(Text)
|
||||
created_at: Mapped[datetime] = mapped_column(UtcDateTime, default=lambda: datetime.now(timezone.utc))
|
||||
# 要約されて長期メモリに移ったメッセージ。LLMに渡すコンテキストからは外れるが、
|
||||
# 人間が後から履歴を確認できるようDBには残す(app.core.memory_kb.memory.maybe_summarize を参照)。
|
||||
archived_at: Mapped[datetime | None] = mapped_column(UtcDateTime, nullable=True)
|
||||
# どの要約に取り込まれたか。要約を削除してもメッセージ自体は残す(SET NULL)。
|
||||
memory_id: Mapped[int | None] = mapped_column(
|
||||
ForeignKey("memories.id", ondelete="SET NULL"), nullable=True,
|
||||
)
|
||||
|
||||
session: Mapped["Session"] = relationship(back_populates="messages")
|
||||
tags: Mapped[list["MessageTag"]] = relationship(back_populates="message", cascade="all, delete-orphan")
|
||||
|
||||
Reference in New Issue
Block a user