This commit is contained in:
2026-06-09 11:26:28 +03:00
parent 94735fd540
commit 244935e4ac
21 changed files with 886 additions and 15 deletions
+27 -4
View File
@@ -5,9 +5,11 @@ from typing import Any
from sqlalchemy import select
from sqlalchemy.orm import Session
from app.config import get_settings
from app.character.service import CharacterService
from app.chat.notices import format_pomodoro_context, format_pomodoro_notice
from app.db.models import ChatSession, Message
from app.llm.client import LLMClient
from app.pomodoro.service import PomodoroService
from app.tools.registry import TOOL_DEFINITIONS, execute_tool
MAX_TOOL_ROUNDS = 5
@@ -17,7 +19,7 @@ class ChatService:
def __init__(self, db: Session):
self.db = db
self.llm = LLMClient()
self.system_prompt = get_settings().load_system_prompt()
self.character = CharacterService()
def list_sessions(self) -> list[ChatSession]:
stmt = select(ChatSession).order_by(ChatSession.updated_at.desc())
@@ -41,9 +43,21 @@ class ChatService:
self.db.commit()
return True
def _build_system_prompt(self) -> str:
status = PomodoroService(self.db).get_status()
return (
f"{self.character.get_system_prompt()}\n\n"
f"{format_pomodoro_context(status)}"
)
def _build_messages(self, session: ChatSession) -> list[dict[str, Any]]:
messages: list[dict[str, Any]] = [{"role": "system", "content": self.system_prompt}]
messages: list[dict[str, Any]] = [
{"role": "system", "content": self._build_system_prompt()}
]
for msg in session.messages:
if msg.role == "notice":
continue
content = msg.content or None
entry: dict[str, Any] = {"role": msg.role, "content": content}
if msg.tool_calls_json:
@@ -123,7 +137,16 @@ class ChatService:
}
messages.append(tool_message)
self._save_message(session_id, "tool", result, tool_call_id=tool_call["id"])
yield self._sse("tool", {"name": fn["name"], "result": json.loads(result)})
notice = format_pomodoro_notice(fn["name"], result)
if notice:
self._save_message(session_id, "notice", notice)
yield self._sse("notice", {"content": notice})
yield self._sse(
"pomodoro",
{"name": fn["name"], "result": json.loads(result)},
)
continue