/
ksilisk
/
spbtechrun_hack
Обзор
Документация
Войти
/
ksilisk
/
spbtechrun_hack
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
python/backend/core/profile/profile.py
54 строки
2 KB
Shaliko Salimov
user profile support
12 дек 2025, 21:13
12 дек 2025, 21:13
16730d4
Код
Авторство
О чём код?
import json import logging from langchain_core.language_models import BaseChatModel from langchain_core.messages import SystemMessage, HumanMessage from core.dialog.postgres_session_store import PostgresSessionStore from core.prompt.prompt_store import PromptStore from schemas.profile import UserProfile, InteractionResult _USER_PROFILE_PROMPT = "user_profile.yaml" class ProfileService: def __init__(self, llm: BaseChatModel, prompt_store: PromptStore, postgres_session_store: PostgresSessionStore, logger: logging.Logger) -> None: self._llm = llm self._prompt_store = prompt_store self._postgres_session_store = postgres_session_store self._logger = logger async def get_profile(self, user_id: int) -> UserProfile | None: return await self._postgres_session_store.get_profile(user_id) async def save_profile(self, profile: UserProfile, user_id: int) -> None: return await self._postgres_session_store.update_profile(profile, user_id) async def update_after_answer(self, interaction: InteractionResult): current = await self.get_profile(interaction.user_id) if current is None: current = UserProfile(has_kids="", prefers_free="", district="", address="") updated = await self._update_with_llm(current, interaction) await self.save_profile(updated, interaction.user_id) async def _update_with_llm(self, profile, interaction) -> UserProfile: system_prompt = self._prompt_store.load(_USER_PROFILE_PROMPT) user_prompt = f""" Текущий профиль: {profile.model_dump_json()} Интеракция: - Интент: {interaction.intent} - Сообщение пользователя: "{interaction.user_message}" - Ответ ассистента: "{interaction.model_reply}" """ raw = await self._llm.ainvoke([ SystemMessage(content=system_prompt), HumanMessage(content=user_prompt), ]) try: return UserProfile(**json.loads(raw.content)) except Exception as e: self._logger.error("Error updating user profile", exc_info=e) return profile