Update environment variables, Docker configuration, and dependencies; refactor token management and chat agent logic. Added FastAPI server setup and improved message handling in GigaChat client.
This commit is contained in:
@@ -21,7 +21,7 @@ class ChatAgent:
|
||||
user_id: UUID,
|
||||
message: str,
|
||||
conversation_id: Optional[str] = None,
|
||||
model: str = "GigaChat-2-Lite",
|
||||
model: str = "GigaChat-2",
|
||||
) -> tuple[str, int]:
|
||||
"""
|
||||
Отправить сообщение и получить ответ.
|
||||
@@ -39,22 +39,25 @@ class ChatAgent:
|
||||
context_messages = []
|
||||
if conversation_id:
|
||||
cached_context = await self.cache.get_context(str(conversation_id))
|
||||
# Фильтруем системные сообщения из кэша - они не должны там храниться
|
||||
context_messages = [
|
||||
GigaChatMessage(role=msg["role"], content=msg["content"])
|
||||
for msg in cached_context
|
||||
if msg["role"] != "system"
|
||||
]
|
||||
|
||||
# Добавляем системный промпт в начало
|
||||
# Системное сообщение ВСЕГДА должно быть первым
|
||||
system_message = GigaChatMessage(role="system", content=EARTH_PERSONA)
|
||||
if not context_messages or context_messages[0].role != "system":
|
||||
context_messages.insert(0, system_message)
|
||||
# Убеждаемся, что системное сообщение первое (удаляем все системные сообщения и добавляем одно в начало)
|
||||
context_messages = [msg for msg in context_messages if msg.role != "system"]
|
||||
context_messages.insert(0, system_message)
|
||||
|
||||
# Добавляем текущее сообщение пользователя
|
||||
context_messages.append(GigaChatMessage(role="user", content=message))
|
||||
|
||||
# Отправляем запрос
|
||||
# Отправляем запрос (не передаем message отдельно, т.к. оно уже в context_messages)
|
||||
response = await self.gigachat.chat_with_response(
|
||||
message=message,
|
||||
message="", # Пустое, т.к. сообщение уже добавлено в context_messages
|
||||
context=context_messages,
|
||||
model=model,
|
||||
temperature=0.7,
|
||||
@@ -76,7 +79,7 @@ class ChatAgent:
|
||||
user_id: UUID,
|
||||
message: str,
|
||||
context: Optional[List[dict]] = None,
|
||||
model: str = "GigaChat-2-Lite",
|
||||
model: str = "GigaChat-2",
|
||||
) -> tuple[str, int]:
|
||||
"""
|
||||
Отправить сообщение с явным контекстом.
|
||||
@@ -100,8 +103,9 @@ class ChatAgent:
|
||||
|
||||
context_messages.append(GigaChatMessage(role="user", content=message))
|
||||
|
||||
# Отправляем запрос (не передаем message отдельно, т.к. оно уже в context_messages)
|
||||
response = await self.gigachat.chat_with_response(
|
||||
message=message,
|
||||
message="", # Пустое, т.к. сообщение уже добавлено в context_messages
|
||||
context=context_messages,
|
||||
model=model,
|
||||
temperature=0.7,
|
||||
|
||||
@@ -23,7 +23,8 @@ class GigaChatClient:
|
||||
async def _get_session(self) -> aiohttp.ClientSession:
|
||||
"""Получить HTTP сессию (lazy initialization)."""
|
||||
if self._session is None or self._session.closed:
|
||||
self._session = aiohttp.ClientSession()
|
||||
connector = aiohttp.TCPConnector(ssl=False)
|
||||
self._session = aiohttp.ClientSession(connector=connector)
|
||||
return self._session
|
||||
|
||||
async def chat(
|
||||
@@ -73,7 +74,7 @@ class GigaChatClient:
|
||||
|
||||
Args:
|
||||
message: Текст сообщения
|
||||
context: История сообщений
|
||||
context: История сообщений (уже должна содержать системное сообщение первым)
|
||||
model: Модель GigaChat
|
||||
temperature: Температура генерации
|
||||
max_tokens: Максимальное количество токенов
|
||||
@@ -81,8 +82,22 @@ class GigaChatClient:
|
||||
Returns:
|
||||
Полный ответ от API
|
||||
"""
|
||||
messages = context or []
|
||||
messages.append(GigaChatMessage(role="user", content=message))
|
||||
# Создаем копию списка, чтобы не изменять оригинал
|
||||
messages = list(context) if context else []
|
||||
|
||||
# Убеждаемся, что системное сообщение первое
|
||||
system_messages = [msg for msg in messages if msg.role == "system"]
|
||||
non_system_messages = [msg for msg in messages if msg.role != "system"]
|
||||
|
||||
# Если есть системные сообщения, берем первое, иначе оставляем список пустым
|
||||
if system_messages:
|
||||
messages = [system_messages[0]] + non_system_messages
|
||||
else:
|
||||
messages = non_system_messages
|
||||
|
||||
# Добавляем текущее сообщение пользователя только если его еще нет в конце
|
||||
if not messages or messages[-1].role != "user" or messages[-1].content != message:
|
||||
messages.append(GigaChatMessage(role="user", content=message))
|
||||
|
||||
request = GigaChatRequest(
|
||||
model=model,
|
||||
|
||||
Reference in New Issue
Block a user