initial_commit

This commit is contained in:
2026-06-01 20:16:53 +09:00
commit 903d34761c
31 changed files with 1123 additions and 0 deletions
View File
+9
View File
@@ -0,0 +1,9 @@
from dotenv import load_dotenv
import os
load_dotenv()
DATABASE_URL: str = os.getenv("DATABASE_URL", "sqlite:///./playchat.db")
DEFAULT_MODEL: str = os.getenv("DEFAULT_MODEL", "gpt-4o")
MEMORY_SUMMARIZE_THRESHOLD: int = int(os.getenv("MEMORY_SUMMARIZE_THRESHOLD", "20"))
CORS_ORIGINS: list[str] = os.getenv("CORS_ORIGINS", "http://localhost:5173").split(",")
+29
View File
@@ -0,0 +1,29 @@
from typing import AsyncIterator
import litellm
from app.core.config import DEFAULT_MODEL
litellm.drop_params = True
async def stream_chat(
messages: list[dict],
model: str | None = None,
) -> AsyncIterator[str]:
response = await litellm.acompletion(
model=model or DEFAULT_MODEL,
messages=messages,
stream=True,
)
async for chunk in response:
delta = chunk.choices[0].delta.content
if delta:
yield delta
async def complete(messages: list[dict], model: str | None = None) -> str:
response = await litellm.acompletion(
model=model or DEFAULT_MODEL,
messages=messages,
stream=False,
)
return response.choices[0].message.content or ""
+44
View File
@@ -0,0 +1,44 @@
from sqlalchemy.orm import Session as DBSession
from app.db.models import Memory, Message, Session
from app.core.config import MEMORY_SUMMARIZE_THRESHOLD
from app.core import llm
def get_context_messages(db: DBSession, session_id: str) -> list[dict]:
"""短期メモリ(最近のメッセージ)と長期メモリ(要約)を結合してコンテキストを返す。"""
memories = db.query(Memory).filter(Memory.session_id == session_id).order_by(Memory.created_at).all()
messages = db.query(Message).filter(Message.session_id == session_id).order_by(Message.created_at).all()
context: list[dict] = []
if memories:
combined_summary = "\n\n".join(m.summary for m in memories)
context.append({
"role": "system",
"content": f"以下はこの会話の過去の要約です:\n\n{combined_summary}",
})
context.extend({"role": m.role, "content": m.content} for m in messages)
return context
async def maybe_summarize(db: DBSession, session: Session) -> None:
"""メッセージ数が閾値を超えたら古いメッセージを要約してMemoryに保存し、元メッセージを削除する。"""
messages = db.query(Message).filter(Message.session_id == session.id).order_by(Message.created_at).all()
if len(messages) < MEMORY_SUMMARIZE_THRESHOLD:
return
# 古いメッセージ(閾値の半分)を要約対象にする
half = MEMORY_SUMMARIZE_THRESHOLD // 2
to_summarize = messages[:half]
summary_prompt = [
{"role": "system", "content": "以下の会話を簡潔に要約してください。重要な事実・決定・文脈を保持してください。"},
*[{"role": m.role, "content": m.content} for m in to_summarize],
]
summary_text = await llm.complete(summary_prompt)
db.add(Memory(session_id=session.id, summary=summary_text))
for msg in to_summarize:
db.delete(msg)
db.commit()