Files
hotels/add_model.py
Фёдор 0cf3297290 Проект аудита отелей: основные скрипты и документация
- Краулеры: smart_crawler.py, regional_crawler.py
- Аудит: audit_orel_to_excel.py, audit_chukotka_to_excel.py
- РКН проверка: check_rkn_registry.py, recheck_unclear_rkn.py
- Отчёты: create_orel_horizontal_report.py
- Обработка: process_all_hotels_embeddings.py
- Документация: README.md, DB_SCHEMA_REFERENCE.md
2025-10-16 10:52:09 +03:00

245 lines
8.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
Скрипт для добавления новых LLM моделей
"""
import requests
import json
from typing import Dict, List
# Конфигурация
API_BASE = "http://localhost:8888"
def add_model_to_config(model_name: str, model_id: str, description: str = ""):
"""
Добавить модель в конфигурацию llm_config.py
Args:
model_name: Человекочитаемое имя (например, 'fast', 'smart')
model_id: ID модели в API (например, 'gpt-4o-mini')
description: Описание модели
"""
config_file = "/root/engine/public_oversight/hotels/llm_config.py"
# Читаем текущий конфиг
with open(config_file, 'r', encoding='utf-8') as f:
content = f.read()
# Находим секцию models и добавляем новую модель
if "'models': {" in content:
# Ищем место для вставки
models_start = content.find("'models': {")
models_end = content.find("},", models_start) + 2
# Формируем новую строку
new_model_line = f" '{model_name}': '{model_id}', # {description}\n"
# Вставляем перед закрывающей скобкой
new_content = content[:models_end-2] + new_model_line + content[models_end-2:]
# Записываем обратно
with open(config_file, 'w', encoding='utf-8') as f:
f.write(new_content)
print(f"✅ Модель '{model_name}' добавлена в конфиг")
return True
else:
print("Не найдена секция models в конфиге")
return False
def test_model(model_id: str) -> Dict:
"""
Протестировать модель
Args:
model_id: ID модели для тестирования
Returns:
Результат теста
"""
# Переключаемся на модель
switch_response = requests.post(
f"{API_BASE}/api/llm/switch",
json={"model": model_id}
)
if switch_response.status_code != 200:
return {"error": f"Ошибка переключения: {switch_response.status_code}"}
# Тестируем модель
test_prompt = "Сколько отелей в Чукотском автономном округе?"
start_time = requests.utils.time.time()
chat_response = requests.post(
f"{API_BASE}/api/chat",
json={"message": test_prompt}
)
end_time = requests.utils.time.time()
if chat_response.status_code == 200:
data = chat_response.json()
return {
"model": model_id,
"response_time": round((end_time - start_time) * 1000, 2),
"response_length": len(data['response']),
"response_preview": data['response'][:200] + "...",
"success": True
}
else:
return {"error": f"Ошибка чата: {chat_response.status_code}"}
def list_available_models() -> List[str]:
"""Получить список доступных моделей"""
response = requests.get(f"{API_BASE}/api/llm/models")
if response.status_code == 200:
data = response.json()
return list(data['models'].values())
else:
return []
def add_custom_model():
"""Интерактивное добавление модели"""
print("=" * 60)
print("🤖 ДОБАВЛЕНИЕ НОВОЙ LLM МОДЕЛИ")
print("=" * 60)
# Получаем информацию о модели
model_name = input("Введите имя модели (например, 'custom'): ").strip()
model_id = input("Введите ID модели (например, 'gpt-4o-mini'): ").strip()
description = input("Введите описание (опционально): ").strip()
if not model_name or not model_id:
print("❌ Имя и ID модели обязательны!")
return
print(f"\n📋 Добавляем модель:")
print(f" Имя: {model_name}")
print(f" ID: {model_id}")
print(f" Описание: {description}")
confirm = input("\nПродолжить? (y/N): ").strip().lower()
if confirm != 'y':
print("❌ Отменено")
return
# Добавляем в конфиг
if add_model_to_config(model_name, model_id, description):
print(f"\n🧪 Тестируем модель {model_id}...")
# Тестируем
result = test_model(model_id)
if result.get('success'):
print(f"✅ Модель работает!")
print(f" Время ответа: {result['response_time']}ms")
print(f" Длина ответа: {result['response_length']} символов")
print(f" Превью: {result['response_preview']}")
else:
print(f"❌ Ошибка тестирования: {result.get('error')}")
print(f"\n🔄 Перезапустите веб-интерфейс для применения изменений:")
print(f" pkill -f web_interface.py")
print(f" cd /root/engine/public_oversight/hotels")
print(f" source venv/bin/activate")
print(f" python web_interface.py &")
def quick_add_popular_models():
"""Быстрое добавление популярных моделей"""
popular_models = [
("gpt35", "gpt-3.5-turbo", "GPT-3.5 Turbo (классика)"),
("gpt4v", "gpt-4-vision-preview", "GPT-4 Vision (анализ изображений)"),
("claude", "claude-3-haiku", "Claude 3 Haiku (через OpenRouter)"),
("gemini", "gemini-pro", "Gemini Pro (через OpenRouter)"),
]
print("🚀 Быстрое добавление популярных моделей:")
for i, (name, model_id, desc) in enumerate(popular_models, 1):
print(f"{i}. {desc}")
choice = input("\nВыберите номер модели (1-4) или 0 для выхода: ").strip()
try:
choice_idx = int(choice) - 1
if 0 <= choice_idx < len(popular_models):
name, model_id, desc = popular_models[choice_idx]
add_model_to_config(name, model_id, desc)
print(f"✅ Модель {desc} добавлена!")
else:
print("❌ Неверный выбор")
except ValueError:
print("❌ Введите число")
if __name__ == "__main__":
import sys
if len(sys.argv) > 1:
command = sys.argv[1]
if command == "list":
print("📋 Доступные модели:")
models = list_available_models()
for model in models:
print(f" - {model}")
elif command == "test":
if len(sys.argv) > 2:
model_id = sys.argv[2]
print(f"🧪 Тестируем модель: {model_id}")
result = test_model(model_id)
print(json.dumps(result, indent=2, ensure_ascii=False))
else:
print("❌ Укажите ID модели для тестирования")
elif command == "add":
if len(sys.argv) > 3:
name, model_id = sys.argv[2], sys.argv[3]
description = sys.argv[4] if len(sys.argv) > 4 else ""
add_model_to_config(name, model_id, description)
else:
print("❌ Использование: python add_model.py add <name> <model_id> [description]")
else:
print("❌ Неизвестная команда")
else:
# Интерактивный режим
print("🤖 УПРАВЛЕНИЕ LLM МОДЕЛЯМИ")
print("1. Добавить модель вручную")
print("2. Быстрое добавление популярных моделей")
print("3. Список доступных моделей")
print("4. Тест модели")
choice = input("\nВыберите действие (1-4): ").strip()
if choice == "1":
add_custom_model()
elif choice == "2":
quick_add_popular_models()
elif choice == "3":
models = list_available_models()
print("📋 Доступные модели:")
for model in models:
print(f" - {model}")
elif choice == "4":
model_id = input("Введите ID модели для тестирования: ").strip()
if model_id:
result = test_model(model_id)
print(json.dumps(result, indent=2, ensure_ascii=False))
else:
print("❌ Неверный выбор")