192 lines
6.8 KiB
Python
192 lines
6.8 KiB
Python
|
|
"""
|
|||
|
|
Конфигурация LLM провайдеров
|
|||
|
|
Поддержка: OpenAI, OpenRouter, Ollama
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import os
|
|||
|
|
from typing import Dict, Optional
|
|||
|
|
|
|||
|
|
# ==================== ПРОВАЙДЕРЫ ====================
|
|||
|
|
|
|||
|
|
# OpenAI (через прокси)
|
|||
|
|
OPENAI_CONFIG = {
|
|||
|
|
'provider': 'openai',
|
|||
|
|
'api_key': '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',
|
|||
|
|
'api_base': 'https://api.openai.com/v1',
|
|||
|
|
'proxy': 'http://195.133.66.13:3128',
|
|||
|
|
|
|||
|
|
# Доступные модели
|
|||
|
|
'models': {
|
|||
|
|
'fast': 'gpt-4o-mini', # Быстрая и дешёвая
|
|||
|
|
'smart': 'gpt-4o', # Умная, дорогая
|
|||
|
|
'chat': 'gpt-4o-mini', # Для чата
|
|||
|
|
'analysis': 'gpt-4o-mini', # Для анализа
|
|||
|
|
'turbo': 'gpt-4-turbo', # Средняя по скорости/качеству
|
|||
|
|
'vision': 'gpt-4o',
|
|||
|
|
'big': 'gpt-4.1-mini', # Для анализа изображений
|
|||
|
|
'embedding': 'text-embedding-3-small' # Для эмбеддингов
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
# Параметры по умолчанию
|
|||
|
|
'default_params': {
|
|||
|
|
'temperature': 0.3,
|
|||
|
|
'max_tokens': 800,
|
|||
|
|
'top_p': 1.0
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# OpenRouter (альтернатива с кучей моделей)
|
|||
|
|
OPENROUTER_CONFIG = {
|
|||
|
|
'provider': 'openrouter',
|
|||
|
|
'api_key': os.getenv('OPENROUTER_API_KEY', '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'),
|
|||
|
|
'api_base': 'https://openrouter.ai/api/v1',
|
|||
|
|
'proxy': 'http://195.133.66.13:3128',
|
|||
|
|
|
|||
|
|
'models': {
|
|||
|
|
'fast': 'anthropic/claude-3-haiku',
|
|||
|
|
'smart': 'anthropic/claude-3.5-sonnet',
|
|||
|
|
'chat': 'anthropic/claude-3-haiku',
|
|||
|
|
'analysis': 'anthropic/claude-3.5-sonnet',
|
|||
|
|
'cheap': 'google/gemini-flash-1.5'
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
'default_params': {
|
|||
|
|
'temperature': 0.3,
|
|||
|
|
'max_tokens': 1000
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Ollama (локальная модель)
|
|||
|
|
OLLAMA_CONFIG = {
|
|||
|
|
'provider': 'ollama',
|
|||
|
|
'api_base': 'http://localhost:11434',
|
|||
|
|
'proxy': None, # Локальная - прокси не нужен
|
|||
|
|
|
|||
|
|
'models': {
|
|||
|
|
'fast': 'llama3.2',
|
|||
|
|
'smart': 'llama3.1:70b',
|
|||
|
|
'chat': 'llama3.2',
|
|||
|
|
'analysis': 'qwen2.5:14b',
|
|||
|
|
'russian': 'saiga_llama3' # Для русского языка
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
'default_params': {
|
|||
|
|
'temperature': 0.3,
|
|||
|
|
'num_predict': 800
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# ==================== АКТИВНЫЙ ПРОВАЙДЕР ====================
|
|||
|
|
|
|||
|
|
# Выбираем провайдера (меняйте здесь!)
|
|||
|
|
ACTIVE_PROVIDER = os.getenv('LLM_PROVIDER', 'openai') # 'openai', 'openrouter', 'ollama'
|
|||
|
|
|
|||
|
|
# Выбираем конфигурацию
|
|||
|
|
if ACTIVE_PROVIDER == 'openai':
|
|||
|
|
CURRENT_CONFIG = OPENAI_CONFIG
|
|||
|
|
elif ACTIVE_PROVIDER == 'openrouter':
|
|||
|
|
CURRENT_CONFIG = OPENROUTER_CONFIG
|
|||
|
|
elif ACTIVE_PROVIDER == 'ollama':
|
|||
|
|
CURRENT_CONFIG = OLLAMA_CONFIG
|
|||
|
|
else:
|
|||
|
|
raise ValueError(f"Unknown provider: {ACTIVE_PROVIDER}")
|
|||
|
|
|
|||
|
|
# ==================== НАСТРОЙКИ МОДЕЛЕЙ ====================
|
|||
|
|
|
|||
|
|
# Модель для чата (меняйте здесь для экспериментов!)
|
|||
|
|
CHAT_MODEL = os.getenv('CHAT_MODEL', CURRENT_CONFIG['models']['chat'])
|
|||
|
|
|
|||
|
|
# Модель для анализа/аудита
|
|||
|
|
ANALYSIS_MODEL = os.getenv('ANALYSIS_MODEL', CURRENT_CONFIG['models']['analysis'])
|
|||
|
|
|
|||
|
|
# Модель для эмбеддингов
|
|||
|
|
EMBEDDING_MODEL = CURRENT_CONFIG['models'].get('embedding', 'text-embedding-3-small')
|
|||
|
|
|
|||
|
|
# ==================== ПАРАМЕТРЫ ====================
|
|||
|
|
|
|||
|
|
# Температура (0.0 = детерминированно, 1.0 = креативно)
|
|||
|
|
TEMPERATURE = float(os.getenv('LLM_TEMPERATURE', CURRENT_CONFIG['default_params']['temperature']))
|
|||
|
|
|
|||
|
|
# Максимум токенов в ответе
|
|||
|
|
MAX_TOKENS = int(os.getenv('LLM_MAX_TOKENS', CURRENT_CONFIG['default_params']['max_tokens']))
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ==================== ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ====================
|
|||
|
|
|
|||
|
|
def get_model_info() -> Dict:
|
|||
|
|
"""Получить информацию о текущей модели"""
|
|||
|
|
return {
|
|||
|
|
'provider': ACTIVE_PROVIDER,
|
|||
|
|
'chat_model': CHAT_MODEL,
|
|||
|
|
'analysis_model': ANALYSIS_MODEL,
|
|||
|
|
'embedding_model': EMBEDDING_MODEL,
|
|||
|
|
'temperature': TEMPERATURE,
|
|||
|
|
'max_tokens': MAX_TOKENS,
|
|||
|
|
'api_base': CURRENT_CONFIG['api_base'],
|
|||
|
|
'uses_proxy': CURRENT_CONFIG.get('proxy') is not None
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_available_models() -> Dict:
|
|||
|
|
"""Получить список доступных моделей"""
|
|||
|
|
return CURRENT_CONFIG['models']
|
|||
|
|
|
|||
|
|
|
|||
|
|
def switch_model(model_type: str, model_name: str):
|
|||
|
|
"""Переключить модель (для runtime изменений)"""
|
|||
|
|
global CHAT_MODEL, ANALYSIS_MODEL
|
|||
|
|
|
|||
|
|
if model_type == 'chat':
|
|||
|
|
CHAT_MODEL = model_name
|
|||
|
|
elif model_type == 'analysis':
|
|||
|
|
ANALYSIS_MODEL = model_name
|
|||
|
|
else:
|
|||
|
|
raise ValueError(f"Unknown model type: {model_type}")
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ==================== КАК ИСПОЛЬЗОВАТЬ ====================
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
import json
|
|||
|
|
|
|||
|
|
print("=" * 70)
|
|||
|
|
print("🤖 КОНФИГУРАЦИЯ LLM МОДЕЛЕЙ")
|
|||
|
|
print("=" * 70)
|
|||
|
|
|
|||
|
|
info = get_model_info()
|
|||
|
|
print(f"\n📊 ТЕКУЩИЕ НАСТРОЙКИ:")
|
|||
|
|
print(f" Провайдер: {info['provider'].upper()}")
|
|||
|
|
print(f" Чат: {info['chat_model']}")
|
|||
|
|
print(f" Анализ: {info['analysis_model']}")
|
|||
|
|
print(f" Эмбеддинги: {info['embedding_model']}")
|
|||
|
|
print(f" Temperature: {info['temperature']}")
|
|||
|
|
print(f" Max tokens: {info['max_tokens']}")
|
|||
|
|
print(f" API: {info['api_base']}")
|
|||
|
|
print(f" Прокси: {'✅ Да' if info['uses_proxy'] else '❌ Нет'}")
|
|||
|
|
|
|||
|
|
print(f"\n🎯 ДОСТУПНЫЕ МОДЕЛИ ({info['provider'].upper()}):")
|
|||
|
|
for key, model in get_available_models().items():
|
|||
|
|
print(f" {key:15} → {model}")
|
|||
|
|
|
|||
|
|
print(f"\n💡 КАК ИЗМЕНИТЬ:")
|
|||
|
|
print(f" 1. В коде: измените ACTIVE_PROVIDER = 'openai'/'openrouter'/'ollama'")
|
|||
|
|
print(f" 2. Через ENV: export LLM_PROVIDER=ollama")
|
|||
|
|
print(f" 3. Модель чата: export CHAT_MODEL=gpt-4o")
|
|||
|
|
print(f" 4. Temperature: export LLM_TEMPERATURE=0.7")
|
|||
|
|
|
|||
|
|
print(f"\n📋 ПРИМЕРЫ:")
|
|||
|
|
print(f" # OpenAI GPT-4o-mini (по умолчанию)")
|
|||
|
|
print(f" export LLM_PROVIDER=openai")
|
|||
|
|
print(f" export CHAT_MODEL=gpt-4o-mini")
|
|||
|
|
|
|||
|
|
print(f"\n # OpenRouter с Claude")
|
|||
|
|
print(f" export LLM_PROVIDER=openrouter")
|
|||
|
|
print(f" export CHAT_MODEL=anthropic/claude-3-haiku")
|
|||
|
|
|
|||
|
|
print(f"\n # Локальная Ollama")
|
|||
|
|
print(f" export LLM_PROVIDER=ollama")
|
|||
|
|
print(f" export CHAT_MODEL=llama3.2")
|
|||
|
|
|
|||
|
|
print("=" * 70)
|
|||
|
|
|