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 до 2""" if value < 0 or value > 2: raise ValidationError('Температура должна быть в диапазоне 0.0-2.0') # Предустановленные значения температуры OPENROUTER_TEMPERATURE_CHOICES = [ (0.1, '0.1 - Очень консервативно'), (0.3, '0.3 - Консервативно'), (0.5, '0.5 - Умеренно'), (0.7, '0.7 - Баланс (по умолчанию)'), (1.0, '1.0 - Креативно'), (1.5, '1.5 - Очень креативно'), (2.0, '2.0 - Максимальная креативность'), ] class AIIntegration(BaseIntegration): """ Базовая модель для интеграций с ИИ-сервисами """ class Meta: abstract = True class OpenRouterIntegration(AIIntegration): """ Интеграция с OpenRouter.ai """ integration_type = IntegrationType.AI_SERVICE api_key = EncryptedCharField( max_length=500, blank=True, verbose_name="API ключ", help_text="Ключ для доступа к API OpenRouter (шифруется в БД)" ) api_url = models.URLField( max_length=500, default="https://openrouter.ai/api/v1", verbose_name="URL API", help_text="URL для обращения к API OpenRouter (обычно https://openrouter.ai/api/v1)" ) model_name = models.CharField( max_length=200, default="", blank=True, verbose_name="Название модели", help_text="Название используемой модели OpenRouter (загружается автоматически)" ) temperature = models.FloatField( default=0.7, choices=OPENROUTER_TEMPERATURE_CHOICES, validators=[validate_temperature], verbose_name="Температура", help_text="Параметр температуры для генерации (0.0-2.0)" ) max_tokens = models.IntegerField( default=1000, verbose_name="Макс. токенов", help_text="Максимальное количество токенов в ответе" ) class Meta: verbose_name = "Интеграция OpenRouter" verbose_name_plural = "Интеграции OpenRouter" @property def is_configured(self) -> bool: return bool(self.api_key) def clean(self): super().clean() if self.temperature < 0 or self.temperature > 2: raise ValidationError({'temperature': 'Температура должна быть в диапазоне 0.0-2.0'})