Добавление интеграции OpenRouter AI
This commit is contained in:
165
myproject/integrations/services/ai_services/config.py
Normal file
165
myproject/integrations/services/ai_services/config.py
Normal file
@@ -0,0 +1,165 @@
|
||||
from dataclasses import dataclass
|
||||
from typing import Optional
|
||||
from django.conf import settings
|
||||
import os
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@dataclass
|
||||
class AIConfig:
|
||||
"""
|
||||
Конфигурация для интеграции с ИИ-сервисами
|
||||
"""
|
||||
api_key: str
|
||||
api_url: str
|
||||
model_name: str
|
||||
temperature: float
|
||||
is_coding_endpoint: bool = False
|
||||
max_tokens: int = 1000
|
||||
timeout: int = 30
|
||||
|
||||
@classmethod
|
||||
def from_integration_model(cls, integration_model):
|
||||
"""
|
||||
Создать конфигурацию из модели интеграции
|
||||
"""
|
||||
logger.info(f"=== Создание конфигурации из модели интеграции ===")
|
||||
logger.info(f"Тип модели: {type(integration_model)}")
|
||||
logger.info(f"Атрибуты модели: {dir(integration_model)}")
|
||||
|
||||
try:
|
||||
api_key = integration_model.api_key
|
||||
logger.info(f"API key (первые 10 символов): {api_key[:10] if api_key else 'None'}...")
|
||||
except AttributeError as e:
|
||||
logger.error(f"Ошибка при получении api_key: {str(e)}")
|
||||
raise
|
||||
|
||||
# Всегда используем общий эндпоинт
|
||||
api_url = "https://api.z.ai/api/paas/v4"
|
||||
logger.info(f"Используем общий endpoint: {api_url}")
|
||||
|
||||
try:
|
||||
model_name = integration_model.model_name
|
||||
logger.info(f"Model name: {model_name}")
|
||||
except AttributeError as e:
|
||||
logger.error(f"Ошибка при получении model_name: {str(e)}")
|
||||
raise
|
||||
|
||||
try:
|
||||
temperature = float(integration_model.temperature)
|
||||
logger.info(f"Temperature: {temperature}")
|
||||
except AttributeError as e:
|
||||
logger.error(f"Ошибка при получении temperature: {str(e)}")
|
||||
raise
|
||||
|
||||
return cls(
|
||||
api_key=api_key,
|
||||
api_url=api_url,
|
||||
model_name=model_name,
|
||||
temperature=temperature,
|
||||
is_coding_endpoint=False, # Всегда False, так как используем общий endpoint
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def from_env(cls):
|
||||
"""
|
||||
Создать конфигурацию из переменных окружения
|
||||
"""
|
||||
return cls(
|
||||
api_key=os.getenv('ZAI_API_KEY', ''),
|
||||
api_url=os.getenv('ZAI_API_URL', 'https://api.z.ai/api/paas/v4'),
|
||||
model_name=os.getenv('ZAI_MODEL_NAME', 'glm-4.7'),
|
||||
temperature=float(os.getenv('ZAI_TEMPERATURE', '0.7')),
|
||||
is_coding_endpoint=os.getenv('ZAI_CODING_ENDPOINT', 'false').lower() == 'true',
|
||||
)
|
||||
|
||||
|
||||
def get_glm_config(integration_model=None):
|
||||
"""
|
||||
Получить конфигурацию GLM из модели интеграции или из .env
|
||||
"""
|
||||
if integration_model:
|
||||
return AIConfig.from_integration_model(integration_model)
|
||||
else:
|
||||
return AIConfig.from_env()
|
||||
|
||||
|
||||
@dataclass
|
||||
class OpenRouterConfig:
|
||||
"""
|
||||
Конфигурация для интеграции с OpenRouter
|
||||
"""
|
||||
api_key: str
|
||||
api_url: str
|
||||
model_name: str
|
||||
temperature: float
|
||||
max_tokens: int = 1000
|
||||
timeout: int = 30
|
||||
|
||||
@classmethod
|
||||
def from_integration_model(cls, integration_model):
|
||||
"""
|
||||
Создать конфигурацию из модели интеграции
|
||||
"""
|
||||
logger.info(f"=== Создание конфигурации OpenRouter из модели интеграции ===")
|
||||
logger.info(f"Тип модели: {type(integration_model)}")
|
||||
|
||||
try:
|
||||
api_key = integration_model.api_key
|
||||
logger.info(f"API key (первые 10 символов): {api_key[:10] if api_key else 'None'}...")
|
||||
except AttributeError as e:
|
||||
logger.error(f"Ошибка при получении api_key: {str(e)}")
|
||||
raise
|
||||
|
||||
api_url = getattr(integration_model, 'api_url', 'https://openrouter.ai/api/v1')
|
||||
logger.info(f"API URL: {api_url}")
|
||||
|
||||
try:
|
||||
model_name = integration_model.model_name
|
||||
logger.info(f"Model name: {model_name}")
|
||||
except AttributeError as e:
|
||||
logger.error(f"Ошибка при получении model_name: {str(e)}")
|
||||
raise
|
||||
|
||||
try:
|
||||
temperature = float(integration_model.temperature)
|
||||
logger.info(f"Temperature: {temperature}")
|
||||
except AttributeError as e:
|
||||
logger.error(f"Ошибка при получении temperature: {str(e)}")
|
||||
raise
|
||||
|
||||
max_tokens = getattr(integration_model, 'max_tokens', 1000)
|
||||
logger.info(f"Max tokens: {max_tokens}")
|
||||
|
||||
return cls(
|
||||
api_key=api_key,
|
||||
api_url=api_url,
|
||||
model_name=model_name,
|
||||
temperature=temperature,
|
||||
max_tokens=max_tokens,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def from_env(cls):
|
||||
"""
|
||||
Создать конфигурацию из переменных окружения
|
||||
"""
|
||||
return cls(
|
||||
api_key=os.getenv('OPENROUTER_API_KEY', ''),
|
||||
api_url=os.getenv('OPENROUTER_API_URL', 'https://openrouter.ai/api/v1'),
|
||||
model_name=os.getenv('OPENROUTER_MODEL_NAME', 'xiaomi/mimo-v2-flash:free'),
|
||||
temperature=float(os.getenv('OPENROUTER_TEMPERATURE', '0.7')),
|
||||
max_tokens=int(os.getenv('OPENROUTER_MAX_TOKENS', '1000')),
|
||||
)
|
||||
|
||||
|
||||
def get_openrouter_config(integration_model=None):
|
||||
"""
|
||||
Получить конфигурацию OpenRouter из модели интеграции или из .env
|
||||
"""
|
||||
if integration_model:
|
||||
return OpenRouterConfig.from_integration_model(integration_model)
|
||||
else:
|
||||
return OpenRouterConfig.from_env()
|
||||
Reference in New Issue
Block a user