feat(integrations): add dynamic OpenRouter model loading

- Remove hardcoded OPENROUTER_MODEL_CHOICES from openrouter.py
- Add API endpoint /integrations/openrouter/models/ to fetch models dynamically
- Models loaded from OpenRouter API with free models (':free') at top
- Update OpenRouterIntegration model_name field (remove choices, blank=True)
- Add async buildForm() with dynamic_choices support
- Show asterisks (********) for saved API keys with helpful placeholder

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-23 18:16:12 +03:00
parent 3aac83474b
commit 5ec5ee48d4
5 changed files with 173 additions and 57 deletions

View File

@@ -10,14 +10,6 @@ def validate_temperature(value):
raise ValidationError('Температура должна быть в диапазоне 0.0-2.0')
# Список доступных моделей OpenRouter (бесплатные)
OPENROUTER_MODEL_CHOICES = [
('xiaomi/mimo-v2-flash:free', 'Xiaomi MIMO v2 Flash (Бесплатная)'),
('mistralai/devstral-2512:free', 'Mistral Devstral 2512 (Бесплатная)'),
('z-ai/glm-4.5-air:free', 'Z.AI GLM-4.5 Air (Бесплатная)'),
('qwen/qwen3-coder:free', 'Qwen 3 Coder (Бесплатная)'),
]
# Предустановленные значения температуры
OPENROUTER_TEMPERATURE_CHOICES = [
(0.1, '0.1 - Очень консервативно'),
@@ -59,11 +51,11 @@ class OpenRouterIntegration(AIIntegration):
)
model_name = models.CharField(
max_length=100,
default="xiaomi/mimo-v2-flash:free",
choices=OPENROUTER_MODEL_CHOICES,
max_length=200,
default="",
blank=True,
verbose_name="Название модели",
help_text="Название используемой модели OpenRouter"
help_text="Название используемой модели OpenRouter (загружается автоматически)"
)
temperature = models.FloatField(