Files
New-planet-api/new-planet-backend/app/services/chat_service.py
2025-12-13 14:39:50 +03:00

108 lines
4.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import uuid
import json
from typing import Optional, List, Dict, Any
from sqlalchemy.ext.asyncio import AsyncSession
from app.services.gigachat_service import gigachat_service
from app.services.cache_service import cache_service
from app.models.ai_conversation import AIConversation
from app.schemas.ai import ChatRequest, ChatResponse
from app.core.config import settings
# Персона "Планета Земля"
EARTH_PERSONA = """Ты планета Земля - анимированный персонаж и друг детей с расстройством аутистического спектра (РАС).
Твоя личность:
- Добрая, терпеливая, понимающая
- Говоришь простым языком
- Используешь эмодзи 🌍✨
- Поощряешь любые достижения
- Даешь четкие инструкции
Особенности общения:
- Короткие предложения
- Избегай сложных метафор
- Подтверждай понимание
- Задавай уточняющие вопросы
- Будь позитивным и поддерживающим"""
class ChatService:
async def chat(
self,
db: AsyncSession,
user_id: str,
request: ChatRequest
) -> ChatResponse:
"""Обработка чата с ИИ-агентом"""
# Получить или создать conversation_id
conversation_id = request.conversation_id or str(uuid.uuid4())
# Загрузить контекст из кэша
context = await cache_service.get_conversation_context(conversation_id)
# Добавить персону в начало, если контекст пустой
if not context:
context.append({
"role": "system",
"content": EARTH_PERSONA
})
# Добавить сообщение пользователя
context.append({
"role": "user",
"content": request.message
})
# Отправить запрос в GigaChat
try:
result = await gigachat_service.chat(
message=request.message,
context=context[:-1], # Без последнего сообщения (оно добавится автоматически)
model=settings.GIGACHAT_MODEL_CHAT
)
# Извлечь ответ
choices = result.get("choices", [])
if not choices:
raise Exception("No response from GigaChat")
response_text = choices[0].get("message", {}).get("content", "")
tokens_used = result.get("usage", {}).get("total_tokens")
model_used = result.get("model")
# Добавить ответ в контекст
context.append({
"role": "assistant",
"content": response_text
})
# Сохранить контекст в кэш
await cache_service.save_conversation_context(conversation_id, context)
# Сохранить в БД
conversation = AIConversation(
user_id=user_id,
conversation_id=conversation_id,
message=request.message,
response=response_text,
tokens_used=tokens_used,
model=model_used,
context=context
)
db.add(conversation)
await db.commit()
return ChatResponse(
response=response_text,
conversation_id=conversation_id,
tokens_used=tokens_used,
model=model_used
)
except Exception as e:
raise Exception(f"Chat service error: {str(e)}")
chat_service = ChatService()