from django.db import models from integrations.models.base import BaseIntegration, IntegrationType from django.core.exceptions import ValidationError from integrations.fields import EncryptedCharField def validate_temperature(value): """Валидатор для температуры, принимает значения от 0 до 1""" if value < 0 or value > 1: raise ValidationError('Температура должна быть в диапазоне 0.0-1.0') # Список доступных моделей GLM (включая бесплатные) GLM_MODEL_CHOICES = [ ('glm-4', 'GLM-4 (Платная, дешевле)'), ('glm-4.7', 'GLM-4.7 (Платная)'), ('charglm-3', 'ChargLM-3 (Платная)'), ('glm-4.6v', 'GLM-4.6V (Бесплатная)'), ('glm-4.5v', 'GLM-4.5V (Бесплатная)'), ('glm-4.5-air', 'GLM-4.5-Air (Бесплатная)'), ('glm-4.5-flash', 'GLM-4.5-Flash (Бесплатная)'), ('glm-4.5-flashx', 'GLM-4.5-FlashX (Бесплатная)'), ] class AIIntegration(BaseIntegration): """ Базовая модель для интеграций с ИИ-сервисами """ class Meta: abstract = True class GLMIntegration(AIIntegration): """ Интеграция с GLM от Z.AI """ integration_type = IntegrationType.AI_SERVICE api_key = EncryptedCharField( max_length=500, blank=True, verbose_name="API ключ", help_text="Ключ для доступа к API GLM от Z.AI (шифруется в БД)" ) api_url = models.URLField( max_length=500, default="https://api.z.ai/api/paas/v4", verbose_name="URL API", help_text="URL для обращения к API GLM (обычно https://api.z.ai/api/paas/v4)" ) model_name = models.CharField( max_length=100, default="glm-4", choices=GLM_MODEL_CHOICES, verbose_name="Название модели", help_text="Название используемой модели GLM (например, glm-4.7, glm-4)" ) temperature = models.FloatField( default=0.7, validators=[validate_temperature], verbose_name="Температура", help_text="Параметр температуры для генерации (0.0-1.0)" ) is_coding_endpoint = models.BooleanField( default=False, verbose_name="Использовать эндпоинт для кодинга", help_text="Отметьте, если используете специальный эндпоинт для задач программирования" ) class Meta: verbose_name = "Интеграция GLM" verbose_name_plural = "Интеграции GLM" @property def is_configured(self) -> bool: return bool(self.api_key) def clean(self): super().clean() if self.temperature < 0 or self.temperature > 1: raise ValidationError({'temperature': 'Температура должна быть в диапазоне 0.0-1.0'}) # Всегда используем общий эндпоинт self.api_url = "https://api.z.ai/api/paas/v4"