Added code samples for AI-Agents

This commit is contained in:
2025-12-17 20:22:46 +03:00
parent d66aed35d6
commit 0885618b25
29 changed files with 2007 additions and 0 deletions

39
models/__init__.py Normal file
View File

@@ -0,0 +1,39 @@
"""Модели данных для AI-агентов."""
from models.conversation import (
ChatRequest,
ChatResponse,
ConversationCreate,
ConversationResponse,
Message,
)
from models.gigachat_types import (
GigaChatChoice,
GigaChatMessage,
GigaChatRequest,
GigaChatResponse,
GigaChatTokenResponse,
GigaChatUsage,
)
from models.schedule import Schedule, ScheduleGenerateRequest, Task
from models.task import TaskCreate, TaskResponse, TaskUpdate
__all__ = [
"Schedule",
"ScheduleGenerateRequest",
"Task",
"TaskCreate",
"TaskUpdate",
"TaskResponse",
"ChatRequest",
"ChatResponse",
"ConversationCreate",
"ConversationResponse",
"Message",
"GigaChatMessage",
"GigaChatRequest",
"GigaChatResponse",
"GigaChatTokenResponse",
"GigaChatUsage",
"GigaChatChoice",
]

50
models/conversation.py Normal file
View File

@@ -0,0 +1,50 @@
"""Pydantic модели для диалогов с ИИ."""
from datetime import datetime
from typing import List, Optional
from uuid import UUID
from pydantic import BaseModel, Field
class Message(BaseModel):
"""Модель сообщения в диалоге."""
role: str = Field(..., description="Роль: system, user, assistant")
content: str = Field(..., description="Текст сообщения")
timestamp: Optional[datetime] = None
class ConversationCreate(BaseModel):
"""Модель для создания диалога."""
user_id: UUID
title: Optional[str] = None
class ConversationResponse(BaseModel):
"""Модель ответа с диалогом."""
id: UUID
user_id: UUID
title: Optional[str]
messages: List[Message] = Field(default_factory=list)
created_at: datetime
updated_at: datetime
class ChatRequest(BaseModel):
"""Запрос на отправку сообщения в чат."""
message: str = Field(..., min_length=1, max_length=2000)
conversation_id: Optional[UUID] = None
user_id: UUID
class ChatResponse(BaseModel):
"""Ответ от ИИ-агента."""
response: str
conversation_id: UUID
tokens_used: Optional[int] = None
model: Optional[str] = None

58
models/gigachat_types.py Normal file
View File

@@ -0,0 +1,58 @@
"""Типы для работы с GigaChat API."""
from typing import List, Literal, Optional
from pydantic import BaseModel, Field
class GigaChatMessage(BaseModel):
"""Сообщение для GigaChat API."""
role: Literal["system", "user", "assistant"]
content: str
class GigaChatRequest(BaseModel):
"""Запрос к GigaChat API."""
model: str = Field(default="GigaChat-2", description="Модель GigaChat")
messages: List[GigaChatMessage] = Field(..., description="История сообщений")
temperature: float = Field(default=0.7, ge=0.0, le=2.0)
max_tokens: int = Field(default=2000, ge=1, le=8192)
top_p: float = Field(default=0.9, ge=0.0, le=1.0)
stream: bool = Field(default=False)
class GigaChatChoice(BaseModel):
"""Вариант ответа от GigaChat."""
message: GigaChatMessage
index: int
finish_reason: Optional[str] = None
class GigaChatUsage(BaseModel):
"""Использование токенов."""
prompt_tokens: int
completion_tokens: int
total_tokens: int
class GigaChatResponse(BaseModel):
"""Ответ от GigaChat API."""
id: str
object: str
created: int
model: str
choices: List[GigaChatChoice]
usage: GigaChatUsage
class GigaChatTokenResponse(BaseModel):
"""Ответ на запрос токена."""
access_token: str
expires_at: int
token_type: str = "Bearer"

40
models/schedule.py Normal file
View File

@@ -0,0 +1,40 @@
"""Pydantic модели для расписаний."""
from datetime import date
from typing import List, Optional
from uuid import UUID
from pydantic import BaseModel, Field
class Task(BaseModel):
"""Модель задания в расписании."""
id: Optional[UUID] = None
title: str = Field(..., description="Название задания")
description: Optional[str] = Field(None, description="Подробное описание")
duration_minutes: int = Field(..., ge=1, description="Длительность в минутах")
category: str = Field(..., description="Категория задания")
image_url: Optional[str] = Field(None, description="URL изображения")
completed: bool = Field(default=False, description="Выполнено ли задание")
order: int = Field(default=0, description="Порядок в расписании")
class Schedule(BaseModel):
"""Модель расписания."""
id: Optional[UUID] = None
title: str = Field(..., description="Название расписания")
date: date = Field(..., description="Дата расписания")
tasks: List[Task] = Field(default_factory=list, description="Список заданий")
user_id: Optional[UUID] = None
created_at: Optional[str] = None
class ScheduleGenerateRequest(BaseModel):
"""Запрос на генерацию расписания."""
child_age: int = Field(..., ge=1, le=18, description="Возраст ребенка")
preferences: List[str] = Field(default_factory=list, description="Предпочтения ребенка")
date: date = Field(..., description="Дата расписания")
existing_tasks: Optional[List[str]] = Field(None, description="Существующие задания для учета")

45
models/task.py Normal file
View File

@@ -0,0 +1,45 @@
"""Pydantic модели для заданий."""
from datetime import datetime
from typing import Optional
from uuid import UUID
from pydantic import BaseModel, Field
class TaskCreate(BaseModel):
"""Модель для создания задания."""
title: str = Field(..., min_length=1, max_length=255)
description: Optional[str] = None
duration_minutes: int = Field(..., ge=1, le=480)
category: str = Field(..., description="Категория: утренняя_рутина, обучение, игра, отдых, вечерняя_рутина")
image_url: Optional[str] = None
order: int = Field(default=0, ge=0)
class TaskUpdate(BaseModel):
"""Модель для обновления задания."""
title: Optional[str] = Field(None, min_length=1, max_length=255)
description: Optional[str] = None
duration_minutes: Optional[int] = Field(None, ge=1, le=480)
category: Optional[str] = None
image_url: Optional[str] = None
completed: Optional[bool] = None
order: Optional[int] = Field(None, ge=0)
class TaskResponse(BaseModel):
"""Модель ответа с заданием."""
id: UUID
title: str
description: Optional[str]
duration_minutes: int
category: str
image_url: Optional[str]
completed: bool
order: int
schedule_id: UUID
created_at: datetime